OpenCV_basis

OpenCV_base

图片
加载图片:cv2.imread(‘图片文件名’,1彩色图/0灰度图/-1包含透明通道的彩色图)#图片若不在py文件中,则需要绝对路径,且不含中文。

在这里插入图片描述

在这里插入图片描述
根据图片大小自适应串口,显示图片:cv2.imshow(‘窗口名’,已加载的参数名)

#如果需要在已经打开的窗口显示图片,窗口名需一致

程序暂停(ms):cv2.waitKey(time)#0表示等待,等待期间也可以获取用户的按键输入

创建一个窗口:cv2.namedWindow(1,2) #1窗口的名字,2默认是cv2.WINDOW_AUTOSIZE,表示窗口大小自适应图片,也可以设置为cv2.WINDOW_NORMAL,表示窗口大小可调整

保存图片:cv2.imwrite(1,2) #1是包含后缀名的文件名,2为已加载的参数名 #在参数1中,写上路径,教程中是没有写,但是我搜索电脑之后发现没有这个文件,在添加路径之后就可以了
在这里插入图片描述

摄像头

打开摄像头:cv2.VideoCapture(0)创建VideoCapture对象 #0指摄像头的编号,如果你电脑上有两个摄像头的话,访问第2个摄像头就可以传入1,依此类推 #如将数字改成路径,则是播放视频。
获取一帧:ret,frame = capture.read() #由于获取是一帧一帧的,因此需要在循环中不断获取帧 #返回值ret为布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵

等待键盘输入:
cv2.waitKey(1),waitKey()方法本身表示等待键盘输入,
#参数是1,表示延时1ms切换到下一帧图像,对于视频而言;参数为0,如cv2.waitKey(0)只显示当前帧图像,相当于视频暂停,;参数过大如cv2.waitKey(1000),会因为延时过久而卡顿感觉到卡顿。
c得到的是键盘输入的ASCII码,esc键对应的ASCII码是27,即当按esc键是if条件句成立
在这里插入图片描述

转换颜色:cv2.cvtColor(图,颜色),这里将彩色图转成灰度图。
另外,通过cap.get(propId)可以获取摄像头的一些属性,比如捕获的分辨率,亮度和对比度等。propId是从0~18的数字,代表不同的属性,完整的属性列表可以参考:VideoCaptureProperties。也可以使用cap.set(propId,value)来修改属性值。
判断是否正常打开:capture.isOpened() #返回的是布尔值
在这里插入图片描述
#30表示停留时间,越大,播放越慢。

