1. 程式人生 > >使用opencv,實現旋轉相機影象拼接

使用opencv,實現旋轉相機影象拼接

由於專案需要,其中一部分功能是需要實現360度旋轉相機的影象拼接顯示功能,於是使用opencv來將其實現。

由於旋轉相機,可以將其看成只有x和y方向上的平移,其中x方向重疊畫素比較多即平移比較多,y方向只有少量平移。

 

如上圖所示:待拼接的影象解析度為800*600;只在xy上有平移。

步驟一:通過畫圖軟體開啟檢視畫素,大概估計出重疊區域大小。

如右邊圖所示,我選擇的是左幀的A區域,和右幀的B區域。A為120*600,B為100*580。

步驟二:使用opencv的matchTemplate函式(其中輸入分別為A,B區域),通過TM_CCORR_NORMED相關操作計算出最大響應值,從而得到偏移量。

步驟三:得到偏移量之後,就能得到左右兩張影象的重疊區域。通過左右的重疊區域,需要經過過度化處理,來消除拼接縫隙。過度程式碼如下所示。

Mat overlay1 = image1(Rect(800 - image_source_width + maxLoc.x, 0, image_source_width - maxLoc.x, image1.rows - 10 + maxLoc.y));  //左邊區域
Mat overlay2 = image2(Rect(0, 10 - maxLoc.y, image_source_width - maxLoc.x, image2.rows - 10 + maxLoc.y)); //右邊區域
Mat overlay = Mat::zeros(overlay2.rows, overlay2.cols, CV_8UC1);
for (int i = 0; i< overlay2.rows; i++)
{
	uchar* dataoverlay1 = overlay1.ptr(i);
	uchar* dataoverlay2 = overlay2.ptr(i);
	uchar* dataoverlay = overlay.ptr(i);
	for (int j = 0; j<overlay2.cols; j++)
	{
	    double weight;
	    weight = (double)j / overlay2.cols;  //隨距離改變而改變的疊加係數
	    dataoverlay[j] = (1 - weight)*dataoverlay1[j] + weight*dataoverlay2[j];
	}
}

步驟四:由於拼接全景相機,要求實時的顯示,不能全部拼接完才顯示,所以需要將重疊區域,移植到左幀,並顯示該幀。

拼接影象的前3幀和最後完成的結果如下圖所示:

       

實現程式碼連結如下:

https://download.csdn.net/download/u010440456/10787450