Iphone 是否存在类似cvShowImage for iOS的产品?
我正在处理图像(在iOS上使用AVFoundation和OpenCV),我只想在屏幕上显示CMSampleBufferRef(或IplImage)的内容Iphone 是否存在类似cvShowImage for iOS的产品?,iphone,objective-c,ios,opencv,cmsamplebufferref,Iphone,Objective C,Ios,Opencv,Cmsamplebufferref,我正在处理图像(在iOS上使用AVFoundation和OpenCV),我只想在屏幕上显示CMSampleBufferRef(或IplImage)的内容 简单地说:我只想显示(就像OpenCV的cvShowImage())未转换的图像,看看我是否在处理损坏或以某种方式变形的图像。遗憾的是没有。不同的位图表示 也许你想要一个类别?我使用的东西大致如下: // NSImage+OpenCV.h @interface NSImage (OpenCV) + (NSImage*)imageWithC
简单地说:我只想显示(就像OpenCV的
cvShowImage()
)未转换的图像,看看我是否在处理损坏或以某种方式变形的图像。遗憾的是没有。不同的位图表示
也许你想要一个类别?我使用的东西大致如下:
// NSImage+OpenCV.h
@interface NSImage (OpenCV)
+ (NSImage*)imageWithCVMat:(const cv::Mat&)cvMat;
- (id)initWithCVMat:(const cv::Mat&)cvMat;
- (cv::Ptr<cv::Mat>)cvMat;
@end
// NSImage+OpenCV.m
using namespace cv;
@implementation NSImage (OpenCV)
- (id)initWithCVMat:(const cv::Mat&)cvMat {
NSData *data = [NSData dataWithBytes:cvMat.data
length:cvMat.total()*cvMat.elemSize()];
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB();
CGImageRef imageRef = CGImageCreate(cvMat.cols,
cvMat.rows,
8,
8 * cvMat.elemSize(),
cvMat.step[0],
colourSpace,
kCGImageAlphaNone |
kCGBitmapByteOrderDefault,
provider,
NULL,
false,
kCGRenderingIntentDefault);
NSImage *image = [[NSImage alloc] initWithCGImage:imageRef size:CGSizeMake(cvMat.cols,cvMat.rows)];
CGColorSpaceRelease(colourSpace);
CGDataProviderRelease(provider);
CGImageRelease(imageRef);
return image;
}
+(NSImage*)imageWithCVMat:(const cv::Mat&)cvMat {
return [[NSImage alloc] initWithCVMat:cvMat];
}
- (cv::Ptr<cv::Mat>)cvMat {
CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)[self TIFFRepresentation], NULL);
CGImageRef imageRef = CGImageSourceCreateImageAtIndex(source, 0, NULL);
cv::Ptr<cv::Mat> cvMat = new cv::Mat(self.size.height, self.size.width, CV_8UC4);
CGContextRef contextRef = CGBitmapContextCreate(cvMat->data,
cvMat->cols,
cvMat->rows,
8,
cvMat->step[0],
CGImageGetColorSpace(imageRef),
kCGImageAlphaNoneSkipLast |
kCGBitmapByteOrderDefault);
CGContextDrawImage(contextRef,
CGRectMake(0, 0, cvMat->cols, cvMat->rows),
imageRef);
CGContextRelease(contextRef);
CGImageRelease(imageRef);
return cvMat;
}
@end
//NSImage+OpenCV.h
@接口NSImage(OpenCV)
+(NSImage*)带有cvMat的图像:(常数cv::Mat&)cvMat;
-(id)initWithCVMat:(const cv::Mat&)cvMat;
-(cv::Ptr)cvMat;
@结束
//NSImage+OpenCV.m
使用名称空间cv;
@实现NSImage(OpenCV)
-(id)initWithCVMat:(常数cv::Mat&)cvMat{
NSData*data=[NSData dataWithBytes:cvMat.data
长度:cvMat.total()*cvMat.elemSize();
CGDataProviderRef provider=CGDataProviderCreateWithCFData((_桥CFDataRef)数据);
CGColorSpaceRef colorspace=CGColorSpaceCreateDeviceRGB();
CGImageRef imageRef=CGImageCreate(cvMat.cols,
cvMat.rows,
8.
8*cvMat.elemSize(),
cvMat.步骤[0],
色彩空间,
KCGIMAGEALPHONE|
kCGBitmapByteOrderDefault,
供应商,
无效的
错误的
KCG违约);
NSImage*image=[[NSImage alloc]initWithCGImage:imageRef大小:CGSizeMake(cvMat.cols,cvMat.rows)];
CGCOLORSPACTERELEASE(色彩空间);
CGDataProviderRelease(提供程序);
CGImageRelease(imageRef);
返回图像;
}
+(NSImage*)带有cvMat的图像:(常数cv::Mat&)cvMat{
返回[[NSImage alloc]initWithCVMat:cvMat];
}
-(cv::Ptr)cvMat{
CGImageSourceRef source=CGImageSourceCreateWithData((u桥CFDataRef)[自表示],NULL);
CGImageRef imageRef=CGImageSourceCreateMageAtIndex(源,0,空);
cv::Ptr cvMat=新cv::Mat(self.size.height、self.size.width、cv_8UC4);
CGContextRef-contextRef=CGBitmapContextCreate(cvMat->data,
cvMat->cols,
cvMat->行,
8.
cvMat->步骤[0],
CGImageGetColorSpace(imageRef),
kCGImageAlphaNoneSkipLast|
kCGBitmapByteOrderDefault);
CGContextDrawImage(contextRef,
CGRectMake(0,0,cvMat->cols,cvMat->rows),
imageRef);
CGContextRelease(contextRef);
CGImageRelease(imageRef);
返回cvMat;
}
@结束
您可能需要将NSImage的引用更改为UIImage,以便在iOS上使用,但我认为核心图形代码的其余部分应该与UIImage所需的非常接近。谢谢您的回复。我已经知道iOS的替代方案(UIImage+OpenCV
),但是像cvShowImage()
这样简单的东西可能不存在。。。