OpenCV-IOS 在Xcode中使用时,除了把opencv2.framework拉入项目中,还需要做啥,

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV-IOS 在Xcode中使用时,除了把opencv2.framework拉入项目中,还需要做啥,相关的知识,希望对你有一定的参考价值。

为什么编译错误, <opencv2/opencv.hpp> not found

参考技术A 一、安装OpenCV for MAC

1. 首先下载opencv for mac安装源文件,解压缩

2. 安装cmake程序。笔者使用的是Homebrew,在终端中输入:“brew install cmake”,自动安装cmake。

3. 进入存放解压后的opencv文件夹,新建一个空的文件夹release,进入该文件夹,编译安装opencv,使用命令如下:

mkdir release
cd release
cmake -G "Unix Makefiles" ..
make
sudo make install
4. 安装好的lib文件存放在“/usr/local/lib”文件夹,h文件存放在“/usr/local/include”。
至此,opencv for Mac 安装完毕,参考的网址如下:
http://docs.opencv.org/doc/tutorials/introduction/linux_install/linux_install.html#linux-installation
http://tilomitra.com/opencv-on-mac-osx/

二、在MAC下使用OpenCV

1. 新建DisplayImage.cpp文件,代码如下

#include <cv.h>
#include <highgui.h>
using namespace cv;
int main( int argc, char** argv )

Mat image;
image = imread( argv[1], 1 );

if( argc != 2 || !image.data )

printf( "No image data \n" );
return -1;


namedWindow( "Display Image", CV_WINDOW_AUTOSIZE );
imshow( "Display Image", image );

waitKey(0);

return 0;


2. 新建CMakeLists.txt文件,代码如下:

project( DisplayImage )
find_package( OpenCV REQUIRED )
add_executable( DisplayImage DisplayImage )
target_link_libraries( DisplayImage $OpenCV_LIBS )

3. 编译两个文件

cd <DisplayImage_directory>

cmake .
make
4. 运行编译好的结果

./DisplayImage lena.jpg

三、在XCode中使用OpenCV

1. 创建一个空的command line工程。
2. 在main.cpp中粘贴以下代码:
//
// main.cpp
// FbyCharacterNormalization
//
// Created by Boyuan Feng on 13-1-24.
// Copyright (c) 2013年 Boyuan Feng. All rights reserved.
//

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv/cvaux.hpp>
#include <fstream>
using namespace std;

#define BYTE unsigned char

int main(int argc, const char * argv[])

// insert code here...
#if 1
//get the image from the directed path
IplImage* img = cvLoadImage("/Users/boyuanfeng/aaa.bmp", 1);
//NSLog(img);
//create a window to display the image
cvNamedWindow("picture", 1);
//show the image in the window
cvShowImage("picture", img);
//wait for the user to hit a key
cvWaitKey(0);
//delete the image and window
cvReleaseImage(&img);
cvDestroyWindow("picture");
#endif
//return
return 0;


3. 添加lib文件:右键点击工程名,选择“Add files to..”,在文件选择对话框弹出来时输入“/”,在弹出的路径框中输入:/usr/local/lib,全选该文件夹下的全部dylib文件,添加至工程。
5. 添加lib文件查找支持: 点击工程名文件,进入“Build Settings”选项卡,在“Library Search Paths”栏中输入“/usr/local/lib”
6. 添加头文件:点击工程名文件,进入“Build Settings”选项卡,在“Header Search Paths”栏中输入:“/usr/local/include /usr/local/include/opencv”
7. 编译运行整个工程,运行成功~~

四、在Eclipse中使用OpenCV

1. 按照正常的步骤,使用eclipse建立一个Mac C++工程,包含一个cpp文件,代码如xcode中的代码相同即可。
2. 右击工程名, 选择“Properties”,在属性配置页中选择,点击C/C++ Build, 在下拉选项中选择 Settings. 在右边的选项卡中选择 Tool Settings。
3. 在GCC C++ Compiler选项列表中选择Includes,在Include paths(-l)中添加安装好的opencv的头文件存放目录:/usr/local/include/
4. 在MacOS X C++Linker选项列表中选择Library,在Library search path (-L)中添加安装好的opencv Lib文件存放目录:/usr/local/lib/
5. 在MacOS X C++Linker选项列表中选择Library, 在Libraries(-l) 中依次点击“+”号,添加需要使用的Lib文件(通常情况下,使用前三个):
opencv_core opencv_imgproc opencv_highgui opencv_ml opencv_video opencv_features2d opencv_calib3d opencv_objdetect opencv_contrib opencv_legacy opencv_flann
6. 重新build all工程

Xcode+OpenCV-ios做一个简(nao)单(can)的磨皮App

一、引言

真的早就早就想学ios和opencv一起用了!!买iphone8p也是为了能调试的方便一些,实习的时候就早早在公司领了Mac Book Pro,今天终于下手了,不过真的特别特别特别的简单...就是玩玩儿~

二、安装&配置环境

  1. 下载

首先我的系统环境是:

