Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos n图像为cv::Mat,反之亦然_Macos_Opencv_Nsimage_Cgimage_Cgimageref - Fatal编程技术网

Macos n图像为cv::Mat,反之亦然

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

在使用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];
[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)