我正在尝试使用 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 对象时还需要检查其他内容吗?
谢谢
附注请忽略矢量内容,这个问题是更大解决方案的一部分,这是我可以将图像字节从 cv:Mat 图片带入主应用程序的唯一方法。
最佳答案
我想我会回答自己。
解决方案其实很简单,当创建一个新的cv::Mat
时,只复制图像头,但它仍然指向原始图像数据,这会导致图片显示错误。
我所要做的就是在创建裁剪版本时使用 copyTo
方法将所需的数据从大图片实际复制到小图片,然后一切都根据需要进行。
类似这样的事情
cv::Mat reduced;
orig(roi).copyTo(reduced);
关于macos - 将 OpenCV 部分图像转换为 NSImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28721614/