用颜色特征跟踪视频中的物体
问题背景和基本思路

这里模拟提取图片中的手机壳。
发现手机壳有一个显著的特征,就是颜色基本都是蓝色。
所以这里尝试把”蓝色“区域提取出来,然后绘制一个长方形包络这个蓝色区域。
核心代码
蓝色是一个广义的概念,对应到RGB中,其实是一个范围,设定蓝色的范围:
# 设置蓝色的上下界,即蓝色的范围
blueLower = np.array([100,67,0],dtype = "uint8")
blueUpper = np.array([255,128,50],dtype = "uint8")
找出属于蓝色区间的区域:
# 找出图片中的蓝色区域,返回的其实是一个蒙版
blue = cv2.inRange(frame,blueLower,blueUpper)
这个blue实际上是一个蒙版

对提取出来的轮廓,按照面积进行排序
# 找出面积最大的轮廓,按照面积逆序排列
cnt = sorted(cnts,key=cv2.contourArea,reverse=True)[0]
寻找包含轮廓的最小长方形,并绘制轮廓
# 寻找能包络蓝色区域的最小长方形
rect = np.int32(cv2.boxPoints(cv2.minAreaRect(cnt)))
# 用绿色线条绘制
cv2.drawContours(frame,[rect],-1,(0,255,0),2)
完整代码和运行效果
import cv2
import numpy as np
# 设置蓝色的上下界,即蓝色的范围
blueLower = np.array([100,67,0],dtype = "uint8")
blueUpper = np.array([255,128,50],dtype = "uint8")
# 加载视频
videoPath = "video/iphonecase.mov"
video = cv2.VideoCapture(videoPath)
# 对每一帧进行遍历
while True:
# 抓取视频帧
(grabbed,frame) = video.read()
# 当处理完最后一帧之后,退出循环
if not grabbed:
break
# 找出图片中的蓝色区域,返回的其实是一个蒙版
blue = cv2.inRange(frame,blueLower,blueUpper)
# 对蓝色区域所在的蒙版进行高斯模糊处理
blue = cv2.GaussianBlur(blue,(3,3),0)
# 查找蒙版区域的边界
(cnts,_) = cv2.findContours(blue.copy(),cv2.RETR_EXTERNAL,\
cv2.CHAIN_APPROX_SIMPLE)
# 如果找到了轮廓,即发现了蓝色区域
if len(cnts)>0:
# 找出面积最大的轮廓,按照面积逆序排列
cnt = sorted(cnts,key=cv2.contourArea,reverse=True)[0]
# 寻找能包络蓝色区域的最小长方形
rect = np.int32(cv2.boxPoints(cv2.minAreaRect(cnt)))
# 用绿色线条绘制
cv2.drawContours(frame,[rect],-1,(0,255,0),2)
cv2.imshow("tracking",frame)
cv2.imshow("binary",blue)
# 图片尺寸不一致,不能放在一起显示
# cv2.imshow("tracking results", np.hstack([blue, frame]))
cv2.waitKey(20)
video.release()
cv2.destroyAllWindows()
最终运行效果:

5615



被折叠的 条评论
为什么被折叠?



