我一直试图用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<true>::__throw_length_error() const", referenced from:
Run Code Online (Sandbox Code Playgroud)
请帮帮我,我真的迷路了..
更新:
错误全部修复,现在我试图检测圈子..
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 );
}
Run Code Online (Sandbox Code Playgroud)
我正在使用上面的代码,但是没有在图像上绘制圆圈..有什么明显的东西我做错了吗?
在我对这个问题的回答中尝试解决方案......
另外在github上我有一对夫妇的简单的工作样本 -与最近建成的OpenCV的框架.
注意 - OpenCVSquares比OpenCVSquaresSL简单.后者适用于Snow Leopard向后兼容性 - 它包含openCV框架的两个版本和3个目标,因此如果它将在您的系统上运行,您最好使用更简单的OpenCVSquares.
为了使OpenCVSquares能够检测圆圈,我建议您从openCV发行版中的Hough Circles c ++示例开始,并使用它来适应/替换CVSquares.cpp和CVSquares.h使用,比如CVCircles.cpp和CVCicles.h
原则完全相同:
从Objective-C端,您将UIImage传递给包装器对象,其中:
更新
改编后的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<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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,为简单起见,输入参数减少为一 - 输入图像.不久我会在github上发布一个示例,其中包含一些与iOS UI中滑块控件相关的参数,但是你应该先使用这个版本.
随着功能签名的改变,你应该跟着链子......
改变houghcircles.h类的定义:
static cv::Mat detectedCirclesInImage (const cv::Mat image);
Run Code Online (Sandbox Code Playgroud)
修改CVWrapper类以接受调用的类似结构的方法 detectedCirclesInImage
+ (UIImage*) detectedCirclesInImage:(UIImage*) image
{
UIImage* result = nil;
cv::Mat matImage = [image CVGrayscaleMat];
matImage = CVCircles::detectedCirclesInImage (matImage);
result = [UIImage imageWithCVMat:matImage];
return result;
}
Run Code Online (Sandbox Code Playgroud)
请注意,我们正在将输入UIImage转换为灰度,因为houghcircles函数需要输入灰度图像.小心拉取我的github项目的最新版本,我发现CVGrayscaleMat类别中的一个错误现在已修复.输出图像是颜色(应用于灰度输入图像的颜色以挑选出找到的圆圈).
如果您希望输入和输出图像是彩色的,您只需要确保对输入图像进行灰度转换以便发送到Houghcircles() - 例如cvtColor(input_image, gray_image, CV_RGB2GRAY); 并将找到的圆圈应用于颜色输入图像(这将成为您的返回图像).
最后在您的CVViewController中,将您的消息更改为CVWrapper以符合此新签名:
UIImage* image = [CVWrapper detectedCirclesInImage:self.image];
Run Code Online (Sandbox Code Playgroud)
如果您遵循所有这些详细信息,您的项目将生成圆检测结果.
在Github上更新2 OpenCVCircles
使用滑块调整HoughCircles()参数
| 归档时间: |
|
| 查看次数: |
3561 次 |
| 最近记录: |