opencv-python基础

一.opencv-python简述

其使用Numpy,所有OpenCV数组结构都转换为Numpy数组,是一个高度优化的数据库操作库。

二.环境安装

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python

三.基本概念

- 像素是图像的基本单元,每个像素存储着图像的颜色、亮度和其他特征。

- 数字图像利用0/1编码记录信息,opencv中常用的是8位图像,大多数彩色和灰度图像使用8位(uint8)表示每个通道的像素值,范围从0到255,其中 最黑,1(255) 最白。

- 几乎所有颜色都可以通过RGB三原色按照不同比例调配而成。

四.图像存储

- 彩色图像:三维数组

- 灰度图像:二维数组(矩阵)

- 在OpenCV中,默认情况下,彩色图像是以BGR蓝-绿-红)顺序存储

- 形状(Shape):

图像的尺寸由其高(h)、宽(w)和通道数(c)决定。可以通过 img.shape 属性获取(h,w,c)。

  - 彩色图像,返回一个包含三个值的元组 (height, width, channels)。

  - 灰度图像,返回一个包含两个值的元组 (height, width),因为其只有一个通道。

- 数据类型(dtype):图像中的每个像素值的数据类型决定了可以存储的最大值。例如,8位无符号整数(uint8)允许的范围是从0到255。

  - 单通道(灰度图像):每个像素由一个数值表示,代表该点的亮度。值越低越暗,值越高越亮。

五.图像基本操作

5.1 创建窗体(窗口)

cv2.namedWindow(winname  [,窗口属性])

参数:

- winname:窗口名

- 窗口属性:窗口大小是否可调整

    - cv2.WINDOW_AUTOSIZE :默认,窗口会根据加载的图像自动调整到合适的大小,并且用户不能拖动窗口边缘来调整窗口大小。

    - cv2.WINDOW_NORMAL :窗口大小是可调整的,用户可以通过鼠标拖动窗口边缘来自由改变窗口大小。

import cv2 as cv
import numpy as np# 创建窗体
cv.namedWindow("win1",cv.WINDOW_AUTOSIZE)
cv.imshow("win2",cv.WINDOW_NORMAL)

运行后会出现两块窗口,暂时不管。

5.2 读取图像

cv2.imread(path  [,读取方式])

  参数:

  - filename:图像路径

  - 读取方式:彩色·默认、灰色等

# 读取方式为灰色
img = cv.imread("../images/cat1.png", cv.IMREAD_GRAYSCALE)

继续往下

5.3 图像显示

cv2.imshow(winname,img)

参数:

- winname:显示图像的窗口名,以字符串类型表示

- img:要显示的图像

cv.imshow("win1",img)
cv.imshow("win2",img)# cv.waitKey(n):n>0,意味着程序将等待n毫秒。
cv.waitKey(0)# cv2.destroyAllWindows(winname):会在当前程序执行到该语句时立即销毁打开的窗口,并释放与这些窗口相关的资源。
# 默认关闭所有
cv.destroyAllWindows()

5.4 保存图像

cv2.imwrite(path,img)

参数:

- path:图片保存的路径和图片名

- img:要保存的图像

cv.imwrite('output.jpg', img)

5.5 创建黑色图像

使用 np.zeros() 创建全黑图像,再修改像素值(255)成为全白图像。

numpy.zeros((height,width,channels),dtype=np. uint8)

import cv2 as cv
import numpy as npw = 480
h = 640# c = 1 的时候就是灰度图像,单通道,但是为二维图像
c = 3b = np.zeros((h,w,c),dtype=np.uint8)
cv.imshow("black",b)cv.waitKey(0)
cv.destroyAllWindows()

# 更改为白色图像
# 利用数组切片更改值
b[:,:,:] = 255cv.imshow('white',b)
cv.waitKey(0)
cv.destroyAllWindows()

# 随机像素值图像b[:,:,:] = np.random.randint(0,256,(h,w,c))cv.imshow('random',b)
cv.waitKey(0)
cv.destroyAllWindows()

