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

Posted 一支程序媛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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矩阵的关系,只能一步步来了~~

以上是关于Xcode+OpenCV-ios做一个简(nao)单(can)的磨皮App的主要内容,如果未能解决你的问题,请参考以下文章

将 Nao 机器人与 Azure 连接

OpenCV-iOS框架的导入与配置

使用 NAO 执行远程音频处理时出现问题

使用 python 让 nao 机器人说出存储在变量中的内容

Pepper 和 NAO 机器人的远程视频流

带有 Nao 机器人的 Websocket 双向概念