首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >快速可靠的反射球检测方法

快速可靠的反射球检测方法
EN

Stack Overflow用户
提问于 2017-03-09 21:47:53
回答 1查看 468关注 0票数 3

我有一个反射率很高的球,它看起来像这样:

什么是实时检测球的稳健方法?(5-10 FPS)

我尝试过几种分割算法,但它们无法将球从背景中分离出来,而是将球切成碎片,因为球本身有许多不同的区域。

由于反射性质,简单的圆形hough变换不能很好地工作。同样的情况也适用于任何简单的调整或形态操作。

你对一般的反射面有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-10 23:32:03

HoughCircles的建议是很棒的,只要您对球在框架中的移动方式有大致的了解,因此大致知道您的最小、最大半径是多少:

代码语言:javascript
运行
复制
import numpy as np
import cv2
import cv2.cv as cv

img = cv2.imread('wcEXm.jpg',0)


#Method 1: Hough Circles
img = cv2.medianBlur(img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

# HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]])
circles = cv2.HoughCircles(img,cv.CV_HOUGH_GRADIENT,dp=1,minDist=50,param1=127,param2=30,minRadius=50,maxRadius=150)

circles = np.uint16(np.around(circles))
for i in circles[0,:]:
    # draw the outer circle
    cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
    # draw the center of the circle
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)

cv2.imshow('detected circles',cimg)

另一种选择是使用findContours()。有了正确的选项和一些过滤(例如,dilate()erode()),您可以将球从背景中分割出来,而宽度和高度之间的比率(接近正方形)将有所帮助。

然而,如果你对球的大小不感兴趣的话,还有一件很简单的事情,就是知道球在哪里。你的球是反射的,甚至开始探测到你需要一个光源,因此,即使颜色/环境看起来不同,球也会有亮点。假设镜框中没有光源,你的反光球很可能是场景中下一个最亮的东西:

代码语言:javascript
运行
复制
import cv2

img = cv2.imread('wcEXm.jpg',0)

minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(img)
cv2.circle(img, maxLoc, 20, (0,192,0),10)

就RaspberryPi的性能而言,我建议如下:

  1. 禤浩焯的关于在Python中使用PiCam与OpenCV的教程
  2. 如果您计划使用minMaxLoc()或其他处理灰度图像的函数,您可以使用'yuv'颜色空间,只需使用Y(亮度)通道来节省一些不需要从RGB转换到lumma/grayscale的时间。
  3. 使用较小的分辨率(例如320x240或160x120)。如果你需要把球的x,y位置映射到别的地方,你可以把结果放大。

更新:还有一件可能会有帮助的事情是精明边缘检测,因为场景很简单,球会很突出:

代码语言:javascript
运行
复制
edges = cv2.Canny(img,100,200)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42706085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档