iOS的OpenCV错误/检测霍夫圈



我已经尝试了几个小时运行一个xcode项目与openCV。我已经构建了源代码,将其导入到项目中并包含#import opencv2/opencv.hpp># endif在.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 );

}

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

试试我对这个问题的回答…

如何使用OpenCV解决iOS Link错误

同样在github上,我有几个简单的工作示例-使用最近构建的openCV框架。

NB - OpenCVSquares比OpenCVSquaresSL更简单。后者是为了雪豹的向后兼容性而改编的——它包含两个openCV框架的构建和3个目标,所以如果你的系统能运行,你最好使用更简单的OpenCVSquares。

为了适应OpenCVSquares来检测圆,我建议您从openCV发行版中的Hough circles c++样本开始,并使用它来适应/替换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现在在Github上
使用滑块来调整HoughCircles()参数

相关内容

  • 没有找到相关文章

最新更新