录制视频1
创建对象 cv2.VideoWriter(1#输出的文件名,如’output.avi’, 2 #编码方式FourCC码, 3 #帧率FPS, 4 #要保存的分辨率大小) #录制或保存视频

FourCC是用来指定视频编码方式的四字节码,所有的编码可参考Video Codecs。如MJPG编码可以这样写: cv2.VideoWriter_fourcc(*‘MJPG’) 或 cv2.VideoWriter_fourcc(‘M’,‘J’,‘P’,‘G’)

#流程: 打开摄像头,创建VideoWriter对象,传入参数,在循环中:读帧,写帧

图像基本操作

1.获取和修改像素点值:(此法只改变了内存中的img像素点,因为没有保存,所以原图无改变)
①读入图片 ②获取像素点值 px = (读入的图片)(y,x)#行列分别对应y,x #只获取蓝色通道值,px_blue = (读入的图片)[y,x,0] #0蓝色 B 1绿色 G 2红色 R
③img[100, 90] = [255, 255, 255] #改变这个像素点的B G R
⭐性能更好的方式:获取:img.item(100,100,0),修改:img.itemset((100,100,0),255) #但这种方式只能B,G,R逐一进行。(选择这个点的基色,修改属性)
2.获取图像的形状:对象名.shape #返回一个包含行数(高度)、列数(宽度)和通道数的元组,灰度图只返回行数和列数

3.获取图片数据类型:对象名.dtype #经验之谈:多数错误是因为数据类型不对导致的,所以健壮的代码应该对这个属性加以判断

4.获取图像总像素数:对象名.size
5.ROI(Region of Interest) #如我们要检测眼睛,因为眼睛肯定在脸上,所以我们感兴趣的只有脸这部分,其他都不care,所以可以单独把脸截取出来,这样就可以大大节省计算量,提高运行速度

6.通道分隔与合并:彩色图的BGR三个通道是可以分开单独访问的,也可以将单独的三个通道合并成一副图像。分别使用cv2.split()和cv2.merge():

split()比较耗时,用numpy中的索引跟高效

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
颜色空间转换

1.函数:cv2.cvtColor(), cv2.inRange() #cv2.cvtColor()用来进行颜色模型转换,参数1是要转换的图片,参数2是转换模式, COLOR_BGR2GRAY表示BGR→Gray,可用下面的代码显示所有的转换模式:
2.视频中特定颜色物体追踪(HSV模型)#OpenCV中色调H范围为[0,179],饱和度S是[0,255],明度V是[0,255]。虽然H的理论数值是0°~360°,但8位图像像素点的最大值是255,所以OpenCV中除以了2,某些软件可能使用不同的尺度表示,所以同其他软件混用时,记得归一化。
步骤:
1.捕获视频的一帧 #capture.read()
2.从BGR转换到HSV #cv2.cvtColor()
3.提取蓝色范围的物体# cv2.inRange():介于lower/upper之间的为白色,其余黑色
4.只显示蓝色物体 #cv2.bitwise_and
#蓝色光范围获取:先将标准蓝色的BGR值用cvtColor()转换:
根据此调节范围

总结:获取视频中每个像素点的BGR数值,转换成HSV数值,插入红蓝绿的HSV范围,与视频的HSV比较,如果在范围里面,则判断为是红蓝黄,如果是,则写入数组中,即,最终获得的是数组,如果需同时显示三色,则将三个数组相加即可,最后再保留所需颜色即可。
在这里插入图片描述

#颜色转换其实是数学运算,如灰度化最常用的是:gray=R0.299+G0.587+B*0.114
在这里插入图片描述
阈值分割(像素点值大于某一阈值转换为一类,小于则另一类)

  1. ret, th = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) #参数1:要处理的原图,一般是灰度图 参数2:设定的阈值 参数3:最大阈值,一般为255 参数4:阈值的方式,主要有5种,详情:ThresholdTypes
  2. 自适应阈值(对于阴暗分布不均匀的图片):
    在这里插入图片描述
    cv2.adaptiveThreshold( img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 4)
    ‘’’
    参数1:要处理的原图
    参数2:最大阈值,一般为255
    参数3:小区域阈值的计算方式
    o ADAPTIVE_THRESH_MEAN_C:小区域内取均值
    o ADAPTIVE_THRESH_GAUSSIAN_C:小区域内加权求和,权重是个高斯核
    参数4:阈值方式(跟前面讲的那5种相同)
    参数5:小区域的面积,如11就是11*11的小块 #越大越精细 效率?
    参数6:最终阈值等于小区域计算出的阈值再减去此值 #试验:为0时会很多小点,为个位数时能去除黑点,过大清除图片(全白)
    ‘’’

#在前面固定阈值中,我们是随便选了一个阈值如127,那如何知道我们选的这个阈值效果好不好呢?答案是:不断尝试,所以这种方法在很多文献中都被称为经验阈值。Otsu阈值法就提供了一种自动高效的二值化方法,不过我们直方图还没学,这里暂时略过。

图形几何变换

缩放就是调整图片的大小,使用cv2.resize()函数实现缩放。可以按照比例缩放,也可以按照指定的大小缩放:
import cv2
img = cv2.imread(‘drawing.jpg’)

按照指定的宽度、高度缩放图片

res = cv2.resize(img, (132, 150))

按照比例缩放,如x,y轴均放大一倍

res2 = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_LINEAR)
cv2.imshow(‘shrink’, res), cv2.imshow(‘zoom’, res2)
cv2.waitKey(0)
我们也可以指定缩放方法interpolation,更专业点叫插值方法,默认是INTER_LINEAR,

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值