| 論文閱讀模塊將分享點(diǎn)云處理,SLAM,三維視覺(jué),高精地圖相關(guān)的文章。公眾號(hào)致力于理解三維視覺(jué)領(lǐng)域相關(guān)內(nèi)容的干貨分享,歡迎各位加入我,我們一起每天一篇文章閱讀,開(kāi)啟分享之旅,有興趣的可聯(lián)系微信dianyunpcl@163.com。 單應(yīng)矩陣介紹 單應(yīng)性在計(jì)算機(jī)視覺(jué)領(lǐng)域是一個(gè)非常重要的概念,它在圖像校正、圖像拼接、俯視圖生成,相機(jī)位姿估計(jì)、視覺(jué)SLAM等領(lǐng)域有非常重要的作用。 單應(yīng)性(Homography)變換是將一幅圖像中的點(diǎn)映射到另一幅圖像中相應(yīng)點(diǎn)的變換關(guān)系: 單應(yīng)矩陣是一個(gè)3x3矩陣,具有8個(gè)自由度,通常為歸一化后表達(dá)式,其尺度為1。 下面展示了不同類型的變換,但都與兩個(gè)平面之間的變換有關(guān)。 (1)真實(shí)平面和圖像平面 (2)由兩個(gè)相機(jī)位置拍攝的平面 (3)圍繞其投影軸旋轉(zhuǎn)的相機(jī)采集的圖像進(jìn)行拼接 所以單應(yīng)性矩陣主要用來(lái)解決兩個(gè)問(wèn)題: 一是表述真實(shí)世界中一個(gè)平面與對(duì)應(yīng)它圖像的透視變換 二是從通過(guò)透視變換實(shí)現(xiàn)圖像從一種視圖變換到另外一種視圖 外參求解單應(yīng)矩陣?yán)碚?/span> 這里將主要講解以下已知兩個(gè)相機(jī)的位姿如何實(shí)現(xiàn)圖像的拼接,主要公式就是根據(jù)外參計(jì)算H矩陣。 單應(yīng)性將兩個(gè)平面之間的變換聯(lián)系起來(lái),這樣就可以計(jì)算出從第二個(gè)平面視圖轉(zhuǎn)到第一個(gè)平面視圖下相應(yīng)相機(jī)位移,在已知內(nèi)外參的情況下有 使用齊次坐標(biāo)系表達(dá)式將三維世界點(diǎn)轉(zhuǎn)轉(zhuǎn)到相機(jī)坐標(biāo)系下: 使用矩陣乘法可以輕松地將一圖像幀中表示的點(diǎn)轉(zhuǎn)換為另一幀圖像中:c1Mo是第一幀的位姿,c2Mo是第二幀的位姿。要將相機(jī)1中表示的三維點(diǎn)變換為相機(jī)2幀的坐標(biāo)下,其變換公式為: 以上公式對(duì)應(yīng)的是:同一平面兩個(gè)不同相機(jī)坐標(biāo)系的單應(yīng)矩陣。如果要同一平面計(jì)算出兩個(gè)圖像間的單應(yīng)矩陣H,則需要內(nèi)參,此時(shí)左邊乘以K,右邊乘以K的逆矩陣。 為了更好的理解,這里寫(xiě)了一個(gè)demo,并與上述的理論對(duì)應(yīng)(注意這里是將第二幀轉(zhuǎn)到第一幀的坐標(biāo)系下)。 Mat cameraMatrix = (Mat_<double>(3, 3) << 700.0, 0.0, 320.0,                       0.0, 700.0, 240.0,                       0, 0, 1);Mat R1 = c1Mo(Range(0, 3), Range(0, 3));Mat R2 = c2Mo(Range(0, 3), Range(0, 3)); //c1Mo * oMc2Mat R_2to1 = R1*R2.t();//同一平面兩個(gè)不同相機(jī)坐標(biāo)系的單應(yīng)矩陣// [compute-homography]Mat H = cameraMatrix * R_2to1 * cameraMatrix.inv();//同一平面計(jì)算出兩個(gè)圖像間的單應(yīng)矩陣HH /= H.at<double>(2, 2);//歸一化cout << "H:\n" << H << endl;根據(jù)求解的單應(yīng)矩陣實(shí)現(xiàn)兩個(gè)視圖的拼接實(shí)例顯示如下 拼接的結(jié)果如下: warpPerspective(img2, img_stitch, H, Size(img2.cols * 2, img2.rows));               Mat half = img_stitch(Rect(0, 0, img1.cols, img1.rows));完整代碼如下: void basicPanoramaStitching(const string &img1Path, const string &img2Path){ Mat img1 = imread("Blender_Suzanne1.jpg"); Mat img2 = imread("Blender_Suzanne2.jpg"); //! [camera-pose-from-Blender-at-location-1] Mat c1Mo = (Mat_<double>(4, 4) << 0.9659258723258972, 0.2588190734386444, 0.0, 1.5529145002365112,         0.08852133899927139, -0.3303661346435547, -0.9396926164627075, -0.10281121730804443,         -0.24321036040782928, 0.9076734185218811, -0.342020183801651, 6.130080699920654,         0, 0, 0, 1); //! [camera-pose-from-Blender-at-location-1] //! [camera-pose-from-Blender-at-location-2] Mat c2Mo = (Mat_<double>(4, 4) << 0.9659258723258972, -0.2588190734386444, 0.0, -1.5529145002365112,         -0.08852133899927139, -0.3303661346435547, -0.9396926164627075, -0.10281121730804443,         0.24321036040782928, 0.9076734185218811, -0.342020183801651, 6.130080699920654,         0, 0, 0, 1); //! [camera-pose-from-Blender-at-location-2] Mat cameraMatrix = (Mat_<double>(3, 3) << 700.0, 0.0, 320.0,         0.0, 700.0, 240.0,         0, 0, 1); Mat R1 = c1Mo(Range(0, 3), Range(0, 3)); Mat R2 = c2Mo(Range(0, 3), Range(0, 3)); //c1Mo * oMc2 Mat R_2to1 = R1*R2.t(); //! [compute-homography] Mat H = cameraMatrix * R_2to1 * cameraMatrix.inv(); H /= H.at<double>(2, 2); cout << "H:\n" << H << endl; //! [compute-homography] //! [stitch] Mat img_stitch; warpPerspective(img2, img_stitch, H, Size(img2.cols * 2, img2.rows)); Mat half = img_stitch(Rect(0, 0, img1.cols, img1.rows)); img1.copyTo(half); //! [stitch] Mat img_compare; Mat img_space = Mat::zeros(Size(50, img1.rows), CV_8UC3); hconcat(img1, img_space, img_compare); hconcat(img_compare, img2, img_compare); imshow("Compare images", img_compare); imshow("Panorama stitching", img_stitch); waitKey();        }以上是根據(jù)外參實(shí)現(xiàn)了同一相機(jī)不同位姿采集的圖像的拼接,其主要原理主要是根據(jù)外參計(jì)算出單應(yīng)性矩陣,將第二幀采集的圖像變換到第一幀視角下的結(jié)果,最終實(shí)現(xiàn)拼接。這里我想到了前視圖轉(zhuǎn)換俯視圖的方法,同樣也是變換視角的問(wèn)題,只是這里的俯視圖的虛擬相機(jī)的參數(shù)需要自己設(shè)置,有時(shí)間再更新。 資源 三維點(diǎn)云論文及相關(guān)應(yīng)用分享 【點(diǎn)云論文速讀】基于激光雷達(dá)的里程計(jì)及3D點(diǎn)云地圖中的定位方法 3D-MiniNet: 從點(diǎn)云中學(xué)習(xí)2D表示以實(shí)現(xiàn)快速有效的3D LIDAR語(yǔ)義分割(2020) win下使用QT添加VTK插件實(shí)現(xiàn)點(diǎn)云可視化GUI JSNet:3D點(diǎn)云的聯(lián)合實(shí)例和語(yǔ)義分割 大場(chǎng)景三維點(diǎn)云的語(yǔ)義分割綜述 PCL中outofcore模塊---基于核外八叉樹(shù)的大規(guī)模點(diǎn)云的顯示 基于三維卷積神經(jīng)網(wǎng)絡(luò)的點(diǎn)云標(biāo)記 基于超點(diǎn)圖的大規(guī)模點(diǎn)云分割 更多文章可查看:點(diǎn)云學(xué)習(xí)歷史文章大匯總 SLAM及AR相關(guān)分享 【開(kāi)源方案共享】ORB-SLAM3開(kāi)源啦! 【論文速讀】AVP-SLAM:自動(dòng)泊車系統(tǒng)中的語(yǔ)義SLAM 【點(diǎn)云論文速讀】StructSLAM:結(jié)構(gòu)化線特征SLAM AR設(shè)備單目視覺(jué)慣導(dǎo)SLAM算法綜述與評(píng)價(jià) Kimera實(shí)時(shí)重建的語(yǔ)義SLAM系統(tǒng) SLAM綜述(3)-視覺(jué)與慣導(dǎo),視覺(jué)與深度學(xué)習(xí)SLAM | 
|  | 
來(lái)自: 點(diǎn)云PCL > 《待分類》