文章目录
- 声明
- 正文
- 1.明确任务
- 2.需要用到的函数
- 3.完整代码
- 4.另外
- 感谢观看!
声明
声明:本系列博客是我在学习OpenCV官方教程中文版(For Python)(段力辉 译)所做的笔记。所以,其中的绝大部分内容引自这本书,博客中的代码也是其配套所附带的代码或书中的代码,侵删。其中部分代码可能会因需要而改动。在本系列博客中,其中包含书中的引用,也包括我自己对知识的理解,思考和总结。本系列博客的目的主要有两个,一个是可以作为我自己的学习笔记,时常复习巩固。第二个是可以为想学习python下的opencv 3 相关知识的朋友提供一些参考。
正文
1.明确任务
利用opencv知识,通过摄像头录像,实时提取带有某个特定颜色的物体,从而实现物体跟踪。
2.需要用到的函数
- cv2.VideoCapture(0)
这个函数用来捕获视频,VideoCapture()中参数是0,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频。,记得最后要用cap.release()来关闭摄像头。 - ret,frame=cap.read()
cap.read()按帧读取视频,ret,frame是cap.read()方法的两个返回值。其中ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵。 - cv2.cvtColor(image,flag)
这个函数是一个颜色空间转换函数,flag代表转换方式。 - cv2.inRange()
括号里有三个参数,依次是hsv,lower,upper,第一个参数:hsv指的是原图,第二个参数:lower指的是图像中低于这个lower的值,图像值变为0,第三个参数:upperd指的是图像中高于这个upper_red的值,图像值变为0,而在lower~upper之间的值变成255。 - cv2.bitwise_and()
bitwise_and()是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0
3.完整代码
import cv2
import numpy as np
cap=cv2.VideoCapture(0)
while(1):
# 获取每一帧
ret,frame=cap.read()
# 转换到 HSV
hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
# 设定颜色的阈值
lower_red=np.array([0,43,46])
upper_red=np.array([10,255,255])
# 根据阈值构建掩模
mask=cv2.inRange(hsv,lower_red,upper_red)
# 对原图像和掩模进行位运算
res=cv2.bitwise_and(frame,frame,mask=mask)
# 显示图像
cv2.imshow('frame',frame)
cv2.imshow('mask',mask)
cv2.imshow('res',res)
k=cv2.waitKey(5)&0xFF
if k==27:
break
cap.release() #关闭摄像头
# 关闭窗口
cv2.destroyAllWindows()
运行结果:
(当时截图时没截好,所以原始图片与前两张不一样)
4.另外
怎样找到要跟踪对象的 HSV 值?
只需要以下代码就可以轻松获得你需要的HSV值:
import cv2
import numpy as np
#假设我们想得到绿色的HSV值
green=np.uint8([[[0,255,0]]])#注意:是RGB,而不是BGR,还有这里是三层括号
hsv_green=cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print(hsv_green)
运行结果:
[[[ 60 255 255]]]
得到这个值后,现在你可以分别用 [H-100,100,100] 和 [H+100,255,255] 做上下阈值。
感谢观看!
如有错误,欢迎批评指正!