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进行分析识别,从而实现自动拼接。

 

(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中

#import "CVWrapper.h"

(4)下面使用就很简单了,把UIImage交给CVWrapper就可以了

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
             
            self.imageView.image = stitchedImage
             
            //停止环形进度条效果
            self.spinner.stopAnimating()
        }
    }
     
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

时间: 2024-10-29 09:45:03

Swift 使用OpenCV2进行图片拼接(将多张照片合并成全景图)的相关文章

PS怎么将多张照片制作成全景图?

  PS怎么将多张照片制作成全景图?          一.照片拍摄 1.制作全景图的前提就是拍摄多张连续的照片,此步骤就无法进行演示了,说几个拍摄的要点: 1)相机在拍摄过程中,要保持水平,最好有一个三脚架,保证水平仪处于水平的状态下,连续进行拍摄 2)连续的两张照片中,重合的部分不要太少,否则无法进行完美拼接.一般重合15%到20%即可 3)也可以把相机竖着放,相当于是纵向进行拍摄,这样拼接出的全景图就会上下很宽 二.拼接全景图 1.在ps中打开所需的全景图素材,如图 2.点击"窗口&quo

swift 如何使用数组创建按钮

问题描述 swift 如何使用数组创建按钮 数组里面是通过json解析的数据模型类,类里面有个字符串类型的属性,如何挨个取出里面的字符串设置成按钮的文字?我使用for in但是无法进入循环 解决方案 Swift之数组使用Swift数组的简单使用Swift 数组 解决方案二: 先把json转成NSDictionary 然后再循环

Swift 编程语言入门教程_Swift

原文地址:http://gashero.iteye.com/blog/2075324 目录 1   简介 2   Swift入门 3   简单值 4   控制流 5   函数与闭包 6   对象与类 7   枚举与结构 1   简介 今天凌晨Apple刚刚发布了Swift编程语言,本文从其发布的书籍<The Swift Programming Language>中摘录和提取而成.希望对各位的iOS&OSX开发有所帮助. Swift是供iOS和OS X应用编程的新编程语言,基于C和Obj

Swift心得笔记之函数_Swift

参数 外部变量名 一般情况下你可以不指定外部变量名,直接调用函数: 复制代码 代码如下: func helloWithName(name: String, age: Int, location: String) {     println("Hello \(name). I live in \(location) too. When is your \(age + 1)th birthday?") } helloWithName("Mr. Roboto", 5, &

iOS - Swift Swift 语言新特性

1.Swift 2.0 带来哪些新变化 常规变化: 1.OS X 10.11.iOS 9 和 watchOS 2 SDK 采纳了一些 Objective-C 的特性用来提高 Swift 的编程体验, 如可空性.类型化集合和一些别的特性. 2.编译器对冗余的协议一致性,未被使用的绑定值以及可以设为常量的变量这些情况目前会给予警告或报错. 3.修复了跨文件协议遵循时符号不可见或者重复的错误. 4.Swift 语言的调用约定更加智能,能够理解 API 所发生的变化和 Swift 所给出的警告. 5.便

光影魔术手制作组合图有什么用

  光影魔术手制作组合图的功能是专门为在网络上开店的用户制作的.可以轻松地把很多张照片合并成一张大照片,用于陈列说明商品.或者用于组图制作.预设了很多种布局方式(如2x2.3x3等).使用时可以同时打开很多张照片,可以随意决定显示隐藏哪张照片,可以对小照片分别进行简单的特效处理(如反转效果).

细数PHOTOSHOP CC那些逆天的后期修图新功能

  最新的Photoshop CC2015版有哪些摄影方面新功能?这可能是诸位摄影师比较关心的话题.本文中,李涛老师将为您介绍2015上半年以来,Photoshop CC在摄影方面增加的新功能.让我们在玩转后期的同时,一同升级起来! 2015年4月和6月,Adobe针对Photoshop CC进行了两次版本改进和升级.与摄影相关的更新较之2014版较少,但不乏重要的改进.其中三项重要的升级有HDR合并.全景合并.去雾霾功能. 其他方面与摄影相关的功能有:Adobe 图库上线,方便了素材的查找和设

用PS制作电影胶片效果

本文中我们用Photoshop将多张照片处理成连续胶片的特殊效果. 先看效果图: 效果图 一.新建文件,参数如图: 新建文件 二.复制背景层,在背景副本上选择矩形选框工具画一矩形,CTRL+J复制一层,选择--载入选区,填充黑色. 复制图层 三.不要取消选区,执行选择--修改--平滑,取样半径5. 平滑选区 四.执行选择--反选,DEL删除,矩形的四角变圆滑了,CTRL+D取消选区. 反选选区 五.编辑--定义画笔预设,可以自己取个合适的名字,我这里是样本画笔1. 设置画笔 六.关掉图层1的眼睛

iOS运行时(Runtime)总结

声明 本博客中文章不会在此处再更新,只会在微信公众号中更新,请关注微信公众号,以获取最新的学习资源和更多学习资源.本博文末尾有微信公众号二维码,扫一扫添加关注. 原文出自:微信公众号iOSDevShares的文章 引言 相信很多同学都听过运行时,但是我相信还是有很多同学不了解什么是运行时,到底在项目开发中怎么用?什么时候适合使用?想想我们的项目中,到底在哪里使用过运行时呢?还能想起来吗?另外,在面试的时候,是否经常有笔试中要求运用运行时或者在面试时面试官会问是否使用过运行时,又是如何使用的? 回