iOS利用opencv庫拼接全景圖片以及制作全景相機的思路

先看效果圖

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

下面開始介紹拼接圖片過程

請看項目目錄
image.png

Github上面搜索CVWrapper ,選擇Objective-C部分,將上圖中的文件導(dǎo)入到項目中。ImageUnti是我另外添加的裁剪圖片的工具類,你們可以在我之前的文章中找一下源代碼。
由于opencv庫太大,在github上面下載的項目中,里面會沒有相應(yīng)的framework文件,這時候,可以去github或百度上面另外下載。
編譯一下項目,如果沒有出錯,就可以繼續(xù)使用了。

使用過程

請看代碼

#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<7; i++)
        {
            UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg",i]];
            NSAssert(image != nil, @"image 數(shù)據(jù)不能為空");
            [images addObject:[ImageUtil resizeImageWithImage:image targetSize:CGSizeMake(640, 360)]];
        }

        //TODO:在這里傳入需要拼接的圖片數(shù)組,返回拼接后的圖片
        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使用的,這個也不可缺少。

至于制作全景相機的思路,我們可以使用自定義相機,利用重力感應(yīng)控制好輸出圖片的水平位置,然后拍攝和拼接圖片。我的思路不一定是最簡單和正確的,還請各位多多指教。

要源碼的人太多了,這里就把完整版的項目上傳一下,地址完整版項目+OpenCV.Framework,密碼:xr0u。代碼在分享的過程中才能更加完善,謝謝各位的指導(dǎo),喜歡的小伙伴可以給一個小心心(笑哭),打賞就不用了。

補充

當(dāng)單個圖片分辨率過大時,在合成的過程中會因為數(shù)據(jù)越界出現(xiàn)下面的錯誤提示

OpenCV Error: Assertion failed ((globalDescIdx>=0) && (globalDescIdx < size())) in getLocalIdx, file /Volumes/build-storage/build/2_4_iOS-mac/opencv/modules/features2d/src/matchers.cpp, line 163

libc++abi.dylib: terminating with uncaught exception of type cv::Exception: /Volumes/build-storage/build/2_4_iOS-mac/opencv/modules/features2d/src/matchers.cpp:163: error: (-215) (globalDescIdx>=0) && (globalDescIdx < size()) in function getLocalIdx

這時可以降低一下圖片的分辨率,使用ImageUtil這個類中的resizeImageWithImage: targetSize:方法即可。

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

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

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