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);
3. 我的问题
如何摆脱上述问题?
任何帮助都将非常感谢:)
答案 0 :(得分:0)
问题2:轮廓应该是彩色的,而不是白色! 它应该是什么颜色的?无论如何,您可以使用此行在代码中绘制该圆圈。
circle( matImage, center, radius, Scalar(0,0,255), 3, 8, 0 );
如果要更改颜色,可以更改标量(0,0,255)中声明的值。
如果你根本不想要那个圆圈,你可以删除那行代码。
答案 1 :(得分:0)
您的图片似乎没有噪音。如果图像始终包含圆圈,您可以使用最小二乘法提取轮廓并拟合圆圈
您可以获得圆拟合方程here。这是一个简单的实现。为圆形参数(中心和半径)创建一个结构,拟合圆形并将参数存储在结构中,并使用它来使用OpenCV绘制圆形。
您还可以使用“ellipse2poly”函数在圆上生成点。