Python+OpenCV颜⾊识别物体追踪Python+OpenCV颜⾊识别物体追踪
对于颜⾊识别和imutils包的⽤法请浏览我得另⼀篇博客:
⽂章⽬录
个⼈博客原址:
代码原理
这是个⽐较简单的代码。代码实现的就是简单的物体追踪,将物体⽤⽅框框出。
简单来讲就是先进⾏颜⾊识别,正确识别到物体后获取物体的外接矩形再画出外接矩形即可。
详细的解释可以看代码注释,应该是容易理解的。
代码
import cv2
import numpy as np
rectangle函数opencvimport imutils
from imutils import contours
# 颜⾊阈值
lower = np.array([130,62,72])
upper = np.array([170,255,148])
# 内核
kernel = np.ones((5,5), np.uint8)
# 打开摄像头
vc = cv2.VideoCapture(0)
if vc.isOpened():
flag, frame = vc.read()
# 翻转图像
# 这⼀步可以忽略,博主的摄像头是反着的
# 所以加上这句话可以让摄像头的图像正过来
frame = ate(frame,180)
cv2.imshow("frame", frame)
else:
flag =False
while flag:
flag, frame = vc.read()
# 翻转图像
frame = ate(frame,180)
draw_frame = py()
if frame is None:
break
if flag is True:
'''下⾯对摄像头读取到的图像进⾏处理,这个步骤是⽐较重要的'''
# 转换颜⾊空间HSV
frame_hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 颜⾊识别
img = cv2.inRange(frame_hsv, lower, upper)
# 膨胀操作
dilation = cv2.dilate(img, kernel, iterations=1)
# 闭操作
closing = phologyEx(dilation, cv2.MORPH_CLOSE, kernel)
# ⾼斯滤波
closing = cv2.GaussianBlur(closing,(5,5),0)
# 边缘检测
edges = cv2.Canny(closing,10,20)
'''上⾯进⾏那么多操作就是为了得到更好的⽬标图形,具体效果因环境⽽异'''
# 寻轮廓
cnts, _ = cv2.findContours(
edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
# 判断轮廓数量也就是判断是否寻到轮廓,如果没有到轮廓就不继续进⾏操作
if len(cnts)>0:
# 存放轮廓⾯积的列表
s =[]
# 存放最⼤轮廓的索引
max_index =0
# 获得排序后的轮廓列表以及每个轮廓对应的外接矩形
(cnts, boundingRects)= contours.sort_contours(cnts)
# 寻⾯积最⼤的轮廓的索引
for cnt in cnts:
s.urArea(cnt))
max_index = s.index(max(s))
# 根据⾯积最⼤轮廓的索引到它的外接矩形的信息
(x, y, w, h)= boundingRects[max_index]
# 画矩形
frame_out = angle(
draw_frame,(x, y),(x+w, y+h),(0,255,0),2)
cv2.imshow("frame", draw_frame)
if cv2.waitKey(10)==27:
break
cv2.destroyAllWindows()
具体解释都在代码注释⾥⾯了,下⾯我要提⼀些注意的地⽅。
1. 获得过图像之后可能需要进⾏⼀系列的形态学操作,这样可以让获得的图像更加接近⽬的图像。这些操作虽然不是必需的但如果正常
取得的图像效果不好的时候可以加上。
2. 函数contours.sort_contours 和 ate是imutils包⾥⾯的,使⽤起来⽐较⽅便,具体⽤法可以看博主的另⼀篇博客:。外接矩形
也可以通过cv2.boundingRect函数获得。
3. 代码中博主是以轮廓的最⼤⾯积为条件画的图,但这个条件应该根据⾃⼰想要的效果⽽定。这⾥除了寻最⼤⾯积以外还可以寻最
⼤周长、最长的边之类的。
最终效果图
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论