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 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章