我试图使用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图片中带入主应用程序的唯一方法。
答案 0 :(得分:0)
我想我会回答自己。
解决方案实际上非常简单,当创建新的cv::Mat
时,只复制图像标题,但它仍然指向原始图像数据,这会导致错误的图像显示。
创建裁剪版本时,我只需要使用copyTo
方法,将所需数据从大图片实际复制到小图片,然后根据需要全部工作。
类似这样的事情
cv::Mat reduced;
orig(roi).copyTo(reduced);