5.6 图像裁剪(切片)

img[y:y+h,x:x+w]

提取的是从 (x,y) 开始,高度为 h,宽度为 w 的矩形区域

import cv2 as cv
import numpy as npf = cv.imread('../images/cat1.png')y = 200
x = 200
h = 400
w = 400s = f[y:y+h,x:x+w]
cv.imshow('s',s)
cv.waitKey(0)
cv.destroyAllWindows()

5.7 调整大小

cv2.resize(img,dsize,dts)

- img:输入图像,通常是二维或三位NumPy数组。

- dsize:输出图像的尺寸,是一个二元组 (w,h)

- dst:缩放后的图像

import cv2 as cv
import numpy as np
f = cv.imread('../images/cat1.png')s = cv.resize(f, (100,100))
cv.imshow('s', s)
cv.waitKey(0)
cv.destroyAllWindows()

六.图像绘制

6.1 直线

cv2.line(img,start,end,color,thickness)

参数:

  - img:要绘制直线的图像

  - startend:直线的起点和终点,都是两个元组(坐标)

  - color:直线的颜色,对于彩色图像,使用 BGR 格式(b,g,r)指定颜色

  - thickness:线条粗细,值越大越宽

  - 隐藏参数,cv2.LINE_AA ,表示使用抗锯齿算法绘制图像,这在每个绘制函数中都隐式存在,默认为 cv2.LINE_8

import cv2 as cvimg = cv.imread('../images/cat1.png')# 画一条直线,起点终点分别指定,同时为蓝色
cv.line(img,(100,100),(200,200),(255,0,0),3)
cv.imshow('image',img)
cv.waitKey(0)
cv.destroyAllWindows()

6.2 圆形

cv2.circle(img,centerpoint,r,color,thickness)

参数:

  - img:要绘制圆形的图片

  - centerpointr:圆心和半径

  - color:线条颜色

  - tnickness:线条宽度,为-1时生成闭合图案并填充颜色

import cv2 as cvimg = cv.imread('../images/cat1.png')cv.circle(img, (100, 100), 50, (255, 0, 0), -1)
cv.imshow('img', img)
cv.waitKey(0)
cv.destroyAllWindows()

6.3 绘制矩形

cv2.rectangle(img,leftupper,rightdown,color,thickness)

参数:

  - img:要绘制矩形的图像

  - leftupperrightdown:矩形的左上角和右下角坐标

  - color:线条的颜色

  - thickness:线条的宽度

import cv2 as cvimg = cv.imread('../images/cat1.png')cv.rectangle(img, (100, 100), (300, 300), (0, 255, 0), 2)
cv.imshow('img', img)
cv.waitKey(0)
cv.destroyAllWindows()

6.4 绘制文本(向图片中添加文字)

cv2.putText(img,text,station,font,Fontscale,color,thickness,cv2.LINE_AA)

参数:

  - img:要添加文字的图像

  - text:要写入的文本数据(此处是不能加中文的,会显示问号(?),matplotlib可以显示中文)

  - station:文本的放置位置

  - font:字体样式

  - Fontscale:字体大小

  - thickness:字体线条宽度

  - cv2.LINE_AA :使用反走样技术绘制文本边框

