为啥 Objective-C 不显示 OpenCV 捕获的视频的输出帧?

Posted

技术标签:

【中文标题】为啥 Objective-C 不显示 OpenCV 捕获的视频的输出帧?【英文标题】:Why Objective-C doesn't show output frames of a video captured by OpenCV?为什么 Objective-C 不显示 OpenCV 捕获的视频的输出帧? 【发布时间】:2016-07-11 21:54:57 【问题描述】:

我是 Objective C 的新手,我想使用 Opencv 来捕获视频并处理每一帧。每帧的输出应该显示在屏幕上(ios模拟器)。

ViewController.h 中的代码是:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController 
    cv::Mat cvImage;


@property (nonatomic, weak) IBOutlet UIImageView* imageView;

@end

ViewController.m 中的代码是

#import "ViewController.h"
#import "opencv2/highgui/ios.h"
#import <AVFoundation/AVFoundation.h>
#import <AVKit/AVKit.h>
#import <MediaPlayer/MediaPlayer.h>
#import <iostream>
using namespace cv;
using namespace std;

@implementation ViewController

@synthesize imageView;

- (void)viewDidLoad

    [super viewDidLoad];
    Mat frame;
    cv::VideoCapture cap(VIDEO_PATH);
    int count = 0;
    if(!cap.isOpened())
        cout << "bad frame!!!!" << endl;
    
    while(1)
         if(!cap.read(frame))
            cout << "cannot read " << endl;
            exit(0);
         

        cout << count++ << endl;
        imageView.image = MatToUIImage(frame);
        imageView.frame = CGRectMake(50, 50, 150, 150); // pass your frame here
        [self.view addSubview:imageView];
    

...
@end

如果我去掉while循环,模拟器会显示视频的第一帧,这是合理的。但是如果我有while循环,在输出控制台中,帧数正在计数,这意味着程序正在从视频中读取帧,但在ios模拟器中,什么都没有......

由于我想基于 OpenCV 处理每一帧,我如何在使用 OpenCV 捕获并处理后显示每一帧?

谢谢!

【问题讨论】:

【参考方案1】:

不要每帧添加一个新的子视图。只需将图像设置到现有视图中。

【讨论】:

谢谢!那么如何更改我的代码呢?只需删除 [self.view addSubview:imageView]; ? 将图片存入view.image,删除子视图的东西 删除子视图的东西后,我只使用了imageView.image = MatToUIImage(frame)。但是我在模拟器上什么也没有,就像以前一样,帧计数器仍在增加.... 您如何确认您正在获取后续帧以存储在视图中?是什么样的景色? 我已经使用 NSTimer 和 [imageView setNeedsDisplay] 解决了我的问题!还是谢谢你们!

以上是关于为啥 Objective-C 不显示 OpenCV 捕获的视频的输出帧?的主要内容,如果未能解决你的问题,请参考以下文章

OPENcv中把一个图片融合到另一个图像中为啥程序正确不显示图片

C++/openCV - 为啥显示图像会产生 linux 分段错误? (openCV 错误?)

Objective-C,为啥这些 NSArrays 不匹配?

OpenCV这么简单为啥不学——2逐帧播放视频(VideoCapture函数waitKey函数0xFF == ord(‘1‘))

opencv中为啥图像局矩阵是以BGR而不是RGB显示像素的大小?

Objective-C 我应该使用 NSError 以及为啥 presentError 函数不起作用