PP.AGPP电子图书馆的快捷键有哪些

Swift 使用OpenCV2进行图片拼接(将多张照片合并成全景图)-ios7教程-手机开发-壹聚教程网Swift 使用OpenCV2进行图片拼接(将多张照片合并成全景图)
我们来看一篇Swift 使用OpenCV2进行图片拼接(将多张照片合并成全景图)的例子,有兴趣了解ios开发之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()
名称:大小:9.96MM下载:
上一页: &&&&&下一页:相关内容当前位置:
& Swift - 使用OpenCV2进行图片拼接(将多张照片合并成全景图)
Swift - 使用OpenCV2进行图片拼接(将多张照片合并成全景图)
发布:hangge
阅读:3572
1,OpenCV介绍
OpenCV的全称是:Open Source Computer Vision Library。是一个开源的跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法。
其应用领域有:
1、人机互动
2、物体识别
3、图像分割
4、人脸识别
5、动作识别
6、运动跟踪
8、运动分析
9、机器视觉
10、结构分析
11、汽车安全驾驶
2,使用OpenCV进行图片拼接
下面通过一个样例演示如何使用OpenCV将多张照片拼接成一个全景图。注意:照片与照片间要有重合的部分,这样就能通过OpenCV进行分析识别,从而实现自动拼接。
(1)下面是拍的几张原始照片
(2)下面是拼接后的照片
3,操作步骤
(1)首先下载最新的OpenCV框架:。并将其添加到项目中来。
(2)下载第三方的Objective-C封装类:
由于我们需要使用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)
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()
源码下载:1883人阅读
OpenCV(50)
Opencv中自带的Stitcher类可以实现全景图像,效果不错。下边的例子是Opencv Samples中的stitching.cpp的简化,源文件可以在这个路径里找到:
\opencv\sources\samples\cpp\stitching.cpp
#include &fstream&
#include &opencv2/highgui/highgui.hpp&
#include &opencv2/stitching/stitcher.hpp&
#include &iostream&
vector&Mat& //保存拼接的原始图像向量
//导入所有原始拼接图像函数
void parseCmdArgs(int argc, char** argv);
int main(int argc, char* argv[])
//导入拼接图像
parseCmdArgs(argc, argv);
Stitcher stitcher = Stitcher::createDefault(false);
Stitcher::Status status = stitcher.stitch(imgs, pano);//拼接
if (status != Stitcher::OK) //判断拼接是否成功
cout && &Can't stitch images, error code = & && int(status) &&
return -1;
namedWindow(&全景拼接&,0);
imshow(&全景拼接&,pano);
imwrite(&D:\\全景拼接.jpg&,pano);
waitKey();
//导入所有原始拼接图像函数
void parseCmdArgs(int argc, char** argv)
for(int i=1;i&i++)
Mat img = imread(argv[i]);
if (img.empty())
cout && &Can't read image '& && argv[i] && &'\n&;
imgs.push_back(img);
5个图片的拍摄角度合起来在180°左右,没有经过压缩的,下载下来可以直接测试使用,传入顺序随意,Stitcher会自动排列。全景拼接效果很赞:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:185348次
积分:3505
积分:3505
排名:第8201名
原创:154篇
评论:166条
阅读:5305
文章:51篇
阅读:94693opencv 基于sift的多张图片全景图拼接
opencv 基于sift的多张图片全景图拼接
计算机视觉 opencv
这里是基于sift来寻找特征点经行图像的匹配的原理来进行图像拼接的,具体步骤如下:
1、利用sift特征探测器来检测出两幅图片的sift特征点
2、根据上一步提取到的特征点来提取特征向量,使用SiftDescriptorExtractor对完成特征向量提取的工作,通过他对关键点周围邻域内的像素分块进行梯度运算,得到128维的特征向量
3、进行特征向量临近匹配,找到两幅图之间相互匹配的特征点
匹配之后的结果如下图:(2张图片的)
4、在第一次匹配的基础上再进行筛选,算出匹配的特征向量之间的距离,然后只去向量距离小于2倍的最小距离的特征点
这样得到的结果为:
5、通过随机抽样一致RANSAC算法找出特征点之间的映射关系,求出单应矩阵H
6、判断两幅图在结果图中的左边还是右边,这里是根据特征点在图像的位置来判断的,求出图像上特征点的坐标大于图像宽的一半的特征点数量与总的特征点数量的比值,比值大的就是在结果图的右边
7、把第步算得的右图经过透视转换转换到结果图中,这里要使用单应矩阵再把计算得到的左图放到结果图中:
部分拼接结果:
源代码为:(为了方便测试我把图像都命名为1.jpg 2.jpg .......)
#include &opencv2/opencv.hpp&
#include&opencv2/nonfree/nonfree.hpp&
#include&opencv2/legacy/legacy.hpp&
#include&vector&
#include&iostream&
#include&sstream&
#include&string&
#include&time.h&
Mat Stitched(Mat img1, Mat img2) {
Mat g1(img1, Rect(0, 0, img1.cols, img1.rows));
Mat g2(img2, Rect(0, 0, img2.cols, img2.rows));
cvtColor(g1, g1, CV_BGR2GRAY);
cvtColor(g2, g2, CV_BGR2GRAY);
SiftFeatureD
vector&KeyPoint&kp1, kp2;
SiftDescriptorE
Mat descriptor1, descriptor2;
FlannBasedM
vector&DMatch& matches,
/*进行特征点提取*/
siftdet.detect(g1, kp1);
siftdet.detect(g2, kp2);
/* 进行特征向量提取 */
pute(g1, kp1, descriptor1);
pute(g2, kp2, descriptor2);
/* 进行特征向量临近匹配 */
matcher.match(descriptor1, descriptor2, matches);
/*画出第一次匹配的结果*/
drawMatches(img1, kp1, img2, kp2,
matches, firstmatches, Scalar::all(-1), Scalar::all(-1),
vector&char&(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
imshow(&first_matches&, firstmatches);
/* 下面计算向量距离的最大值与最小值 */
double max_dist = 0; double min_dist = 1000;
for (int i = 0; i & descriptor1. i++) {
if (matches[i].distance & max_dist) {
max_dist = matches[i].
if (matches[i].distance & min_dist) {
min_dist = matches[i].
cout && &The max distance is: & && max_dist &&
cout && &The min distance is: & && min_dist &&
for (int i = 0; i & descriptor1. i++) {
if (matches[i].distance & 2 * min_dist) {
goodmatches.push_back(matches[i]);
/*第二次筛选后的结果*/
drawMatches(img1, kp1, img2, kp2,
goodmatches, img_matches, Scalar::all(-1), Scalar::all(-1),
vector&char&(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
imshow(&good_matches&, img_matches);
vector&Point2f& keypoints1, keypoints2;
for (int i = 0; i & goodmatches.size(); i++) {
keypoints1.push_back(kp1[goodmatches[i].queryIdx].pt);
keypoints2.push_back(kp2[goodmatches[i].trainIdx].pt);
/*计算单应矩阵*/
Mat H = findHomography(keypoints1, keypoints2, CV_RANSAC);
Mat stitchedI
int mRows = img2.
if (img1.rows& img2.rows)
mRows = img1.
/*判断图像在左边还是在右边*/
int propimg1 = 0, propimg2 = 0;
for (int i = 0; i & goodmatches.size(); i++) {
if (kp1[goodmatches[i].queryIdx].pt.x & img1.cols / 2) {
propimg1++;
if (kp2[goodmatches[i].trainIdx].pt.x & img2.cols / 2) {
propimg2++;
bool flag =
if ((propimg1 / (goodmatches.size() + 0.0)) & (propimg2 / (goodmatches.size() + 0.0))) {
imgleft = img1.clone();
imgleft = img2.clone();
if (flag) {
imgright = img2.clone();
imgright = img1.clone();
/*把上边求得的右边的图像经过矩阵H转换到stitchedImage中对应的位置*/
warpPerspective(imgright, stitchedImage, H, Size(img2.cols + img1.cols, mRows));
/*把左边的图像放进来*/
Mat half(stitchedImage, Rect(0, 0, imgleft.cols, imgleft.rows));
imgleft.copyTo(half);
return stitchedI
int main() {
Mat img1 = imread(&1.jpg&);
cout && &Dataset2& &&
cout && &请输入想拼接的图片数量(大于1小于18)& &&
cout && &输入成功,开始计时& &&
clock_t start,
start=clock();
resize(img1, img1, Size(img1.cols / 4, img1.rows / 4));
for (int k = 2; k &= k++) {
string filename = str + &.jpg&;
cout && &正在拼接.......& && filename &&
Mat img = imread(filename);
resize(img, img, Size(img.cols / 4, img.rows / 4));
stitchedImage = Stitched(img1, img);
img1 = stitchedI
finish = clock();
totaltime = (double)(finish - start) / CLOCKS_PER_SEC;
cout && &拼接成功& &&
cout && &拼接花费总时间为:& && totaltime && &秒!& &&
imshow(&ResultImage&, stitchedImage);
imwrite(&ResultImage.jpg&, stitchedImage);
waitKey(0);
我的热门文章
即使是一小步也想与你分享本文讲的是Swift 使用OpenCV2进行图片拼接(将多张照片合并成全景图),
1,OpenCV介绍
OpenCV的全称是:Open Source Computer Vision Library。是一个开源的跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法。
其应用领域有: 1、人机互动 2、
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)
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()
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
objective-c
opencv 720全景图拼接、opencv 全景图拼接、鱼眼 全景图 opencv、球面全景图 opencv、opencv 全景图,以便于您获取更多的相关知识。
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
RDS是一种稳定可靠、可弹性伸缩的在线数据库服务。支持MySQL、SQL Server、PostgreSQL、高...
云栖社区()为您免费提供相关信息,包括
的信息,还有opencv 720全景图拼接、opencv 全景图拼接、鱼眼 全景图 opencv、球面全景图 opencv、opencv 全景图等
,所有相关内容均不代表云栖社区的意见!

我要回帖

更多关于 PP电子图书馆 的文章

 

随机推荐