opencv2.4.10+vs2008实现图像的拼接

(1)环境配置:window7+visual studio 2008 + opencv2.4.10

因为最近在做wince7的开发,所以PC上装了vs2008,现在想研究一下视频的拼接。首先自然想到的是opencv. 所以搭建一个环境,先入门一下。

(2)安装opencv

从官网download最新的opencv版本,release最新的beta版本是3.0了,2014.11.11发布的,还是选个较前一点的版本,这里选了2.4.10

 http://opencv.org/downloads.html  下载for windows,  是个exe文件,直接安装就好啦,其实该应用程序也就是对opencv进行了解压。下面有源码,以及已经针对某些平台编译好的库。可以预览一下。opencv目录下有两个目录,一个build目录,一个source目录。毫无疑问,build下面应该有编译好的库,source下面有开放的源码,今后用来学习。

然后查看build目录下:

---doc //一些说明文档

---include //opencv的头文件

---java

---python

---x64

---x86 //针对X86平台编译好的库

很好,我需要用到的是x86下面的东西。再进去看一下。下面有针对visual studio 不同版本的编译好的bin 和dll.  

---x86

---vc10 //对应vs2010

---vc11 //这应该是对应vs2012

---vc12   //这对应vs2013平台

这个缩写和对应,为什么是这样的,我也不知道MS是怎么弄的。  不过可以肯定是的vs2008.  对应的是vc9. 所以这里的库用在vs2008 IDE中,是有可能出问题的。

(3)编译opencv (根据自己的需要)

opencv2.0以后,编译管理好像都用cmake了吧,管他,反正用cmake编译opencv是挺方便的。所以自行安装一个cmake吧。

http://www.cmake.org/cmake/resources/software.html

运行cmake, 只需简单的四步就可以啦。编译过程详细步骤可以参考下面一个链接,里面附图都很清晰。

(4)vs2008中配置opencv的支持

以上两个任务参考这里吧,写的很详细:http://wiki.opencv.org.cn/index.php/VC_2008_Express%E4%B8%8B%E5%AE%89%E8%A3%85OpenCV2.3.1 这里就不累赘了。

(5)创建一个win32控制台程序来跑一下拼接算法。

先给出测试源码吧。

<pre name="code" class="cpp">#include "stdafx.h"

#include < stdio.h >  
#include < opencv2\opencv.hpp >  
#include < opencv2\stitching\stitcher.hpp >

#ifdef _DEBUG  
#pragma comment(lib, "opencv_core2410d.lib")   
#pragma comment(lib, "opencv_imgproc2410d.lib")   //MAT processing  
#pragma comment(lib, "opencv_highgui2410d.lib")  
#pragma comment(lib, "opencv_stitching2410d.lib");
#else  
#pragma comment(lib, "opencv_core2410.lib")  
#pragma comment(lib, "opencv_imgproc2410.lib")  
#pragma comment(lib, "opencv_highgui2410.lib")  
#pragma comment(lib, "opencv_stitching2410.lib");
#endif  

using namespace cv;  
using namespace std;


void main()  
{
	 vector< Mat > vImg;
	 Mat rImg,Img;
	 Img = imread("A1.jpg");
	 if(!Img.data)
	 {
		cout<<"the image is not exist!"<<endl;
		return;
	 }
	 vImg.push_back(imread("A2.jpg"));
	 vImg.push_back(imread("A3.jpg"));

	  Stitcher stitcher = Stitcher::createDefault();


	 unsigned long AAtime=0, BBtime=0;  //check processing time
	 AAtime = getTickCount();			//check processing time

	 stitcher.stitch(vImg, rImg);

	 BBtime = getTickCount();			//check processing time 
	 printf("%.2lf sec \n",  (BBtime - AAtime)/getTickFrequency() ); //check processing time

	 resize(rImg,rImg,Size(480,640),0,0,CV_INTER_LINEAR);
	 namedWindow("result");
	 imshow("result", rImg);

	 waitKey(0);

}  

 
 

A1.jpg

A2.jpg

A3.jpg

拼接结果如下:

拼接费时:

我用opencv自带的图进行拼接,效果还挺好的,这是用手机随时拍的三张图片,第一张照片没有拼接进去。而且这个算法时间也是无法让人接受的,接下来就是需要进行优化了。

遇到的问题:

(1)imread 不能读取图片,用cvLoadImage可以读取。

这里可以确定是库的问题,找了很多原因,后来归结还是库的问题。

 解决办法:

solution Explorer中,右键项目名,-->properties-->configuration properties->linker-->input-->additional dependencies

根据Active(Debug)或者Active(Realse)

debug,release 模式下选择的库是不一样的。以下是添加的debug需要依赖的库

opencv_core2410d.libopencv_highgui2410d.libopencv_imgproc2410d.libopencv_ml2410d.libopencv_stitching2410d.lib

release的库名都是不带"d"的。

另一种方法就是在源码中指定依赖的库如下:

#ifdef _DEBUG  
#pragma comment(lib, "opencv_core2410d.lib")   
#pragma comment(lib, "opencv_imgproc2410d.lib")   //MAT processing  
#pragma comment(lib, "opencv_highgui2410d.lib")  
#pragma comment(lib, "opencv_stitching2410d.lib");
#else  
#pragma comment(lib, "opencv_core2410.lib")  
#pragma comment(lib, "opencv_imgproc2410.lib")  
#pragma comment(lib, "opencv_highgui2410.lib")  
#pragma comment(lib, "opencv_stitching2410.lib");
#endif  


(2)编译程序通过,但是运行的时候,在运行stitcher.stitch(vImg, rImg)时,程序异常中止。提示的是double free或者 access readonly address等。

尝试进行debug,但是opencv,release的源码应该不会出现这样低级的错误,所以跟踪源码分析,也得不到解决。我就在这上面浪费了很多时间。出现这些问题,肯定还是配置的环境问题,或者库有问题。我后来重新编译了opencv的库,就解决了这个问题。


供大家交流学习吧,少做无用功。

reference:   以下是opencv学习需要经常访问的站点

official website : www.opencv.org

OpenCV Q&A forum:  http://answers.opencv.org 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值