我目前正在iOS上使用openvc, 我正在尝试将cv :: Mat转换为UIImage。 但是应用程序在几秒钟后就崩溃了! (由于内存错误而终止)
这是我目前正在使用的代码:
using namespace cv;
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
{
CvVideoCamera* videoCamera;
CADisplayLink*run_loop;
UIImage*image2;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
videoCamera = [[CvVideoCamera alloc] initWithParentView:_liveview];
videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionBack;
videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPresetiFrame1280x720;
videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationLandscapeLeft;
videoCamera.defaultFPS = 30;
videoCamera.delegate = self;
[videoCamera start];
run_loop = [CADisplayLink displayLinkWithTarget:self selector:@selector(update)];
[run_loop setFrameInterval:2];
[run_loop addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)update{
_smallliveview.image = image2;
}
- (UIImage *)UIImageFromMat:(cv::Mat)image
{
cvtColor(image, image, CV_BGR2RGB);
NSData *data = [NSData dataWithBytes:image.data length:image.elemSize()*image.total()];
CGColorSpaceRef colorSpace;
if (image.elemSize() == 1) {
colorSpace = CGColorSpaceCreateDeviceGray();
} else {
colorSpace = CGColorSpaceCreateDeviceRGB();
}
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data);//CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
// Creating CGImage from cv::Mat
CGImageRef imageRef = CGImageCreate(image.cols, //width
image.rows, //height
8, //bits per component
8 * image.elemSize(), //bits per pixel
image.step.p[0], //bytesPerRow
colorSpace, //colorspace
kCGImageAlphaNone|kCGBitmapByteOrderDefault,// bitmap info
provider, //CGDataProviderRef
NULL, //decode
false, //should interpolate
kCGRenderingIntentDefault //intent
);
// Getting UIImage from CGImage
UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
//[self.imgView setImage:finalImage];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
return finalImage;
}
#pragma mark - Protocol CvVideoCameraDelegate
#ifdef __cplusplus
- (void)processImage:(Mat&)image;
{
image2 = [self UIImageFromMat:image];
}
#endif
@end
我该怎么办? 如果有人可以帮助我,那将是非常好的!? (;
问候大卫
答案 0 :(得分:0)
丢弃你写的所有内容以创建UIImage并使用MatToUIImage()函数代替。只需将垫子传递给该功能,即可获得图像。
虽然你没有问,但你不应该在这里使用运行循环或显示链接。时间并启动OpenCV调用的processImage方法的相关方法。
另外,请确保您使用的是最新版本。这与你的问题无关,但这是一种很好的做法。
将OpenCV 3导入Xcode 8项目:
安装' OpenCV2'与Cocoapods(它说' 2',但它仍然是版本3)。不要安装“开发者”。建立。
在工作区中打开您的项目为您创建的Cocoapods - 而不是您创建的项目文件 - 并附加使用OpenCV与.mm(与.m)相关的每个实现文件。如果您不这样做,您会收到奇怪的错误消息。