为iOS /检测霍夫圈子的OpenCV错误(OpenCV errors for iOS / dete

2019-08-07 10:57发布

我一直在尝试了几个小时来运行的OpenCV的Xcode项目。 我已经建立了源,它导入到项目,并在.PCH文件中包含的#ifdef __cplusplus#进口opencv2 / opencv.hpp> #ENDIF。

我跟着从指令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:

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

更新:

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

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


}

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

Answer 1:

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

如何解决与OpenCV的iOS的链接错误

另外在github上我有一对夫妇的简单的工作样本 -与最近建成的OpenCV的框架。

NB - OpenCVSquares比OpenCVSquaresSL简单。 后者被改编为雪豹向后兼容性 - 它包含两个版本OpenCV的框架和3个目标,所以你最好使用简单的OpenCVSquares是否会在系统上运行。

为了适应OpenCVSquares检测圈,我建议你先从霍夫圆C ++样本来自OpenCV的发行版,并用它来适应/替换CVSquares.cppCVSquares.h用,说CVCircles.cppCVCicles.h

这些原则是完全一样的:

  • 从c ++除去UI代码,该UI被设置在OBJ-C侧
  • 变换main()函数为静态成员函数在头文件中声明的类。 这应该在形式反映一个Objective-C消息发送到所述包装物(其转化的OBJ-C方法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在Github
与滑块来调整HoughCircles()参数



文章来源: OpenCV errors for iOS / detecting Hough Circles
标签: ios opencv cmake