引用自:
http://www.reibang.com/p/b398da410451
因為OpenCV是用C++編寫的氓润,所以只能用.mm來使用薯鳍,然后再用bridging-header.h來轉(zhuǎn)到swift里來使用。
文件
OpenCVUtil.h
#import <Foundation/Foundation.h>
@class UIImage;
@interface OpenCVUtil : NSObject
+(UIImage *) convertImage:(UIImage *)image;
@end
OpenCVUtil.mm
//下面的#ifdef只能放在上面采章,如果放在#import "OpenCVUtil.h"下面就出錯壶辜。
#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#import <opencv2/imgproc/types_c.h>
#import <opencv2/imgcodecs/ios.h>
#endif
#import "OpenCVUtil.h"
using namespace cv;
@implementation OpenCVUtil
+(UIImage *) convertImage:(UIImage *)image{
Mat cvImage;
UIImageToMat(image, cvImage);
if (!cvImage.empty()) {
Mat gray;
//將圖像轉(zhuǎn)成灰度顯示
cvtColor(cvImage, gray, CV_RGB2GRAY);
//應(yīng)用高斯濾波器出除小的邊緣
GaussianBlur(gray, gray, cv::Size(5,5), 1.2,1.2);
//計算與畫布輪廓
Mat edges;
Canny(gray, edges, 0, 50);
//使用白色填充
cvImage.setTo(Scalar::all(100));
//修改輪廓顏色 scalar 四個屬性分別是R G B Alpha
cvImage.setTo(Scalar(255,0,225,255),edges);
//將Mat轉(zhuǎn)換成UIImageView
return MatToUIImage(cvImage);
//用gray來轉(zhuǎn)出UIImage,只能得到灰度圖,不像上面的可以用彩色抵怎。
// gray.setTo(Scalar::all(225));
// gray.setTo(Scalar(0,255,0,255),edges);
// return MatToUIImage(gray);
}
return nil;
}
@end
HumanFaceRecognition-Bridging-Header.h
#import "OpenCVUtil.h"
ViewController.swift
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let image = OpenCVUtil.convert(#imageLiteral(resourceName: "circle"))
let iv = UIImageView(image: image)
iv.frame.origin = CGPoint(x: 20, y: 20)
iv.frame.size = CGSize(width: 200, height: 200)
view.addSubview(iv)
}
}
結(jié)果:
原圖
處理后的