python学习:opencv学习和numpy学习(持续更新)
目录
cv.imread() 读取图像
cv.imshow() 在窗口中显示图像
cv.imwrite() 保存图像
cv.waitKey() 等待任何键盘事件
release() 释放或关闭图像或视频捕获对象
cv.destroyAllWindows() 销毁所有窗口
cv.destroyAllWindow() 销毁某个窗口
cv.VideoCapture() 打开视频流
isOpened() 判断是否成功打开视频流
cv.VideoWriter_fourcc() 指定视频编解码器
cv.VideoWriter() 保存视频
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)