iOS 下基于OpenCV 的全景圖像拼接

需求

公司做航拍飛行器的控制app,app還包括一些圖像方面的處理。這次的是 全景圖像拼接合成,大概功能就是app上一個(gè)按鈕,點(diǎn)擊后發(fā)給飛控板,航拍器接收到后會(huì)水平旋轉(zhuǎn)拍幾張圖片,然后將拍攝的照片合成。

思路

移動(dòng)端也沒啥思路,問了下做算法的師兄,說(shuō)OpenCV直接有處理類。

stitching

網(wǎng)上查了下資料,就跟著弄了起來(lái),結(jié)果還不錯(cuò)。

效果


1
2
3
4
全景

用過(guò)好幾款航拍器,這款拍出來(lái)的效果是最好的,帶云臺(tái)的。不理解啥是帶云臺(tái)的也沒關(guān)系,就是合成的所有照片盡量同一水平合成效果就會(huì)很不錯(cuò)。細(xì)節(jié)上面好像是模糊了一些,并且在實(shí)際測(cè)試中合成圖片過(guò)多的話會(huì)出現(xiàn)掛掉的情況。

具體實(shí)現(xiàn)

這里我用的OpenCV的版本是3.3.0?

#import <opencv2/stitching.hpp>

#import?<opencv2/imgcodecs/ios.h>? 這個(gè)是Mat和image轉(zhuǎn)換的

```

-(void)stitchImage:(NSArray*)images{

? ? vector imgs;

? ? for(NSIntegeri =0; i < images.count; i++) {

? ? ? ? Matimage;

? ? ? ? UIImageToMat(images[i], image);

? ? ? ? cvtColor(image, image,CV_RGBA2RGB);

? ? ? ? imgs.push_back(image);

? ? }

? ? Matpano;

? ? Stitcherstitcher =Stitcher::createDefault(false);

? ? Stitcher::Statusstatus = stitcher.stitch(imgs, pano);//拼接

? ? if(status !=Stitcher::OK){//判斷拼接是否成功

? ? ? cout << "Can't stitch images, error code = " << int(status) << endl;

? ? }

? ? UIImage*targetImage =MatToUIImage(pano);

}

```

代碼就在上面了,也很容易理解。但是剛開始實(shí)際跑起來(lái)還是遇到了一些問題。

1.報(bào)錯(cuò)"cvflann::anyimpl::bad_any_cast",google了也有很多人碰到了相同的情況,但是解決辦法卻不相同。最后看了一篇文章在“opencv_modules.cpp”文件中的“#define HAVE_OPENCV_FLANN”改成“#undef HAVE_OPENCV_FLANN”


修改

2.報(bào)錯(cuò)“image.type() == CV_CU83", 說(shuō)應(yīng)該是圖片不是三通道的錯(cuò)誤。添加了這一行”"cvtColor(image, image,CV_RGBA2RGB);"

總結(jié)

其實(shí)這只是簡(jiǎn)單實(shí)現(xiàn),還有很多需要完整。例如分析合成的效率和GPU,看看最大合成情況。這里的圖片輸入也可以直接傳入視頻流YUV轉(zhuǎn)Mat。最后輸出的圖片也可以想想怎么能剪裁出最大可視范圍,而不是有黑邊棱角的。像下面這樣:

全景剪裁后

并且也要熟悉opencv,不求看懂算法,但里面的顏色轉(zhuǎn)換,Mat矩陣定義都可以去了解。下次用的時(shí)候也不會(huì)陌生。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容