使用HSV和HoughCircles在OpenCV中检测彩色球体

4

我正在尝试使用iPhone上的openCV来检测彩色球体。对于第一个测试用例,我使用了一个单一的黄色大理石和给定的代码:

cv::Mat thresholdHSV;
cv::Mat imgHSV;

cv::cvtColor(inputFrame, imgHSV, CV_BGR2HSV);

cv::inRange(imgHSV,cv::Scalar(20,100,100),cv::Scalar(30,255,255),thresholdHSV);

std::vector<std::vector<cv::Point> > contours;

findContours(thresholdHSV.clone(), contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);


//Draw them
cv::Mat destinationSource = cv::Mat::zeros(inputFrame.size(), inputFrame.type());
drawContours(destinationSource, contours, -1, cv::Scalar(255,255,255), CV_FILLED);

这已经给了我很好的结果: enter image description here

但是,我需要以某种方式检测圆形。理想情况下,我希望在上应用 HoughCircle 但我得到了 OpenCv 错误:"Bad argument(the source image must be 8-bit, single-channel)。

我也尝试应用

HoughCircles(thresholdHSV, detectedCircles, CV_HOUGH_GRADIENT, 1, thresholdHSV.rows / 8, 200, 100, 0, 0);

但我根本没有得到任何结果。

如何在destinationSource图像上应用HoughCircle,或者是否有其他方法可以检测圆形?(当有更多颜色相同的球体非常接近彼此时,因为findContours只会找到一个轮廓,所以我还要考虑这一点)

非常感谢任何帮助,并感谢您的时间。


看看这个链接,应该能解决你的问题。 - Safir
谢谢提供链接。我尝试使用cv::approxPolyDP来检测圆形,但是结果不是很精确。 我仍然认为HoughCircle会给我最好的结果,但我仍然无法弄清楚如何在我的问题中使用它。 - goTAN
1个回答

4
错误提示说输入图像应该是单通道8位图像,因此彩色图像不适用。
以下是使用HoughCircles进行圆形检测的简短代码(但是用Python编写,但您会理解它)。
import cv2
import numpy as np
import sys

img = cv2.imread('img.jpg',0)
if img==None:
    print "cannot open ",filename

else:
    img = cv2.medianBlur(img,5)
    cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
    circles = cv2.HoughCircles(img,cv2.cv.CV_HOUGH_GRADIENT,1,10,param1=100,param2=30,minRadius=5,maxRadius=50)
    circles = np.uint16(np.around(circles))
    for i in circles[0,:]:
        cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),1) # draw the outer circle
        cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3) # draw the center of the circle

    cv2.imshow('detected circles',cimg)
    cv2.waitKey(0)
    cv2.imwrite('output.png',cimg)
    cv2.destroyAllWindows()

以下是输出结果: enter image description here 您可以在此处找到C ++代码:https://github.com/Itseez/opencv/blob/master/samples/cpp/houghcircles.cpp

非常感谢您的回复,对于我回应的迟延表示抱歉。然而,我仍然无法使其正常工作。我得到了一个错误信息:OpenCV Error: Assertion failed (scn == 1 && (dcn == 3 || dcn == 4)) in cvtColor。我也不明白为什么要从灰度转换为RGB?难道不应该反过来吗?然而,当我尝试使用COLOR_RGB2GRAY并且只显示结果时,奇怪的是我在屏幕右侧看到了图像被重复四次(更小)。而左侧只是噪点和杂乱的条纹。非常感谢您的帮助和理解。如果您有任何建议或解决方案,请告诉我。 - goTAN
我以灰度方式加载了图像。然后我制作了一个BGR副本,用绿色绘制圆形。或者您可以加载BGR图像并将其转换为灰度。检查您的图像是否已正确加载。 - Abid Rahman K
当您尝试在非灰度图像上应用HoughCircles时,会出现此错误。在应用HoughCircle之前,请尝试使用Imgproc.cvtColor(mat,mRgba2,Imgproc.COLOR_BGR2GRAY,0);将其转换为灰度图像。 - Abhijith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接