概述
程序参考:树莓派视觉小车 – 小球追踪(颜色追踪)(OpenCV色彩空间HSV)https://car.inotgo.com/2021/11/20211108230409934Q.html
树莓派算力有限,现在使用手机摄像头充当电脑的无线摄像头,通过手机安装于树莓派小车上实现图像采集,在电脑端进行视觉处理,后期实现计算机控制小车运行实现小球追踪。
- 效果展示
- 理论基础
为什么用HSV空间而不是RGB空间?
因为RGB通道并不能很好地反映出物体具体的颜色信息。
而HSV空间能够非常直观的表达色彩的明暗、色调、以及鲜艳程度,方便进行颜色之间的对比。(RGB受光线影响很大,所以采取HSV)
这里用HSV的目的:得到合适的二值图。
Hue:色相(具体的颜色),Value(明度),Saturation(饱和度) - 程序及介绍
import numpy as np
import cv2
def nothing(*arg):#创建回调函数
pass
def Trackbar_Init():
# 1 create windows 窗口设置(名称)
cv2.namedWindow('h_binary')
cv2.namedWindow('s_binary')
cv2.namedWindow('v_binary')
# 2 Create Trackbar 滑动条设置
cv2.createTrackbar('hmin', 'h_binary', 86, 179, nothing)
cv2.createTrackbar('hmax', 'h_binary', 100, 179, nothing)
cv2.createTrackbar('smin', 's_binary', 80, 255, nothing)
cv2.createTrackbar('smax', 's_binary', 213, 255, nothing)
cv2.createTrackbar('vmin', 'v_binary', 180, 255, nothing)
cv2.createTrackbar('vmax', 'v_binary', 255, 255, nothing)
# 创建滑动条 滑动条值名称 窗口名称 滑动条值 滑动条阈值 回调函数
def Get_HSV(image):
# 1 get trackbar's value 获取滑动条的值
hmin = cv2.getTrackbarPos('hmin', 'h_binary')
hmax = cv2.getTrackbarPos('hmax', 'h_binary')
smin = cv2.getTrackbarPos('smin', 's_binary')
smax = cv2.getTrackbarPos('smax', 's_binary')
vmin = cv2.getTrackbarPos('vmin', 'v_binary')
vmax = cv2.getTrackbarPos('vmax', 'v_binary')
# 2 to HSV 转HSV(三通道:H、S、V)
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
cv2.imshow('hsv', hsv)
h, s, v = cv2.split(hsv)
# 3 set threshold (binary image) 转二值图(单通道阈值处理)
# if value in (min, max):white; otherwise:black
h_binary = cv2.inRange(np.array(h), np.array(hmin), np.array(hmax))
s_binary = cv2.inRange(np.array(s), np.array(smin), np.array(smax))
v_binary = cv2.inRange(np.array(v), np.array(vmin), np.array(vmax))
# 4 get binary(对H、S、V三个通道分别与操作)
binary = cv2.bitwise_and(h_binary, cv2.bitwise_and(s_binary, v_binary))
# 5 Show
cv2.imshow('h_binary', h_binary)
cv2.imshow('s_binary', s_binary)
cv2.imshow('v_binary', v_binary)
cv2.imshow('binary', binary)
return binary
def Image_Processing():
global h, s, v
# 1 Capture the frames 打开摄像头
ret, frame = camera.read()
image = frame
cv2.imshow('frame', frame)
# 2 get HSV 获取HSV色彩空间得到的二值图(步骤四的HSV处理)
binary = Get_HSV(frame)
# 3 Gausi blur 高斯滤波
blur = cv2.GaussianBlur(binary,(9,9),0)
# 4 Open 开运算(去噪)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9,9))
Open = cv2.morphologyEx(blur, cv2.MORPH_OPEN, kernel)
cv2.imshow('Open',Open)
# 5 Close 闭运算
Close = cv2.morphologyEx(Open, cv2.MORPH_CLOSE, kernel)
cv2.imshow('Close',Close)
# 6 Hough Circle detect 霍夫圆检测
circles = cv2.HoughCircles(Close,cv2.HOUGH_GRADIENT,2,120,param1=120,param2=20,minRadius=20,maxRadius=0)
# param2:决定圆能否被检测到(越少越容易检测到圆,但相应的也更容易出错)
# judge if circles is exist
if circles is not None:
# 1 获取圆的圆心和半径
x, y, r = int(circles[0][0][0]),int(circles[0][0][1]),int(circles[0][0][2])
print(x, y, r)
# 2 画圆
cv2.circle(image, (x, y), r, (255,0,255),5)
cv2.imshow('image', image)
else:
(x,y),r = (0,0), 0
return (x,y), r
width, height = 640, 480
camera = cv2.VideoCapture(0)
camera.set(3, width)
camera.set(4, height)
if __name__ == '__main__':
Trackbar_Init()
while True:
(x, y), r = Image_Processing()
#后期可以在这里插入一个move((x,y),r)函数,对应小球所在位置及大小采取相应的运动策略
if cv2.waitKey(1) & 0xFF == ord('q'): # 按q键退出
break
最后
以上就是细心啤酒为你收集整理的基于opencv的小球追踪(颜色追踪)的python实现的全部内容,希望文章能够帮你解决基于opencv的小球追踪(颜色追踪)的python实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复