尝试在我回答这个问题的解决...
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.cpp
和CVSquares.h
用,说CVCircles.cpp
和CVCicles.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()参数
你真的应该开始一个新的问题,并标记正确答案的响应,不会改变问题到一个完全不同的问题。 –