Swift - 使用OpenCV2进行图片拼接(将多张照片合并成全景图)
1,OpenCV介绍
OpenCV的全称是:Open Source Computer Vision Library。是一个开源的跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法。
其应用领域有:
1、人机互动
2、物体识别
3、图像分割
4、人脸识别
5、动作识别
6、运动跟踪
7、机器人
8、运动分析
9、机器视觉
10、结构分析
11、汽车安全驾驶
2,使用OpenCV进行图片拼接
下面通过一个样例演示如何使用OpenCV将多张照片拼接成一个全景图。注意:照片与照片间要有重合的部分,这样就能通过OpenCV进行分析识别,从而实现自动拼接。
下面通过一个样例演示如何使用OpenCV将多张照片拼接成一个全景图。注意:照片与照片间要有重合的部分,这样就能通过OpenCV进行分析识别,从而实现自动拼接。
(1)下面是拍的几张原始照片
(2)下面是拼接后的照片
3,操作步骤
(1)首先下载最新的OpenCV框架:opencv2.framework.zip。并将其添加到项目中来。
(2)下载第三方的Objective-C封装类:OpenCVSwiftStitch
由于我们需要使用OpenCV,但Swift又不能直接调用C++。所以便需要使用Objective-C来做为中间层,让Swift通过Objective-C来调用OpenCV。
好在github上已经有人提供了相关的封装类,我们直接把如下文件导入到项目即可。
(3)记得把CVWrapper.h添加到桥接头文件bridge.h中
(4)下面使用就很简单了,把UIImage交给CVWrapper就可以了
#import "CVWrapper.h"
import UIKit class ViewController: UIViewController { @IBOutlet weak var imageView: UIImageView! @IBOutlet weak var spinner: UIActivityIndicatorView! override func viewDidLoad() { super.viewDidLoad() } override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) stitch() } func stitch() { //由于图片拼接很费时,显示环形进度条 self.spinner.startAnimating() //在后台队列拼接图片 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { let image1 = UIImage(named:"IMG_4247.JPG") let image2 = UIImage(named:"IMG_4248.JPG") let image3 = UIImage(named:"IMG_4249.JPG") let image4 = UIImage(named:"IMG_4250.JPG") let imageArray:[UIImage!] = [image1,image2,image3,image4] let stitchedImage:UIImage = CVWrapper.processWithArray(imageArray) as UIImage dispatch_async(dispatch_get_main_queue(), { self.imageView.image = stitchedImage //停止环形进度条效果 self.spinner.stopAnimating() }) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }源码下载:hangge_921.zip
怎么拼接竖直的图片呢,我拼接竖直的图片时,死循环,最后App被kill掉了
博主你的stitch函数会崩溃,一个原因是真机情况下jpg文件没匹配到为空(文件的JPG大写),另外一个是GCD里面UI操作不恰当
func stitch() {
//由于图片拼接很费时,显示环形进度条
self.spinner.startAnimating()
//在后台队列拼接图片
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
let image1 = UIImage(named:"IMG_4247.JPG")
let image2 = UIImage(named:"IMG_4248.JPG")
let image3 = UIImage(named:"IMG_4249.JPG")
let image4 = UIImage(named:"IMG_4250.JPG")
let imageArray:[UIImage!] = [image1,image2,image3,image4]
let stitchedImage:UIImage = CVWrapper.processWithArray(imageArray) as UIImage
dispatch_async(dispatch_get_main_queue(), {
self.imageView.image = stitchedImage
//停止环形进度条效果
self.spinner.stopAnimating()
})
}
}
这样就没问题了:)