需求
公司做航拍飛行器的控制app椒楣,app還包括一些圖像方面的處理贡歧。這次的是 全景圖像拼接合成整胃,大概功能就是app上一個按鈕,點擊后發(fā)給飛控板拷获,航拍器接收到后會水平旋轉(zhuǎn)拍幾張圖片篮撑,然后將拍攝的照片合成。
思路
移動端也沒啥思路匆瓜,問了下做算法的師兄赢笨,說OpenCV直接有處理類未蝌。
網(wǎng)上查了下資料,就跟著弄了起來茧妒,結(jié)果還不錯萧吠。
效果
用過好幾款航拍器,這款拍出來的效果是最好的桐筏,帶云臺的怎憋。不理解啥是帶云臺的也沒關(guān)系,就是合成的所有照片盡量同一水平合成效果就會很不錯九昧。細節(jié)上面好像是模糊了一些绊袋,并且在實際測試中合成圖片過多的話會出現(xiàn)掛掉的情況。
具體實現(xiàn)
這里我用的OpenCV的版本是3.3.0?
#import <opencv2/stitching.hpp>
#import?<opencv2/imgcodecs/ios.h>? 這個是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);
}
```
代碼就在上面了铸鹰,也很容易理解癌别。但是剛開始實際跑起來還是遇到了一些問題。
1.報錯"cvflann::anyimpl::bad_any_cast"蹋笼,google了也有很多人碰到了相同的情況展姐,但是解決辦法卻不相同。最后看了一篇文章在“opencv_modules.cpp”文件中的“#define HAVE_OPENCV_FLANN”改成“#undef HAVE_OPENCV_FLANN”
2.報錯“image.type() == CV_CU83", 說應(yīng)該是圖片不是三通道的錯誤剖毯。添加了這一行”"cvtColor(image, image,CV_RGBA2RGB);"
總結(jié)
其實這只是簡單實現(xiàn)圾笨,還有很多需要完整。例如分析合成的效率和GPU,看看最大合成情況逊谋。這里的圖片輸入也可以直接傳入視頻流YUV轉(zhuǎn)Mat擂达。最后輸出的圖片也可以想想怎么能剪裁出最大可視范圍,而不是有黑邊棱角的胶滋。像下面這樣:
并且也要熟悉opencv板鬓,不求看懂算法,但里面的顏色轉(zhuǎn)換究恤,Mat矩陣定義都可以去了解俭令。下次用的時候也不會陌生。