OpenCV-IOS 在Xcode中使用时,除了把opencv2.framework拉入项目中,还需要做啥,
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV-IOS 在Xcode中使用时,除了把opencv2.framework拉入项目中,还需要做啥,相关的知识,希望对你有一定的参考价值。
为什么编译错误, <opencv2/opencv.hpp> not found
参考技术A 一、安装OpenCV for MAC1. 首先下载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,今天终于下手了,不过真的特别特别特别的简单...就是玩玩儿~
二、安装&配置环境
下载
首先我的系统环境是:
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
完了之后把下载的OpenCV2.framework添加到项目中去,具体位置为:
好了,到此位置环境配置完毕,下面就可以愉快的写代码了。
三、程序实现
我虽然不懂ios开发,一窍不通,但我会google啊,不能翻墙的时候我还可以baidu呀。
主要需要添加代码的文件为下图所示,注意,该文件的后缀需要被手动修改为.mm,这是因为该源文件中涉及到OC和C++两种语言的混编。
和在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啦,效果如下图:
然后磨皮之后的图片就是这种效果啦:
啊呸,怎么可能啊,真实的效果是这样的。。。
可以看出,磨皮的效果是有的,双边滤波就是最粗暴的磨皮手段之一了,我参数也没好好条,懒得调了,还有,不要问我为什么是黑白的,我还没搞清楚iPhone显示的图片和OpenCV中的Mat矩阵的关系,只能一步步来了~~
以上是关于OpenCV-IOS 在Xcode中使用时,除了把opencv2.framework拉入项目中,还需要做啥,的主要内容,如果未能解决你的问题,请参考以下文章