【问题标题】:OpenCV errors for iOS / detecting Hough CirclesiOS 的 OpenCV 错误/检测霍夫圆
【发布时间】:2013-01-03 04:14:22
【问题描述】:

我已经尝试了几个小时来使用 openCV 运行一个 xcode 项目。我已经构建了源代码,将其导入项目并包含 #ifdef __cplusplus #import opencv2/opencv.hpp> #万一 在 .pch 文件中。

我按照http://docs.opencv.org/trunk/doc/tutorials/introduction/ios_install/ios_install.html的指示进行操作

我在编译时仍然收到许多 Apple Mach-O 链接器错误。

Undefined symbols for architecture i386:
 "std::__1::__vector_base_common<true>::__throw_length_error() const", referenced from:

请帮帮我,我真的迷路了..

更新:

所有错误都已修复,现在我正在尝试检测圆圈..

Mat src, src_gray;

cvtColor( image, src_gray, CV_BGR2GRAY );

vector<Vec3f> circles;

/// Apply the Hough Transform to find the circles
HoughCircles( src_gray, circles, CV_HOUGH_GRADIENT, 1, image.rows/8, 200, 100, 0, 0 );


/// Draw the circles detected
for( size_t i = 0; i < circles.size(); i++ )
{
    Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
    int radius = cvRound(circles[i][2]);
    // circle center
    circle( src, center, 3, Scalar(0,255,0), -1, 8, 0 );
    // circle outline
    circle( src, center, radius, Scalar(0,0,255), 3, 8, 0 );


}

我正在使用上面的代码,但是图像上没有画圆圈.. 有什么明显的我做错了吗?

【问题讨论】:

  • 你真的应该开始一个新问题,并用正确的答案标记答案,而不是把问题变成一个完全不同的问题。

标签: ios opencv cmake


【解决方案1】:

在我对这个问题的回答中尝试解决方案...

How to resolve iOS Link errors with OpenCV

在 github 上我也有 a couplesimple working samples - 最近构建的 openCV 框架。

NB - OpenCVSquares 比 OpenCVSquaresSL 更简单。后者适用于 Snow Leopard 向后兼容 - 它包含两个构建的 openCV 框架和 3 个目标,因此如果它可以在您的系统上运行,您最好使用更简单的 OpenCVSquares。

为了调整 OpenCVSquares 来检测圆圈,我建议您从 openCV 发行版中的 Hough Circles c++ sample 开始,并使用它来适应/替换 CVSquares.cppCVSquares.h,例如 CVCircles.cppCVCicles.h

原理完全一样:

  • 从c++中移除UI代码,UI是在obj-C端提供的
  • 将 main() 函数转换为头文件中声明的类的静态成员函数。这应该以 Objective-C 消息的形式反映到包装器(它将 obj-c 方法转换为 c++ 函数调用)。

从 Objective-C 端,您将 UIImage 传递给包装对象,其中:

  • 将 UIImage 转换为 cv::Mat 图像
  • 将 Mat 传递给 c++ 类进行处理
  • 将结果从 Mat 转换回 UIImage
  • 将处理后的 UIImage 返回给 Objective-C 调用对象

更新

改编后的 houghcircles.cpp 最基本的应该是这样的(我已将 CVSquares 类替换为 CVCircles 类):

cv::Mat CVCircles::detectedCirclesInImage (cv::Mat img)
{   
    //expects a grayscale image on input
    //returns a colour image on ouput
    Mat cimg;
    medianBlur(img, img, 5);
    cvtColor(img, cimg, CV_GRAY2RGB);
    vector<Vec3f> circles;
    HoughCircles(img, circles, CV_HOUGH_GRADIENT, 1, 10,
                 100, 30, 1, 60 // change the last two parameters
                 // (min_radius & max_radius) to detect larger circles
                 );
    for( size_t i = 0; i < circles.size(); i++ )
        {
        Vec3i c = circles[i];
        circle( cimg, Point(c[0], c[1]), c[2], Scalar(255,0,0), 3, CV_AA);
        circle( cimg, Point(c[0], c[1]), 2, Scalar(0,255,0), 3, CV_AA);
        }
    return cimg;
    }

请注意,为简单起见,输入参数被简化为一个 - 输入图像。不久我将在 github 上发布一个示例,其中将包含一些与 iOS UI 中的滑块控件相关的参数,但您应该先让这个版本工作。

由于函数签名已更改,您应该沿着链跟进...

修改 houghcircles.h 类定义:

    static cv::Mat detectedCirclesInImage (const cv::Mat image);

修改 CVWrapper 类以接受一个类似结构的方法,该方法调用detectedCirclesInImage

    + (UIImage*) detectedCirclesInImage:(UIImage*) image
    {
        UIImage* result = nil;
        cv::Mat matImage = [image CVGrayscaleMat];
        matImage = CVCircles::detectedCirclesInImage (matImage);
        result = [UIImage imageWithCVMat:matImage];
        return result;
    }

请注意,我们正在将输入 UIImage 转换为灰度,因为 houghcircles 函数需要输入灰度图像。 请注意拉取我的 github 项目的最新版本,我在 CVGrayscaleMat 类别中发现了一个错误,现已修复。输出图像是彩色的(颜色应用于灰度输入图像以挑选出找到的圆圈)。

如果您希望输入彩色输出图像,您只需确保对输入图像进行灰度转换以发送到 Houghcircles() - 例如cvtColor(input_image, gray_image, CV_RGB2GRAY);并将您找到的圆圈应用于颜色输入图像(成为您的返回图像)。

最后在您的 CVViewController 中,将您的消息更改为 CVWrapper 以符合这个新签名:

    UIImage* image = [CVWrapper detectedCirclesInImage:self.image];

如果您遵循所有这些细节,您的项目将产生圆形检测结果。

更新 2
OpenCVCircles now on Github
用滑块调整 HoughCircles() 参数

【讨论】:

  • 谢谢。这很有帮助。我目前正在尝试修改您的 OpenCVSquaresSL 项目以检测圆圈,您的项目是否有很多需要更改的地方,还是以您的项目为指导开始一个新项目会更好?
  • 您使用的是哪个版本的 XCode 和 OSX?
  • 您好,感谢您的回复。我正在使用 XCode 4.5.2 和 OSX 10.7.5 PS。我忘了提到现在一切都在正确编译,如上所述,我真的很想能够检测圆形而不是正方形
  • @Pluto - 查看我的更新 - 如果您稍后再查看,我会稍微扩展此答案
  • 它正在转换为颜色以对找到的圆圈进行着色。解决输入输出颜色问题,能否提出新问题,显示代码,我帮你解决。
猜你喜欢
  • 1970-01-01
  • 2014-05-12
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多