import cv2 as cvimg = cv.imread('../images/cat1.png')cv.putText(img, 'Hello World', (50, 50), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
cv.imshow('Image', img)
cv.waitKey(0)
cv.destroyAllWindows()

6.5 读取视频

cap = cv2.VideoCapture(path)

- path : 为0代表从默认摄像头捕获视频流

ret,frame = cap.read()

- 得到一个布尔值和一帧图像,布尔值表示是否成功读取到帧,如果为False,可能是因为视频结束或读取失败,如果为True,frame则是当前帧的图像数据。

import cv2 as cv# 本地视频
cap = cv.VideoCapture('../video/arknights_run.mp4')# 循环获取视频每一帧
while True:ret, frame = cap.read()# 考虑视频最后一帧为空,跳出循环if not ret:breakcv.imshow('frame', frame)# 0xFF把键盘敲入的键转换为ASCII码if cv.waitKey(40) & 0xFF == ord('q'):breakcap.release()
cv.destroyAllWindows()
# 获取摄像头
cap = cv.VideoCapture(0)
while True:# 读取摄像头ret, frame = cap.read()# 显示cv.imshow('frame', frame)# 按q键退出if cv.waitKey(1) & 0xFF == ord('q'):break
# 释放摄像头
cap.release()
# 释放窗口
cv.destroyAllWindows()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ReentrantLock 实现公平锁和非公平锁的原理!

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗! 🌟了解 ThreadLocal请看: ThreadLocal有趣讲解,小白也能听懂&#xff…

NLP高频面试题(四十一)——什么是 IA3 微调?

随着大型语言模型的广泛应用,如何高效地将这些模型适配到特定任务中,成为了研究和工程实践中的重要课题。IA3(Infused Adapter by Adding and Adjusting)微调技术,作为参数高效微调的一种新颖方法,提供了在保持模型性能的同时,显著减少可训练参数数量的解决方案。 IA3 …

swift菜鸟教程14(闭包)

一个朴实无华的目录 今日学习内容:1.Swift 闭包1.1闭包定义1.2闭包实例1.3闭包表达式1.3.1sorted 方法:据您提供的用于排序的闭包函数将已知类型数组中的值进行排序。1.3.2参数名称缩写:直接通过$0,$1,$2来顺序调用闭包的参数。1.3.3运算符函…

蓝桥杯-蓝桥幼儿园(Java-并查集)

并查集的核心思想 并查集主要由两个操作构成: Find:查找某个元素所在集合的根节点。并查集的特点是,每个元素都指向它自己的父节点,根节点的父节点指向它自己。查找过程中可以通过路径压缩来加速后续的查找操作,即将路…

ruby内置全局变量

以下是 Ruby 中常见的 内置全局变量 及其用途的详细说明。这些变量以 $ 开头,由 Ruby 解释器自动管理,用于访问系统状态、异常、输入输出等核心信息。 一、异常处理相关 全局变量说明示例$!当前作用域最后抛出的异常对象(等同于 rescue >…

tcp转串口

windows 在 Windows 系统上,可以使用以下成熟的串口转 TCP 工具: HW VSP3 (HW Virtual Serial Port) 提供串口到 TCP/IP 的映射功能。支持虚拟串口和网络通信。下载地址:HW Group com0com com2tcp 开源工具,支持虚拟串口和 TCP…

HTML视频和音频

<video>元素 <video>元素用于在HTML文档中嵌入视频内容。 <video controls><source src"movie.mp4" type"video/mp4"><source src"movie.ogg" type"video/ogg">您的浏览器不支持 HTML5 video 标签。 …

DeepSeek:重构办公效率的AI新范式

目录 一、效率跃迁的三重引擎 二、效率提升的量级突破 三、智能办公的范式转移 四、未来办公的效率奇点 当企业主面对堆积如山的文件审批、跨时区协作的沟通损耗、重复机械的数据整理时&#xff0c;是否想过这些场景正在吞噬团队的生产力&#xff1f;据麦肯锡研究显示&…

redis 延迟双删

Redis延迟双删是一种用于解决缓存与数据库数据一致性问题的策略&#xff0c;通常在高并发场景下使用。以下是其核心内容&#xff1a; 1. 问题背景 当更新数据库时&#xff0c;如果未及时删除或更新缓存&#xff0c;可能导致后续读请求仍从缓存中读取旧数据&#xff0c;造成数…

Python设计模式:策略模式

1. 什么是策略模式 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;将每个算法封装起来&#xff0c;并使它们可以互换。策略模式使得算法的变化独立于使用算法的客户。换句话说&#xff0c;策略模式允许在运…

SpringBoot集成Ollama本地模型

SpringBoot集成Ollama本地模型 目录 项目准备创建Ollama服务客户端创建控制器配置应用属性创建前端界面添加静态资源支持完整项目结构启动应用高级功能扩展部署注意事项性能优化 1. 项目准备 创建一个SpringBoot项目&#xff0c;可以使用Spring Initializr或IDE创建添加必要…

ResNet改进(19):基于PyTorch的ResNet改进方案详解:Mish激活+SPP模块+MixUp数据增强

1. 前言 ResNet作为深度学习领域里程碑式的网络架构,在图像分类等计算机视觉任务中表现出色。然而,随着研究的深入和技术的发展,原始的ResNet架构仍有改进空间。本文将详细介绍一种基于PyTorch的ResNet改进方案,该方案融合了Mish激活函数、SPP模块和MixUp数据增强等先进技…

leetcode68.左右文本对齐

思路源自 leetcode-字符串篇 68题 文本左右对齐 难度高的模拟类型题目&#xff0c;关键点在于事先知道有多少单词要放在本行并且还要知道本行是不是最后一行&#xff08;最后一行需要全部单空格右对齐&#xff0c;不是最后一行就空格均摊&#xff09;&#xff0c;非最后一行的空…

深入理解 Spring 的 MethodParameter 类

MethodParameter 是 Spring 框架中一个非常重要的类&#xff0c;它封装了方法参数&#xff08;或返回类型&#xff09;的元数据信息。这个类在 Spring MVC、AOP、数据绑定等多个模块中都有广泛应用。 核心功能 MethodParameter 主要提供以下功能&#xff1a; 获取参数类型信息…

Qt 5.14.2入门(一)写个Hello Qt!程序

目录 参考链接&#xff1a;一、新建项目二、直接运行三、修改代码增加窗口内容1、Qt 显示一个 QLabel 标签控件窗口2、添加按键 参考链接&#xff1a; Qt5教程&#xff08;一&#xff09;&#xff1a;Hello World 程序 Qt 编程指南 一、新建项目 1、新建一个项目&#xff08…

Spring Boot 3.x 集成 MongoDB 的 默认配置项及默认值,以及 常用需要修改的配置项 的详细说明

以下是 Spring Boot 3.x 集成 MongoDB 的 默认配置项及默认值&#xff0c;以及 常用需要修改的配置项 的详细说明&#xff1a; 一、默认配置项及默认值 Spring Boot 对 MongoDB 的默认配置基于 spring.data.mongodb 前缀&#xff0c;以下是核心配置项&#xff1a; 配置项默认…

【QT】 进程

目录 QT 多进程复习 Linux-C 多进程QProcess 进程类常用方法简单示例信号与槽应用场景 跨平台注意事项技巧&#xff1a;使用宏控制平台命令 QProcess 在嵌入式系统中的使用示例&#xff1a;调用 ALSA 播放音频示例&#xff1a;调用 arecord 录音示例&#xff1a;QProcess Shel…

原子操作(cpp atomic)

目录 一.原子操作 1.原子操作的概念 2.原子变量 二.原子性 1.中间状态描述 2.单处理器单核 3.多处理器或多核的情况下 4.cache&#xff08;高速缓冲器的作用&#xff09; 5.在cpu cache基础上,cpu如何读写数据&#xff1f;&#xff1f;&#xff1f; 6.为什么会有缓存…

Unet网络的Pytorch实现和matlab实现

文章目录 一、Unet网络简介1.1 输入图像1.2 编码器部分&#xff08;Contracting Path&#xff09;1.3 解码器部分&#xff08;Expanding Path&#xff09;1.4 最后一层&#xff08;输出&#xff09;1.5 跳跃连接&#xff08;Skip Connections&#xff09; 二、Unet网络的Pytorc…

记录一次JVM调优过程1

如何通过jmap 诊断&#xff0c;服务运行一段时间后内存使用量飙升的问题 通过 jmap 诊断服务运行一段时间后内存使用量飙升的问题&#xff0c;需结合堆转储分析、对象分布统计及工具链配合。以下是具体操作步骤和关键方法&#xff1a; 一、实时监控与初步分析 获取进程 PID 使…