将OpenCV部分图像转换为NSImage

时间:2015-02-25 14:30:14

标签: macos cocoa opencv

我试图使用OpenCV读取图像,获取它的一部分并在NSImageView对象中显示它。 这就是我的工作方式。

cv::Mat im = cv::imread("/Users/maddev/Documents/R8.jpg");
cv::Mat reduced = im(cv::Rect(10, 10, 400, 400));
std::vector<unsigned char> data ;
unsigned char *ptr = reduced.data;
unsigned long size = reduced.total() * reduced.elemSize();
data.assign(ptr, ptr + size);
int cols = reduced.cols;
int rows = reduced.rows;

// to NSImage
unsigned char *pimage = &data[0];
NSBitmapImageRep *rep=[[NSBitmapImageRep alloc]
                       initWithBitmapDataPlanes:&pimage
                       pixelsWide:cols
                       pixelsHigh:rows
                       bitsPerSample:8
                       samplesPerPixel:3
                       hasAlpha:NO
                       isPlanar:NO
                       colorSpaceName:NSDeviceRGBColorSpace
                       bytesPerRow:cols*3
                       bitsPerPixel:24
                       ];
NSImage *image = [[NSImage alloc] initWithCGImage:[rep CGImage] size:NSMakeSize(cols,rows)];
imageView.image = image;

哪个不起作用,显示一些垃圾。 但是如果我在im对象上使用相同的方法,那么一切都按预期工作。 为什么reduced无法正常显示?创建NSBitmapImageRep对象时是否需要检查其他内容?

THX

P.S。请忽略向量内容,这个问题是更大解决方案的一部分,这是我可以将图像字节从cv:Mat图片中带入主应用程序的唯一方法。

1 个答案:

答案 0 :(得分:0)

我想我会回答自己。 解决方案实际上非常简单,当创建新的cv::Mat时,只复制图像标题,但它仍然指向原始图像数据,这会导致错误的图像显示。

创建裁剪版本时,我只需要使用copyTo方法,将所需数据从大图片实际复制到小图片,然后根据需要全部工作。

类似这样的事情

cv::Mat reduced;
orig(roi).copyTo(reduced);