2013-01-19 64 views
2

我一直在尝试几个小时来运行openCV的xcode项目。我构建了源代码,将其导入到项目中,并在.pch文件中包含#ifdef __cplusplus #import opencv2/opencv.hpp> #endif 。iOS的OpenCV错误/检测Hough Circles

我跟着从http://docs.opencv.org/trunk/doc/tutorials/introduction/ios_install/ios_install.html

不过我得到很多苹果的Mach-O链接错误,当我编译指令。

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

请帮助我,我真的失去了..

UPDATE:

错误的所有固定,现在我试图检测圈..

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


} 

我现在用的是上面的代码,但是没有圈出来的图像..是否有什么明显的,我做错了?

+0

你真的应该开始一个新的问题,并标记正确答案的响应,不会改变问题到一个完全不同的问题。 –

回答

6

尝试在我回答这个问题的解决...

How to resolve iOS Link errors with OpenCV

而且在github上我有a couplesimple working samples的 - 与最近建立OpenCV的框架。

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

适应OpenCVSquares检测圈,我建议你先从Hough Circles c++ sample来自OpenCV的发行版,并用它来适应/替换CVSquares.cppCVSquares.h用,说CVCircles.cppCVCicles.h

的原则是完全一样的:来自C++

  • 删除UI代码,所述UI设置在OBJ-C侧
  • 变换main()函数为静态成员函数中声明的类头文件。这应该向包装器(将obj-c方法转换为C++函数调用)以Objective-C消息的形式进行镜像。

从客观-C侧,要传递一个UIImage到包装对象,其中:

  • 所述的UIImage转换为CV ::垫图像
  • 通过垫到C++类处理
  • 结果从垫转换回的UIImage
  • 返回已处理的UIImage回目标-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()参数

+0

谢谢。这非常有帮助。我目前正在尝试修改OpenCVSquaresSL项目来检测圆圈,您的项目中是否有很多需要改变的地方,或者我会更好地使用您的指南开始一个新项目? –

+0

您正在使用哪种版本的XCode和OSX? – foundry

+0

你好,谢谢你的回复。我正在使用XCode 4.5.2和OSX 10.7.5 PS。我忘了提及现在所有的编译工作都已正确,并且如上所述,我真的很想能够检测出圆圈而不是方块 –