适用于iOS的OpenCV错误/检测Hough Circles

我一直试图用openCV运行一个xcode项目。 我构建了源代码,将其导入到项目中,并在.pch文件中包含#ifdef __cplusplus #import opencv2 / opencv.hpp> #endif。

我按照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::__throw_length_error() const", referenced from: 

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

更新:

错误全部修复,现在我试图检测圆圈..

 Mat src, src_gray; cvtColor( image, src_gray, CV_BGR2GRAY ); vector 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 ); } 

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

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

如何使用OpenCV解决iOS链接错误

另外在github上我有几个 简单的工作样本 – 最近构建的openCV框架。

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

为了使OpenCVSquares能够检测圆圈,我建议您从openCV发行版的Hough Circles c ++示例开始,并使用它来修改/替换CVSquares.cppCVSquares.h ,比如CVCircles.cppCVCicles.h

原则完全相同:

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

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

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

更新

改编后的houghcircles.cpp看起来应该是最基本的(我用CVCircles类替换了CVSquares类):

 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 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; } 

请注意,为简单起见,输入参数减少为1 - 输入图像。 不久我将在github上发布一个示例,其中包含一些与iOS UI中的滑块控件绑定的参数,但您应该首先使用此版本。

随着function签名的改变,你应该跟着链子......

改变houghcircles.h类的定义:

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

修改CVWrapper类以接受调用detectCirclesInImage的类似结构的方法

  + (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现在在Github上
使用滑块调整HoughCircles()参数