(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
尝试进行debug,但是opencv,release的源码应该不会出现这样低级的错误,所以跟踪源码分析,也得不到解决。我就在这上面浪费了很多时间。出现这些问题,肯定还是配置的环境问题,或者库有问题。我后来重新编译了opencv的库,就解决了这个问题。
供大家交流学习吧,少做无用功。
reference: 以下是opencv学习需要经常访问的站点
official website : www.opencv.org