Java 寻找圆的图像处理

Java 寻找圆的图像处理,java,opencv,image-processing,geometry,hough-transform,Java,Opencv,Image Processing,Geometry,Hough Transform,我正在使用opencv和java查找图像上的圆,到目前为止,我有下面的图像。 我使用Hough来查找代码如下的圆: Imgproc.medianBlur(result, result, 3); Imgproc.medianBlur(result, result, 3); Imgproc.medianBlur(result, result, 3); Mat circles = new Mat(); Imgproc.HoughCircles(result, c

我正在使用opencv和java查找图像上的圆,到目前为止,我有下面的图像。 我使用Hough来查找代码如下的圆:

    Imgproc.medianBlur(result, result, 3);
    Imgproc.medianBlur(result, result, 3);
    Imgproc.medianBlur(result, result, 3);
    Mat circles = new Mat();
    Imgproc.HoughCircles(result, circles, Imgproc.CV_HOUGH_GRADIENT, 1, 1, 200, 100, 30, 40);
    System.out.println(circles.dump());
但我得到了一个空垫子的结果与模糊和不模糊。 我应该如何修复此代码

编辑: 嗨,伙计们

多亏了你,我现在有了这张照片。我正在使用这些参数:

Imgproc.HoughCircles(result, circles, Imgproc.CV_HOUGH_GRADIENT, 1, 20, 50, 10, 10, 40);
在被发现之前我还在用medianBlur

剩下的唯一问题是为什么它能检测到这些小圆圈?我已经附上了精明的检测结果,我认为圆圈是可以看到的


您确定提供的是半径而不是直径吗?尝试更宽的半径范围(例如10-100)


在祖马使用OpenCV作弊?:)

首先,
圆圈
结构不应该是
cv::Mat
,而应该是
std::vector
;我想这就是你没有得到任何结果的原因。。有关详细信息,请参阅上的文档

用5分钟的时间来研究这些值,我有一个起点:

我使用的参数是

cv::medianBlur(test_Circle, test_Circle, 7);
std::vector<cv::Vec3f> circles; // <- not that "circles" is not cv::Mat
cv::HoughCircles(test_Circle, circles, CV_HOUGH_GRADIENT, 1, 1, 300, 10, 10, 50);
cv::medianBlur(测试圈,测试圈,7);

std::向量圆;// 我已经测试了我的代码,它是用C#编写的(我认为java是一样的),结果是:

您可以在HoughAlgorithm.cs类中找到我的代码 我的演示项目


Mat可用作OpenCV中点向量的容器。大多数接受点向量的函数都会接受Mat并正确使用它。事实上,在OpenCV的几个版本之前,有些函数需要将vector强制转换为Mat。但是我同意用Mat代替vector有点混乱,我使用Mat,因为函数需要Java中的Mat,当我只找到一个圆时,Mat中只有3个值@Michaelburdinov你似乎有很多假阳性。
    //DP_Resolution: 1
//MinDistance :32
//CannyThreshold: 10
//AccuThreshold: 10
//MinRadius: 13
//MaxRadius: 20

public static CvSeq DetectCircles(IplImage pImage, CamEnum _camName)
{
    try
    {
        CvMemStorage memStorage = cvlib.CvCreateMemStorage(0);
        return cvlib.CvHoughCircles(ref pImage, memStorage.ptr, 3, 1, 32, 10, 10, 13, 20);
    }
    catch
    {
        throw;
    }
}