美文网首页
iOS 下基于OpenCV 的全景图像拼接

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

作者: 兰州啊兰州 | 来源:发表于2019-12-27 10:55 被阅读0次

    需求

    公司做航拍飞行器的控制app,app还包括一些图像方面的处理。这次的是 全景图像拼接合成,大概功能就是app上一个按钮,点击后发给飞控板,航拍器接收到后会水平旋转拍几张图片,然后将拍摄的照片合成。

    思路

    移动端也没啥思路,问了下做算法的师兄,说OpenCV直接有处理类。

    stitching

    网上查了下资料,就跟着弄了起来,结果还不错。

    效果

    1 2 3 4 全景

    用过好几款航拍器,这款拍出来的效果是最好的,带云台的。不理解啥是带云台的也没关系,就是合成的所有照片尽量同一水平合成效果就会很不错。细节上面好像是模糊了一些,并且在实际测试中合成图片过多的话会出现挂掉的情况。

    具体实现

    这里我用的OpenCV的版本是3.3.0 

    #import <opencv2/stitching.hpp>

    #import <opencv2/imgcodecs/ios.h>  这个是Mat和image转换的

    ```

    -(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", 说应该是图片不是三通道的错误。添加了这一行”"cvtColor(image, image,CV_RGBA2RGB);"

    总结

    其实这只是简单实现,还有很多需要完整。例如分析合成的效率和GPU,看看最大合成情况。这里的图片输入也可以直接传入视频流YUV转Mat。最后输出的图片也可以想想怎么能剪裁出最大可视范围,而不是有黑边棱角的。像下面这样:

    全景剪裁后

    并且也要熟悉opencv,不求看懂算法,但里面的颜色转换,Mat矩阵定义都可以去了解。下次用的时候也不会陌生。

    相关文章

      网友评论

          本文标题:iOS 下基于OpenCV 的全景图像拼接

          本文链接:https://www.haomeiwen.com/subject/nviroctx.html