为啥 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‘))