博客> Mac平台下OpenCV的搭建
Mac平台下OpenCV的搭建
2019-11-20 12:59 评论:0 阅读:647 yang992510244
ios c++ OpenCV

基础一:Mac平台下openCV的搭建(Xcode + openCV 3.4.1) 参考 http://www.bubuko.com/infodetail-826748.html http://www.cnblogs.com/pingyang-mei/p/5160195.html

OpenCV ,是一个开源的跨平台计算机视觉和机器学习库,通俗点的说,就是他给计算机提供了一双眼睛,一双可以从图片中获取信息的眼镜,从而完成人脸识别、去红眼、追踪移动物体等等的图像相关的功能。更多具体的说明可参见 OpenCV 官网。

1、准备工作 下载安装Homebrew,brew是一个可以下载、更新并卸载 Mac 上的一些软件工具的软件包管理器,很强大 1) 打开终端:回车/回车/回车(个人习惯,读者不用管)复制粘贴下面脚本: ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

    安装过的童鞋就不用再安了,如果安装过再执行这条命令就会提示你:你的电脑已经安装过brew了,如你想要重新安装必须要先执行下面的脚本:
    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"

    脚本最后的install就是安装,uninstall就是卸载.
    出现Installation successful 就说明已经安装成功了,输入执行brew help能查看brew的具体用法.

    2) 为了保证套件的完整,接着执行官网的建议脚本,安装wget.
    brew install wget

    3) 接着装cmake,这个是必须要装的
    brew install cmake

    4) 重点:让brew帮我们下载OpenCV,而不是自己上OpenCV官网下载,
    brew install opencv

    下载的是OpenCV3.4.1, /usr/local/Cellar目录下的文件都是brew帮我们下载好的,里面的cmake,wget,opencv是我们自己下载的,其他的都是brew帮我们下的

2 在Xcode中使用OpenCV

2.1创建一个空的command line 工程:选择OS X -> Application -> Command Line Tool->Next;填写自己的product名,选择语言为C++,选择自己存放的目录,ok!

2.2点击工程文件,添加opencv2.framework和/usr/local/Cellar/opencv/3.4.1_2/lib的lib文件夹,存放的是一些.dylib文件。  Enter your image description here:  Enter your image description here:

mac Xcode里配置OpenCV就大功告成了!!!接下来你就可以在main.cpp文件里编译你的OpenCV工程了!!!测试用代码如下所示,从Mac自带的摄像头读入图像,然后canny提取了边缘然后显示。

// main.cpp // Camera_Capture

include

include

include

include

using namespace std; using namespace cv;

IplImage doCanny(IplImage image_input, double lowThresh, double highThresh, double aperture) { if(image_input->nChannels != 1) return (0);

IplImage* image_output = cvCreateImage(cvGetSize(image_input),
                                       image_input->depth,
                                       image_input->nChannels);

cvCanny(image_input,image_output,lowThresh,highThresh,aperture);

return(image_output);

}

int main(int argc, char* argv[]) { cvNamedWindow("Camera" , CV_WINDOW_AUTOSIZE );

CvCapture* capture = cvCreateCameraCapture(CV_CAP_ANY);

assert(capture != NULL);

IplImage *frame = 0;
frame = cvQueryFrame(capture);

IplImage *frame_edge = cvCreateImage(cvGetSize(frame),
                                     IPL_DEPTH_8U,
                                     1);
while(1)
{
    frame = cvQueryFrame(capture);
    if(!frame) break;

    cvConvertImage(frame,frame_edge,0);
    frame = cvCloneImage(frame_edge);

    frame_edge = doCanny(frame_edge,70,90,3);

    cvShowImage("Camera",frame_edge);
    char c = cvWaitKey(15);
    if(c == 27)  break;
}

cvReleaseCapture(&capture);
cvReleaseImage( &frame_edge );
cvReleaseImage( &frame);

return (int)0;

}

xcode里的配置工作也有一些地方参考了zhoufan大大的博客文章 [openCV]Mac平台下openCV的搭建(Xcode + openCV 2.4.10)

基础二 参考:https://segmentfault.com/a/1190000003105187 https://www.jianshu.com/p/4a156fb867b9

导入工程 导入 OpenCV 到 Xcode 的工程中还是比较简单的,从官网下载对应的 framework,直接丢到 Xcode 的工程中,然后在你想用 OpenCV 的地方引入 OpenCV 的头文件:

import

或者直接在 PCH 文件中添加:

ifdef __cplusplus

import

endif

