macos - 将 OpenCV 部分图像转换为 NSImage

标签 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 对象时还需要检查其他内容吗?

谢谢

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

最佳答案

我想我会回答自己。 解决方案其实很简单,当创建一个新的cv::Mat时,只复制图像头,但它仍然指向原始图像数据,这会导致图片显示错误。

我所要做的就是在创建裁剪版本时使用 copyTo 方法将所需的数据从大图片实际复制到小图片,然后一切都根据需要进行。

类似这样的事情

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

关于macos - 将 OpenCV 部分图像转换为 NSImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28721614/

相关文章:

html - 为什么 WebView 的 dataWithPDFInsideRect 不能在 Mavericks 上创建高质量的 PDF?

objective-c - 如何在应用程序处于焦点的情况下捕获键盘/鼠标事件?

objective-c - 在自动布局中,如何在删除自定义 View 后使 NSWindow 调整回最小尺寸?

python - py-appscript 和事件

Objective-C:如何从子类访问父属性?

cocoa - NSStatusItem 自定义 View NSDraggingDestination 仅在单击项目后有效

c++ - 使用 opencv 进行 qt5 部署,如何修复 lib 安装路径?

python-2.7 - OpenCV:libdc1394 错误:无法初始化 libdc1394

c++ - 使用opencv显示视频

cocoa - 获取 NSView 的中心点