基于opencv的小球追踪(颜色追踪)的python实现 您所在的位置:网站首页 opencv识别乒乓球 基于opencv的小球追踪(颜色追踪)的python实现

基于opencv的小球追踪(颜色追踪)的python实现

2023-12-10 15:32| 来源: 网络整理| 查看: 265

程序参考:树莓派视觉小车 – 小球追踪(颜色追踪)(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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有