然后把使用到 OpenCV 中 C++方法的实现文件后缀名改成.mm,就可以开始使用 OpenCV 的方法了。不过这里有一些要注意的地方,我们一起来看看。

实际问题 首先说明,为何在 PCH 文件中引入 OpenCV 的头文件我们需要多加#ifdef cpluseplus这一部分呢?这是因为 PCH 文件是一个会被所有的文件引入的头文件,而我们又希望 #import 这部分只会被一些 C++实现文件编译,所以我们加上#ifdef cpluseplus来表示这是 C++ 文件才会编译的,除了#ifdef cpluseplus,还有#ifdef OBJC__这样的宏来说明编译规则(按照 OC 文件编译),这样的宏多出现于一些会被多种类型的实现文件引用的头文件中。

另外注意另一个问题:如果一个头文件是C++类型的头文件,那么一定要保证所有直接或者间接引用这个头文件的实现文件都要为.mm或者.cpp,否则 Xcode 就不会把这个头文件当做 C++头文件来编译,就会出现最基本的#include 这种引用都会报出file not found 这样的编译错误的问题。我在编译的过程中,某个C++头文件 A.h 被 B.h 引用,然后 B.h 又被 C.m 引用,虽然 B 的实现文件是 B.mm ,但是仍然报出了之前说的那个错误, 感谢 StackOberflow 让我找到了问题发生的原因。所以对于 C++ 头文件的引用一定要注意,但凡是引用了 A.h 的实现部分,都必须是.mm或者.cpp后缀名。(同时我们也可以知道,Xcode 是根据头文件被引用的情况来判定头文件的编译 类型的)。OpenCV是一个C++的API,因此如果要在OC中使用必须把文件后缀该为.mm。

正确的方式是给所有你要在 app 中使用到的 OpenCV 功能写一层 Objective-C++ 封装。这些 Objective-C++ 封装把 OpenCV 的 C++ API 转化为安全的 Objective-C API,以方便地在所有 Objective-C 类中使用。走封装的路子,你的工程中就可以只在这些封装中调用 C++ 代码,从而避免掉很多让人头痛的问题,比如直接改文件后缀名会因为在错误的文件中引用了一个 C++ 头文件而产生难以追踪的编译错误。 并且文章中提到ARC只对Objective-C 对象有效。因此C++的内存管理需要格外注意

转换 UIImage 和 cv::Mat 在 OpenCV 中同常用 cv::Mat 表示图片,而 iOS 中则是 UIImage 来表示图片,因此我们就需要一些转换的方法,OpenCV 的官方教程中给吃了转换的方法,这里摘录如下:

UIImage To cv::Mat:

  • (cv::Mat)cvMatFromUIImage:(UIImage *)image { CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage); CGFloat cols = image.size.width; CGFloat rows = image.size.height;

    cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels (color channels + alpha)

    CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // Pointer to data cols, // Width of bitmap rows, // Height of bitmap 8, // Bits per component cvMat.step[0], // Bytes per row colorSpace, // Colorspace kCGImageAlphaNoneSkipLast | kCGBitmapByteOrderDefault); // Bitmap info flags

    CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage); CGContextRelease(contextRef);

    return cvMat; } cv::Mat To UIImage:

-(UIImage )UIImageFromCVMat:(cv::Mat)cvMat { NSData data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()]; CGColorSpaceRef colorSpace;

if (cvMat.elemSize() == 1) {//可以根据这个决定使用哪种 colorSpace = CGColorSpaceCreateDeviceGray(); } else { colorSpace = CGColorSpaceCreateDeviceRGB(); }

CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);

// Creating CGImage from cv::Mat CGImageRef imageRef = CGImageCreate(cvMat.cols, //width cvMat.rows, //height 8, //bits per component 8 * cvMat.elemSize(), //bits per pixel cvMat.step[0], //bytesPerRow colorSpace, //colorspace kCGImageAlphaNone|kCGBitmapByteOrderDefault,// bitmap info provider, //CGDataProviderRef NULL, //decode false, //should interpolate kCGRenderingIntentDefault //intent );

// Getting UIImage from CGImage UIImage *finalImage = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); CGDataProviderRelease(provider); CGColorSpaceRelease(colorSpace);

return finalImage; }

一些C++ 和 openCv 和OC 语言的差异问题,需要解决.可参考https://www.jianshu.com/p/ae1896a50b0e http://www.bubuko.com/infodetail-826748.html http://www.mamicode.com/info-detail-1193075.html

收藏
0
sina weixin mail 回到顶部