【发布时间】:2018-08-26 19:38:30
【问题描述】:
1.一些信息:我想在openCV的帮助下开发一种圆圈识别。我成功建立了 Swift、objc-c++ 之间的连接,但奇怪的是我的圆圈识别算法出现了一些问题:不是我图像中的所有圆圈被检测到!
2.看看我的代码:
+(UIImage *)ConvertImage:(UIImage *)image {
cv::Mat matImage;
UIImageToMat(image, matImage);
cv::Mat modImage;
cv::medianBlur(matImage, matImage, 5);
cv::cvtColor(matImage, modImage, CV_RGB2GRAY);
cv::GaussianBlur(modImage, modImage, cv::Size(9, 9), 2, 2);
vector<Vec3f> circles;
cv::HoughCircles(modImage, circles, CV_HOUGH_GRADIENT, 1, 1, 100, 50, 0, 0);
for (auto i = circles.begin(); i != circles.end(); ++i)
std::cout << *i << ' ';
for( size_t i = 0; i < circles.size(); i++ )
{
cv::Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int radius = cvRound(circles[i][2]);
circle( matImage, center, 3, Scalar(0,255,0), -1, 8, 0 );
circle( matImage, center, radius, Scalar(0,0,255), 3, 8, 0 );
}
UIImage *binImg = MatToUIImage(matImage);
return binImg;
}
正如您在图像 [click] 中看到的那样,出现了这个问题: 仅检测到 7 个圈子中的 3 个!
所以在docs我找到了这一行的参数说明:
cv::HoughCircles(modImage, circles, CV_HOUGH_GRADIENT, 1, 1, 100, 50, 0, 0);
- dp = 1:分辨率的反比。
- min_dist = modImage.rows/8:检测到的中心之间的最小距离。
- param_1 = 200:内部 Canny 边缘检测器的上限阈值。
- param_2 = 100*:中心检测阈值。
- min_radius = 0:要检测的最小无线电。如果未知,则将零设为默认值。
- max_radius = 0:要检测的最大半径。如果未知,则将零设为默认值。
3.我的问题
如何摆脱上述问题?
任何帮助将不胜感激:)
【问题讨论】:
标签: c++ algorithm opencv geometry objective-c++