我正在使用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());
但是我得到一个空的Mat,用于得到和没有模糊的结果。 我该如何修复此代码?
编辑: 嗨伙计们!
谢谢你,我现在有了这张照片。我正在使用这些参数:
Imgproc.HoughCircles(result, circles, Imgproc.CV_HOUGH_GRADIENT, 1, 20, 50, 10, 10, 40);
我在检测前仍然使用medianBlur。
唯一的问题是为什么它会检测到这些小圆圈?我已经附上了精确检测的结果,我认为这些圆圈很容易看到。
答案 0 :(得分:2)
您确定提供半径而不是直径吗?尝试更广泛的半径范围(例如10-100)。
使用OpenCV在祖玛作弊? :)
答案 1 :(得分:2)
首先,circles
结构不应该是cv::Mat
,而应该是std::vector<cv::Vec3f>
;我认为这就是为什么你没有得到任何结果..请参阅HoughCircles上的文档了解详情..
使用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);
在稍微使用这些值之后,您可以获得更多定义的结果。
PS - 由于我是C ++用户,请原谅我将所有结构都放在那种格式中。您可以轻松地将逻辑扩展到Java。 :)
答案 2 :(得分:1)
我测试了我的代码,它在C#中写了(我认为java是相同的)并得到结果:1
您可以在HoughAlgorithm.cs类中找到我的代码 我的演示项目Here
//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;
}
}