Xcode是在App store下载的最新版本10.1,本来mac系统是10.13.4的,死活安装不了最新版本的xcode,appstore只有最新版本的xcode,不在appstore下载的话又很麻烦,还是一键升级了系统。OpenCV是在官网下载的opencv for ios ,链接在这:

Releases - OpenCV library ,既然要用,肯定是用最新的,功能最多呀,所以我下载了4.0.0的,beta版本可能不太稳定。

所以现在的系统配置是high sierra 10.13+xcode10.1+OpenCV4.0

2. 配置

打开mac,新建ios single View App

Xcode+OpenCV-ios做一个简(nao)单(can)的磨皮App
Xcode+OpenCV-ios做一个简(nao)单(can)的磨皮App

完了之后把下载的OpenCV2.framework添加到项目中去,具体位置为:

Xcode+OpenCV-ios做一个简(nao)单(can)的磨皮App

好了,到此位置环境配置完毕,下面就可以愉快的写代码了。

三、程序实现

我虽然不懂ios开发,一窍不通,但我会google啊,不能翻墙的时候我还可以baidu呀。

主要需要添加代码的文件为下图所示,注意,该文件的后缀需要被手动修改为.mm,这是因为该源文件中涉及到OC和C++两种语言的混编。

Xcode+OpenCV-ios做一个简(nao)单(can)的磨皮App


和在C++中一样,首先需要添加各种需要的头文件

#import <opencv2/opencv.hpp>#import <opencv2/imgproc/types_c.h>#import <opencv2/imgcodecs/ios.h>#import <opencv2/videoio/cap_ios.h>#import "ViewController.h"

然后就是ios界面编程的一些框架,这些我也不是很熟悉,主要是靠百度:

@interface ViewController ()<CvVideoCameraDelegate>{
    UIImageView *cameraView;
    CvVideoCamera *videoCamera;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    cameraView = [[UIImageView alloc] initWithFrame:self.view.frame];
    [self.view addSubview:cameraView];
    
    videoCamera = [[CvVideoCamera alloc] initWithParentView:cameraView];
    videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionFront;
    videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset640x480;
    videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait;
    videoCamera.defaultFPS = 30;
    videoCamera.grayscaleMode = NO;
    videoCamera.delegate = self;
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [videoCamera start];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [videoCamera stop];
}

#pragma mark -  CvVideoCameraDelegate
- (void)processImage:(cv::Mat&)image {
    //在这儿我们将要添加图形处理的代码
}
@end


看见上面最后一个函数里面的注释没?在这添加图像处理的代码,这块是我熟悉的内容。这个程序的功能主要是想实现一个磨皮的效果,所以使用最简单的双边滤波函数,该函数的圆形可见官网的描述:

具体处理代码如下:

#pragma mark -  CvVideoCameraDelegate
- (void)processImage:(cv::Mat&)image {
    //在这儿我们将要添加图形处理的代码
    cv::Mat image_copy;
    cv::Mat outImage;
    image_copy = image.clone();
    
    image_copy.convertTo(image_copy, CV_8UC3);
    //cv::cvtColor(image, image_copy, CV_BGR2GRAY);
    cv::bilateralFilter(image_copy, outImage, 25, 25*2, 25/2);
    
//    //首先将图片由RGBA转成GRAY
//    cv::cvtColor(image, image_copy, cv::COLOR_BGR2GRAY);
//    //反转图片
//    cv::bitwise_not(image_copy, image_copy);
//    //将处理后的图片赋值给image,用来显示
    //cv::cvtColor(outImage, image, cv::COLOR_GRAY2BGR);
    
    image = outImage.clone();//这里必须把处理完的图片在拷贝给image,只有image才能在iphone界面中显示
}
@end

遇到的问题

第一次使用ios开发,上面的代码没啥问题,但是build 成功后run失败了,在debug界面看到这样的信息:

This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.

没法获得相机权限,难怪平时使用新的app的时候都会询问是否给访问相机的权限给该app,手动修改方法:

打开项目的info.plist,用文本编辑器打开即可,插入以下键值:

<key>NSCameraUsageDescription</key>    
<string>此 APP 想访问您的相机</string>

然后再build,选择真机,就ok啦,效果如下图:

Xcode+OpenCV-ios做一个简(nao)单(can)的磨皮App

然后磨皮之后的图片就是这种效果啦:

啊呸,怎么可能啊,真实的效果是这样的。。。

可以看出,磨皮的效果是有的,双边滤波就是最粗暴的磨皮手段之一了,我参数也没好好条,懒得调了,还有,不要问我为什么是黑白的,我还没搞清楚iPhone显示的图片和OpenCV中的Mat矩阵的关系,只能一步步来了~~

以上是关于OpenCV-IOS 在Xcode中使用时,除了把opencv2.framework拉入项目中,还需要做啥,的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV-iOS框架的导入与配置

删除 Bridging Header 后从 Interface Builder 拖动时 Xcode 崩溃

在 xcode 中的断点处停止时,Mac 音频停止

缺少 Xcode 核心数据模型

使用Xcode把项目托管到GitHub

如何使用 Xcode 和 Swift 在我的导航栏中添加标题?