美文网首页iOS相关好东西iOS技术资料
iOS利用opencv库拼接全景图片以及制作全景相机的思路

iOS利用opencv库拼接全景图片以及制作全景相机的思路

作者: ZYiDa | 来源:发表于2017-09-15 09:32 被阅读842次

    先看效果图

    原图
    未命名
    拼接后的效果图
    WechatIMG85.png

    下面开始介绍拼接图片过程

    请看项目目录
    image.png

    Github上面搜索CVWrapper ,选择Objective-C部分,将上图中的文件导入到项目中。ImageUnti是我另外添加的裁剪图片的工具类,你们可以在我之前的文章中找一下源代码。
    由于opencv库太大,在github上面下载的项目中,里面会没有相应的framework文件,这时候,可以去github或百度上面另外下载。
    编译一下项目,如果没有出错,就可以继续使用了。

    使用过程

    请看代码

    #import "ViewController.h"
    #import "CVWrapper.h"
    #import "ImageUtil.h"
    @interface ViewController ()<UIScrollViewDelegate>
    @property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
    @property (nonatomic,strong) UIImageView *imageView;
    @property (weak, nonatomic) IBOutlet UIActivityIndicatorView *indictor;
    @end
    
    @implementation ViewController
    
    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
        self.indictor.center = self.view.center;
    }
    
    - (void)viewDidAppear:(BOOL)animated
    {
        [super viewDidAppear:animated];
    
        self.imageView.contentMode = UIViewContentModeScaleToFill;
        [self createFullShotImages];
    }
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    
    #pragma mark 异步线程 拼接全景图片
    - (void)createFullShotImages
    {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            [self.indictor startAnimating];
            CGSize size = CGSizeMake(720, 960);
            NSMutableArray *images = [NSMutableArray array];
            for (int i = 0; i<3; i++)
            {
                NSString *imageName = [NSString stringWithFormat:@"0%d.jpg",i+1];
                UIImage *image = [UIImage imageNamed:imageName];
                UIImage *resizeImage = [ImageUtil resizeImageWithImage:image targetSize:size];
                [images addObject:resizeImage];
            }
    
            //TODO:在这里传入需要拼接的图片数组,返回拼接后的图片
            UIImage *fullShotImage = [CVWrapper processWithArray:images];
    
            //回到主线程中显示拼接后的image
            dispatch_async(dispatch_get_main_queue(), ^{
    
                UIImageView *midImageView = [[UIImageView alloc]initWithImage:fullShotImage];
                self.imageView = midImageView;
                [self.scrollView addSubview:self.imageView];
    
                //利用scrollView控制全景图片的缩放
                self.scrollView.backgroundColor = [UIColor darkGrayColor];
                self.scrollView.contentSize = self.imageView.bounds.size;
                self.scrollView.maximumZoomScale = 4.0;
                self.scrollView.minimumZoomScale = 0.5;
                self.scrollView.delegate = self;
                CGFloat pointX = -(self.scrollView.bounds.size.width - self.imageView.bounds.size.width)/2.0;
                CGFloat pointY = -(self.scrollView.bounds.size.height - self.imageView.bounds.size.height)/2.0;
                self.scrollView.contentOffset = CGPointMake(pointX, pointY);
                [self.indictor stopAnimating];
                self.indictor.hidesWhenStopped = YES;
            });
        });
    }
    - (nullable UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
    {
        return self.imageView;
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    @end
    

    主要代码使用起来很简单,但是还有几点需要注意

    1. 每两个相邻的拼接图片之间需要有重叠的部分
    2. 所有需要拼接的图片需要处于同一水平线上,不然可能会有拼接失败或图片混乱的情况
    3. libjpeg.a文件是辅助opencv使用的,这个也不可缺少。

    至于制作全景相机的思路,我们可以使用自定义相机,利用重力感应控制好输出图片的水平位置,然后拍摄和拼接图片。我的思路不一定是最简单和正确的,还请各位多多指教。

    要源码的人太多了,这里就把完整版的项目上传一下,地址完整版项目+OpenCV.Framework,密码:xr0u。代码在分享的过程中才能更加完善,谢谢各位的指导,喜欢的小伙伴可以给一个小心心(笑哭),打赏就不用了。

    相关文章

      网友评论

      • iOS技术交流:感谢分享
      • 34592a50b8f9:你好,可以发我下Demo吗? 我最近在搞这个,没有头绪 1305766898@qq.com
      • youTobe兵長:能否发一份Demo 361791519@qq.com 将打赏10元作为补偿 谢谢
        ZYiDa:@youTobe兵長 已发送
        ZYiDa:@youTobe兵長 打赏就不用了 demo等下给你发
      • Alphts:你好,方便把demo发我一份吗?谢谢 546521260@qq.com
        ZYiDa:@Alphts 已发送
        ZYiDa:@Alphts 好的
      • 奋斗的DevAmos:博主,能发一份demo吗,万分感谢 906037367@qq.com
        ZYiDa:已发送
      • 梳子_8af5:你好,能否分享一下你的源码 谢谢啦! shuqinlee9683@gmail.com
        ZYiDa:@梳子_8af5 已发送
      • bc8b0f44eb8d:楼主,你好,我在github上搜索CVWrapper,项目里面也是没有任何文件QAQ ,方便发一份demo吗?emmm。。。邮箱835539011@qq.com
        ZYiDa:已发送
      • 奔跑的时间:你好,方便把demo发我一份吗?谢谢 2302926920@qq.com
      • fengyang:你好,我在github上搜索CVWrapper,下下来的项目里面没有任何文件,能否把demo邮我一份,非常感谢。QQ:599086054@qq.com
        fengyang:@ZYiDa 非常感谢!demo已成功运行。想问下,你是怎样通过重力感应去获取水平方向的图片的?
        ZYiDa:@fengyang 中午已发。
        ZYiDa:@fengyang 等下,中午吃过饭给你
      • 雨秋爱吃鱼:请问这篇文章的源码没有在GitHub上发布吗?
        ZYiDa:@名字只是代号_4c3f 我等下打包发给你
        雨秋爱吃鱼:@ZYiDa 有点不好意思,除了OpenCV,你项目里其他的资源不太好找,如果方便的话可以提供一下吗,感激不尽。CVWarpper,libjpeg.a还有几个UIImage的类:pray:
        ZYiDa:上面就是源码,直接复制就可以。只是在网上单独需要下载OpenCV的framework以及libjpeg.a静态库
      • 下班买鸡蛋:请问ImageUtil在哪里有下载,网上的都是安卓的
        ZYiDa:@李昊_9454 这个是我自己整理的类,继承于UIImage

      本文标题:iOS利用opencv库拼接全景图片以及制作全景相机的思路

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