(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