python学习:opencv学习和numpy学习(持续更新)

目录

[cv.imread() 读取图像](#cv.imread() 读取图像)

[cv.imshow() 在窗口中显示图像](#cv.imshow() 在窗口中显示图像)

[cv.imwrite() 保存图像](#cv.imwrite() 保存图像)

[cv.waitKey() 等待任何键盘事件](#cv.waitKey() 等待任何键盘事件)

[release() 释放或关闭图像或视频捕获对象](#release() 释放或关闭图像或视频捕获对象)

[cv.destroyAllWindows() 销毁所有窗口](#cv.destroyAllWindows() 销毁所有窗口)

[cv.destroyAllWindow() 销毁某个窗口](#cv.destroyAllWindow() 销毁某个窗口)

[cv.VideoCapture() 打开视频流](#cv.VideoCapture() 打开视频流)

[isOpened() 判断是否成功打开视频流](#isOpened() 判断是否成功打开视频流)

[cv.VideoWriter_fourcc() 指定视频编解码器](#cv.VideoWriter_fourcc() 指定视频编解码器)

[cv.VideoWriter() 保存视频](#cv.VideoWriter() 保存视频)

[cv.flip() 翻转图像](#cv.flip() 翻转图像)


本文参考链接,所有版本的opencv库讲解都有OpenCV: OpenCV-Python 教程

cv.imread() 读取图像

#图像应位于工作目录中,或者应提供图像的完整路径
#第一个参数是图片名称或者路径
#第二个参数是图片的读取方式
    #cv.IMREAD_COLOR :加载彩色图像。图像的任何透明度都将被忽略。它是默认标志。(1)
    #cv.IMREAD_GRAYSCALE:以灰度模式加载图像(0)
    #cv.IMREAD_UNCHANGED : 加载图像,包括 alpha 通道(-1)
#注意:即使图像路径错误,它也不会抛出任何错误,但会给您print imgNone

# 加载灰度彩色图像
img = cv.imread('messi5.jpg',0)

cv.imshow() 在窗口中显示图像

#窗口会自动适应图像大小
#第一个参数是一个窗口名称,它是一个字符串。第二个论点是我们的形象。您可以根据需要创建任意数量的窗口,但使用不同的窗口名称。

cv.imshow('图像',img)

cv.imwrite() 保存图像

#第一个参数是文件名
#第二个参数是要保存的图像

#将图像以 PNG 格式保存在工作目录中
cv.imwrite('messigray.png',img)

cv.waitKey() 等待任何键盘事件

#是一个键盘绑定函数
#以毫秒为单位的时间
#该函数等待任何键盘事件的指定毫秒。如果在这段时间内按任意键,程序将继续。如果传递 0,它将无限期地等待击键。它还可以设置为检测特定的击键

k = cv.waitKey(0)# 获取按下了什么键
if k == 27: # 等待 ESC 键退出

elif k == ord('s'): # 等待 's' 键保存并退出

等待x毫秒进行下一步
cv.waitKey(x)

release() 释放或关闭图像或视频捕获对象

#如果你使用cv2.VideoCapture()打开一个视频文件,读取其中的帧,并在完成后关闭它,那么你可以使用cap.release()来释放该对象并关闭视频文件。

cap = cv.VideoCapture(0)
cap.release()

cv.destroyAllWindows() 销毁所有窗口

#销毁我们创建的所有窗口
cv.destroyAllWindows()

cv.destroyAllWindow() 销毁某个窗口

#销毁具有给定名称的窗口
cv.destroyWindow(窗口名字)

cv.VideoCapture() 打开视频流

#若要捕获视频,需要创建 VideoCapture 对象
#其参数可以是设备索引,也可以是视频文件的名称
#设备索引只是指定哪个相机的数字。通常会连接一个摄像头(就像我的情况一样)。所以我只是传递 0(或 1)。您可以通过传递 1 来选择第二个相机,依此类推

#获取vtest.avi文件视频流
cap = cv.VideoCapture('vtest.avi')

#获取摄像头视频流
cap = cv.VideoCapture(0)

#获取url里的视频流
cap = cv.VideoCapture(url)

isOpened() 判断是否成功打开视频流

#用于检查 VideoCapture 对象是否成功打开
#返回一个布尔值,如果视频成功打开,返回 True,否则返回 False。

# 打开摄像头  
cap = cv2.VideoCapture(0)  
  
# 检查是否成功打开  
if not cap.isOpened():  
    print("无法打开摄像头")  
    exit()

cv.VideoWriter_fourcc() 指定视频编解码器

#指定视频编解码器的函数
#需要四个字符来唯一地标识编解码器
#fourcc = cv.VideoWriter_fourcc(*'XVID') 这行代码就是创建了一个新的 fourcc,'X'、'V'、'I'、'D' 四个字符分别代表了 XVID 编解码器。

#'X':表示使用的编解码器是否支持跨平台。如果该位置的字符是 'X',则表示编解码器是跨平台的。
#'V':表示编解码器是否支持视频压缩。如果该位置的字符是 'V',则表示编解码器支持视频压缩。
#'I':表示编解码器是否支持图像压缩。如果该位置的字符是 'I',则表示编解码器支持图像压缩。
#'D':表示编解码器的名称。在这个例子中,'D' 表示 XVID 编解码器。

#通过创建 fourcc,我们可以告诉 OpenCV 使用特定的编解码器来写入视频文件。

fourcc = cv.VideoWriter_fourcc(*'XVID')

cv.VideoWriter() 保存视频

#将帧写入视频文件。它需要指定输出视频文件的路径名、编解码器、帧率和每秒写入帧数。

#保存步骤

#捕获摄像头视频,需要创建 VideoCapture 对象
cap = cv.VideoCapture(0)

#要先定义保存的路径和编解码器  
output_path = 'output.mp4'  
fourcc = cv2.VideoWriter_fourcc(*'mp4v')  

# 再创建 VideoWriter 对象 
#30.0:这是帧率,表示每秒要写入视频文件的帧的数量。在这个例子中,帧率为30.0,意味着每秒将写入30帧。
#(640, 480):这是一个元组,表示视频的分辨率。在这个例子中,分辨率为640x480,意味着视频的宽度为640像素,高度为480像素。
out = cv2.VideoWriter(output_path, fourcc, 30.0, (640, 480)) 

#读取想保存的视频
cap = cv2.VideoCapture('input.mp4')  
while(cap.isOpened()):  
    ret, frame = cap.read()  

#然后判断ret是否读取成功,用out.write把frame写入
    if ret==True:  
        out.write(frame)  

#最后记得释放内存
out.release()  
cap.release()  

cv.flip() 翻转图像

#两个参数

#一个是需要翻转的图像

#另一个是一个整数,用于指定翻转的方式。
    # 0 表示垂直翻转,即上下翻转 
    # 1(水平翻转,即左右翻转)
    # -1(同时进行水平和垂直翻转)

frame = cv.flip(frame, 0)#垂直翻转,即上下翻转

np.zeros() 创建一个具有指定形状和数据类型的新数组(黑色图片)

#所有元素初始化为零

#创建一个形状为 (3, 4) 的二维数组
arr = np.zeros((3, 4)) 

#一个形状为 (2, 2) 的二维数组,数据类型为 float32
arr = np.zeros((2, 2), dtype=np.float32)

#一个一维数组,长度为 5
arr = np.zeros(5)  

#一个形状为(512,512,3)的零填充的3通道图像数组
#这个数组将包含512x512像素的图像,每个像素有三个颜色通道(红色,绿色和蓝色)。
#np.uint8指定了数组中每个元素的数据类型是无符号8位整数,范围从0到255。
#简单来说就是一张黑色图片
img = np.zeros((512,512,3), np.uint8)

cv.line() 画线

#指定图像对象、线条的起始点、结束点、线条颜色、线条宽度

#将在图像 img 上从左上角到右下角绘制一条红色的线条,线条宽度为5个像素。
#img:要绘制线条的图像对象。
#(0,0):线条的起始点,即图像的左上角。
#(511,511):线条的结束点,即图像的右下角。
#(255,0,0):线条的颜色,这里是红色。在BGR颜色空间中,红色的分量为(255,0,0)。
#5:线条的宽度,这里是5个像素。
img = np.zeros((512,512,3), np.uint8)
cv.line(img,(0,0),(511,511),(255,0,0),5)

cv.circle() 画矩阵

#指定图像对象、矩形的左上角点、右下角点、矩形颜色、矩形线条宽度等参数。

#在图像 img 上绘制一个左上角点为 (384,0)、右下角点为 (510,128) 的矩形,矩形的颜色为绿色,线条宽度为3个像素。最终呈现出的将是一个绿色的矩形框
mg:要绘制矩形的图像对象。
(384,0):矩形的左上角点坐标。
(510,128):矩形的右下角点坐标。
(0,255,0):矩形的颜色,这里是绿色。在BGR颜色空间中,绿色的分量为(0,255,0)。
3:矩形线条的宽度,这里是3个像素。

cv.rectangle(img,(384,0),(510,128),(0,255,0),3)

cv.rectangle() 画圆形

指定图像对象、圆心坐标、半径、圆形颜色和线条宽度等参数。

在图像 img 上绘制一个圆心为 (447,63)、半径为63、颜色为红色的圆形,并填充整个圆形。
img:要绘制圆形的图像对象。
(447,63):圆心的坐标。
63:半径。
(0,0,255):圆形的颜色,这里是红色。在BGR颜色空间中,红色的分量为(0,0,255)。
-1:线条宽度,这里是-1,表示填充整个圆形。

cv.circle(img,(447,63), 63, (0,0,255), -1)

cv.ellipse() 画椭圆

#绘制一个椭圆形的函数
#函数原型   
#cv.ellipse(img, center, axes, angle, startAngle, endAngle, thickness, color[, lineType, shift])

img:图像
center:中心点坐标
axes:轴的长度
angle:旋转角度
startAngle:起始角度
endAngle:结束角度
thickness:线条的粗细
color:线条颜色,BGR格式
lineType:线条类型,例如8、4、CV_AA等
shift:点坐标中的小数位数

#在图像 img 上绘制一个中心点为 (256,256)、轴的长度为(100,50)、旋转角度为0、起始角度为0、结束角度为180、线条粗细为最大值255、线条类型为默认类型的椭圆形,填充整个椭圆。
img:要绘制椭圆形的图像对象。
(256,256):椭圆的中心点坐标。
(100,50):椭圆的轴的长度。
0:旋转角度。
0:起始角度。
180:结束角度。
255:线条的粗细,这里是最大值,表示最粗的线条。
-1:线条类型,这里是-1,表示默认线条类型。

cv.ellipse(img,(256,256),(100,50),0,0,180,255,-1)

cv.polylines() 绘制折线(多边形)

#指定图像对象、折线的顶点坐标、是否闭合、折线颜色、线条宽度等参数。

在图像 img 上绘制一个由顶点坐标数组 pts 定义的黄色闭合折线
将 pts 数组的形状改变为 (-1,1,2) 是为了让每个顶点坐标成为一个单独的子数组,符合 cv.polylines() 函数的要求。如果不进行这个变形操作,将会出现错误。

img:要绘制折线的图像对象。
pts:包含多个顶点坐标的NumPy数组,每个顶点坐标是一个二元组,表示x和y坐标。这里通过reshape((-1,1,2))将原始数组变形为符合要求的形状。
True:表示折线是闭合的,即最后一个顶点和第一个顶点相连。
(0,255,255):折线的颜色,这里是黄色。在BGR颜色空间中,黄色的分量为(0,255,255)。

pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv.polylines(img,[pts],True,(0,255,255))

如果第三个参数为 False,您将得到连接所有点的折线,而不是闭合形状。

cv.putText() 加文字

#在图像上添加文字

#定义字体类型
font = cv.FONT_HERSHEY_SIMPLEX

#在图像上添加文字
img:你想要添加文字的图像。
'OpenCV':你想要添加的文字。
(10,500):文字开始的坐标,以左上角为原点,x坐标为10,y坐标为500。
font:之前定义的字体。
4:字体大小。
(255,255,255):文字颜色,这里是白色。
2:线条宽度,如果为负数,则函数会自动设置为0。
cv.LINE_AA:线条类型。cv.LINE_AA代表抗锯齿线条类型。

cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)

cv.setMouseCallback() 设置鼠标回调函数

#鼠标回调函数是一个当你点击图像时调用的函数。这个函数可以让你在图像上实现交互,例如选择特定的像素或区域,或者实现图像标注等功能。

#cv2.setMouseCallback(window_name, callback_function)
window_name 是你想要添加鼠标回调的窗口的名称。
callback_function 是你想要在鼠标点击时调用的函数。这个函数应该接受三个参数:x坐标,y坐标,和鼠标事件类型。

def mouse_event(event, x, y, flags, param): 
event: 这是触发鼠标事件的类型。它可以是以下几种类型之一:
cv2.EVENT_MOUSEMOVE: 鼠标移动
cv2.EVENT_LBUTTONDOWN: 鼠标左键按下
cv2.EVENT_RBUTTONDOWN: 鼠标右键按下
cv2.EVENT_MBUTTONDOWN: 鼠标中键按下
cv2.EVENT_LBUTTONUP: 鼠标左键释放
cv2.EVENT_RBUTTONUP: 鼠标右键释放
cv2.EVENT_MBUTTONUP: 鼠标中键释放
cv2.EVENT_LBUTTONDBLCLK: 鼠标左键双击
cv2.EVENT_RBUTTONDBLCLK: 鼠标右键双击
cv2.EVENT_MBUTTONDBLCLK: 鼠标中键双击
cv2.EVENT_FLAGS: 用于检查是否有特殊修饰键(如Ctrl,Shift等)被按下。
x 和 y: 这两个参数表示鼠标事件发生的坐标。例如,如果你点击了图像的某个位置,x 和 y 就会是那个位置的坐标。
flags: 这个参数是一个可选参数,通常用于检查在鼠标事件发生时是否有任何特殊的修饰键(如Ctrl,Shift等)被按下。它可以是以下的一些值:
cv2.EVENT_FLAG_LBUTTON: 左键被按下或释放。
cv2.EVENT_FLAG_RBUTTON: 右键被按下或释放。
cv2.EVENT_FLAG_MBUTTON: 中键被按下或释放。
cv2.EVENT_FLAG_CTRLKEY: Ctrl键被按下。
cv2.EVENT_FLAG_SHIFTKEY: Shift键被按下。
cv2.EVENT_FLAG_ALTKEY: Alt键被按下。
param: 这个参数是一个可选参数,用户可以通过它将额外的数据传递给回调函数。例如,你可以将一个图像或一个窗口的引用传递给这个参数,然后在回调函数中使用它。在大多数情况下,你可能不需要这个参数,可以忽略它。

#点击窗口,然后打印坐标
def mouse_event(event, x, y, flags, param):  
    if event == cv2.EVENT_LBUTTONDOWN:  
        print(f'You clicked at {x},{y}')  

cv2.setMouseCallback('image_window', mouse_event)
相关推荐
零意@3 分钟前
ubuntu切换不同版本的python
windows·python·ubuntu
思忖小下14 分钟前
Python基础学习_01
python
hong16168815 分钟前
跨模态对齐与跨领域学习
学习
q567315231 小时前
在 Bash 中获取 Python 模块变量列
开发语言·python·bash
是萝卜干呀1 小时前
Backend - Python 爬取网页数据并保存在Excel文件中
python·excel·table·xlwt·爬取网页数据
代码欢乐豆1 小时前
数据采集之selenium模拟登录
python·selenium·测试工具
阿伟来咯~1 小时前
记录学习react的一些内容
javascript·学习·react.js
Suckerbin1 小时前
Hms?: 1渗透测试
学习·安全·网络安全
狂奔solar1 小时前
yelp数据集上识别潜在的热门商家
开发语言·python
Tassel_YUE1 小时前
网络自动化04:python实现ACL匹配信息(主机与主机信息)
网络·python·自动化