【问题标题】:OpenCV get coordinates / radius in pixelOpenCV以像素为单位获取坐标/半径
【发布时间】:2017-07-19 08:43:15
【问题描述】:

我有代码对图像进行一些转换以检测圆圈

(GaussianBlur->cvtColor(gray)->canny->HoughCircles)

至于结果,我得到了vector<Vec3f> circles; 数组。

如果我用 OpenCV 绘制结果:

cv::Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int radius = cvRound(circles[i][2]);
    //circle center
circle( originalMat, center, 3, Scalar(0,255,0), -1, 8, 0 );
    // circle outline
circle( originalMat, center, radius, Scalar(0,0,255), 1, 8, 0 );

看起来不错(见附图,蓝色圆圈

但如果我不是通过 OpenCV 绘制图像,我还有另一个圆圈(有时是椭圆)(附加图像上的红色圆圈):

 UIGraphicsBeginImageContext(image.size); //the same size as original
 [image drawAtPoint:CGPointZero];
 CGContextRef ctx = UIGraphicsGetCurrentContext();
 [[UIColor redColor] setStroke];
 CGRect circleRect = CGRectMake(circles[i][0] - circles[i][2] ,
                                circles[i][1] - circles[i][2],
                                circles[i][0] + circles[i][2],
                                circles[i][1] + circles[i][2]
                               );
circleRect = CGRectInset(circleRect, 5, 5);
CGContextStrokeEllipseInRect(ctx, circleRect);
UIImage *retImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

为什么会这样?如何获取以像素为单位的坐标和半径大小以正确绘制?

p.s:UIImageMat 的对话我得到了documentation 的形式

【问题讨论】:

    标签: ios opencv image-processing opencv3.0 opencv3.1


    【解决方案1】:

    CGRectMake needs (x, y, width, height) 而不是 top-leftbottom-right 点的坐标。所以你需要改为:

     CGRect circleRect = CGRectMake(circles[i][0] - circles[i][2] ,
                                    circles[i][1] - circles[i][2],
                                    2 * circles[i][2],
                                    2 * circles[i][2]
                               );
    

    【讨论】:

    • 是的,它有帮助,谢谢。圆心没问题,但半径比原来的小一点(我已经去掉了四舍五入):(
    • 因为你用了CGRectInset所以有点小了
    猜你喜欢
    • 2016-04-30
    • 2012-11-06
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    相关资源
    最近更新 更多