OpenCV3.0与Python3.6实现特定颜色物体追踪教程
本文详细介绍如何使用OpenCV3.0和Python3.6实现特定颜色物体的实时追踪。通过设置HSV颜色空间阈值生成掩膜,并结合轮廓检测技术,在视频中框选并追踪目标物体。教程涵盖环境配置、阈值设定及具体代码实现,适用于计算机视觉初学者进行颜色识别与追踪开发。
环境配置与开发工具
一、环境
运行环境为Windows 10系统,Python版本为3.6,OpenCV版本为3.x系列;使用的集成开发环境(IDE)为PyCharm 5.0.3。
功能目标概述
二、实现目标
根据用户指定的物体颜色,设定相应的颜色阈值,在视频流中识别并框选需要追踪的目标物体。
具体实现步骤
三、实现步骤
第一步:根据目标物体的颜色特征,设定颜色阈值范围,从而获取该物体的图像掩膜。
参考代码文件:generate_threshold.py
# -*- coding : utf-8 -*-
# Author: Tom Yu
import cv2
import numpy as np
cap = cv2.VideoCapture(0)#获取摄像头图像
# img = cv2.imread("timg1.jpg")
# hsv_img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
def nothing(x):
pass
def createbars():
"""
实现创建六个滑块的作用,分别控制H、S、V的最高值与最低值
"""
cv2.createTrackbar("H_l","image",0,180,nothing)
cv2.createTrackbar("H_h","image",0,180,nothing)
cv2.createTrackbar("S_l","image",0,255,nothing)
cv2.createTrackbar("S_h","image",0,255,nothing)
cv2.createTrackbar("V_l","image",0,255,nothing)
cv2.createTrackbar("V_h","image",0,255,nothing)
cv2.namedWindow("image")
createbars()#创建六个滑块
lower = np.array([0,0,0])#设置初始值
upper = np.array([0,0,0])
while True:
ret,frame = cap.read()
hsv_frame = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)#将图片由BGR颜色空间转化成HSV空间,HSV可以更好地分割颜色图形
lower[0]=cv2.getTrackbarPos("H_l","image")#获取"H_l"滑块的实时值
upper[0]=cv2.getTrackbarPos("H_h","image")#获取"H_h"滑块的实时值
lower[1]=cv2.getTrackbarPos("S_l","image")
upper[1]=cv2.getTrackbarPos("S_h","image")
lower[2]=cv2.getTrackbarPos("V_l","image")
upper[2]=cv2.getTrackbarPos("V_h","image")
mask = cv2.inRange(hsv_frame,lower,upper)#cv2.inrange()函数通过设定的最低、最高阈值获得图像的掩膜
cv2.imshow("img",frame)
cv2.imshow("mask",mask)
if cv2.waitKey(1)&0xff == 27:
break
cv2.destroyAllWindows()
预期效果:成功获取用于追踪的物体颜色阈值参数。

第二步:利用上一步获取的阈值,设定HSV空间的上下限范围,在视频帧中追踪特定颜色的物体,并使用矩形框将目标物体框选出来。
参考代码文件:tracking_object.py
# -*- coding : utf-8 -*-
# Author: Tom Yu
import cv2
import numpy as np
cap = cv2.VideoCapture(0)#获取摄像头视频
while True:
ret,frame = cap.read()#读取每一帧图片
hsv_frame = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)#将每一帧图片转化HSV空间颜色
"""
依据之前的脚本获取的阈值设置最高值与最低值
"""
lower = np.array([0,104,205])
upper = np.array([15,208,255])
mask = cv2.inRange(hsv_frame,lower,upper)
img,conts,hier = cv2.findContours(mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#找出边界
cv2.drawContours(frame,conts,-1,(0,255,0),3)#画出边框
dst = cv2.bitwise_and(frame,frame,mask=mask)#对每一帧进行位与操作,获取追踪图像的颜色
#cv2.imshow("mask",mask)
#cv2.imshow("dst",dst)
cv2.imshow("frame",frame)
if cv2.waitKey(1)&0xff == 27:
break
cv2.destroyAllWindows()
预期效果:

以上即为本文的全部内容,希望对读者的学习有所帮助,也欢迎大家继续支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









