当前位置: 首页 > article >正文

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)


http://www.kler.cn/a/162037.html

相关文章:

  • 【秋招笔试-支持在线评测】11.13花子秋招(已改编)-三语言题解
  • 如何查看电脑关机时间
  • Unity资源打包Addressable资源保存在项目中
  • void * 指针与整数进行加减运算
  • 微信小程序_模板与配置_day2
  • ExecStart=/usr/bin/mongod --config /etc/mongod.conf (code=exited, status=2)
  • python pandas dataframe常用数据处理总结
  • macOS 获取文件夹大小
  • 【学习记录】从0开始的Linux学习之旅——字符型设备驱动及应用
  • 常用性能工具与性能分析
  • 05 JQuery基础入门
  • 时间序列预测实战(二十二)TCN-LSTM实现单元和多元长期预测(专为新手编写的自研架构)
  • Qt实现右键菜单
  • Java研学-Lambda表达式
  • Python函数默认参数设置
  • C语言验证哥德巴赫猜想
  • AttributeError: module ‘importlib_resources‘ has no attribute ‘path‘ 解决方案
  • cpu 300% 爆满 内存占用不高 排查
  • 【AIGC】prompt工程从入门到精通
  • 专业130+总分400+云南大学通信847专业基础综考研经验(原专业课827)
  • 获取拼多多京东淘宝商品数据店铺数据店铺信息最推荐最好用的一种方式就是API接口
  • HTTPS加密协议:保护你的网络安全
  • ArcGIS Pro中怎么设置标注换行
  • yum源不起作用_yum无法安装程序_Linux默认源替换---Linux工作笔记067
  • YOLOv7独家最新改进《全网无重复》感知聚合SERDetect检测头:高效涨点,即插即用|检测头新颖改进
  • type property can‘t be changed 报错问题解决