Macos n图像为cv::Mat,反之亦然
在使用OpenCV时,我需要将NSImage转换为OpenCV多通道2D矩阵(cvMat),反之亦然 最好的方法是什么 问候,Macos n图像为cv::Mat,反之亦然,macos,opencv,nsimage,cgimage,cgimageref,Macos,Opencv,Nsimage,Cgimage,Cgimageref,在使用OpenCV时,我需要将NSImage转换为OpenCV多通道2D矩阵(cvMat),反之亦然 最好的方法是什么 问候, Dom这是我的结果,效果很好 NSImage+OpenCV.h: 用法示例: 只需按如下方式导入: #import "NSImage+OpenCV.h" cv::Mat cvMat_test; NSImage *image = [NSImage imageNamed:@"test.jpg"]; cvMat_test = [image CVMat]; [myImageV
Dom这是我的结果,效果很好 NSImage+OpenCV.h: 用法示例: 只需按如下方式导入:
#import "NSImage+OpenCV.h"
cv::Mat cvMat_test;
NSImage *image = [NSImage imageNamed:@"test.jpg"];
cvMat_test = [image CVMat];
[myImageView setImage:[NSImage imageWithCVMat:cvMat_test]];
然后像这样使用它:
#import "NSImage+OpenCV.h"
cv::Mat cvMat_test;
NSImage *image = [NSImage imageNamed:@"test.jpg"];
cvMat_test = [image CVMat];
[myImageView setImage:[NSImage imageWithCVMat:cvMat_test]];
在-(id)initWithCVMat:(const cv::Mat&)cvMat中,您不应该将表示添加到self,而不是新的NSImage吗
-(id)initWithCVMat:(const cv::Mat *)iMat
{
if(self = [super init]) {
NSData *tData = [NSData dataWithBytes:iMat->data length:iMat->elemSize() * iMat->total()];
CGColorSpaceRef tColorSpace;
if(iMat->elemSize() == 1) {
tColorSpace = CGColorSpaceCreateDeviceGray();
} else {
tColorSpace = CGColorSpaceCreateDeviceRGB();
}
CGDataProviderRef tProvider = CGDataProviderCreateWithCFData((CFDataRef) tData);
CGImageRef tImage = CGImageCreate(
iMat->cols,
iMat->rows,
8,
8 * iMat->elemSize(),
iMat->step[0],
tColorSpace,
kCGImageAlphaNone | kCGBitmapByteOrderDefault,
tProvider,
NULL,
false,
kCGRenderingIntentDefault);
NSBitmapImageRep *tBitmap = [[NSBitmapImageRep alloc] initWithCGImage:tImage];
[self addRepresentation:tBitmap];
[tBitmap release];
CGImageRelease(tImage);
CGDataProviderRelease(tProvider);
CGColorSpaceRelease(tColorSpace);
}
return self;
}
这真的很有帮助,但不是这样做的。你需要使你的材料适应问答形式,所以先问问题。。。然后回答。啊,好的。编辑了我的第一篇文章并用我的解决方案回答:)有一些内存泄漏。需要释放[self CGImage],将其设置为变量,并在CVmat和CVGrayscaleMat中的CGContextDrawImage之后释放。CGImageRef imageRef=[self CGImage]。。。CGImageRelease(imageRef)@PaulSolt谢谢你提供的信息!修正了:)又改变了两件事,在draw方法中有一个额外的返回和另一个[self CGImage]调用导致泄漏。我做了类似的操作来使用bitmapContext中的数据。一个重要的问题是:如果要使用上下文中的数据,需要在NSGraphicsContext上调用flushGraphics。如果没有这个功能,它在调试模式下工作正常,但在发布模式下出现故障。我认为在调用函数之前,还应该将OpenCV的BGR表示转换为RGB:
cv::cvtColor(cvMatBGR\u orig,cvMatRGB,cv\u BGR2RGB)