0

我正在使用以下代码将 a 转换UIImage为 a cv::Mat

-(cv::Mat)openCVMat{

    // Turn a UIImage into a cv::Mat
    // Draw the image into a bitmap context: the Mat's matrix


    CGColorSpaceRef colorSpace = CGImageGetColorSpace(self.CGImage);
    CGFloat columns = self.size.width;
    CGFloat rows = self.size.height;

    cv::Mat m(rows, columns, CV_8UC4, cv::Scalar(0,0,0,0));      // (bits, 4 channels (RGBA)


    CGContextRef context = CGBitmapContextCreate(m.data,
                                                 columns,
                                                 rows,
                                                 8,
                                                 m.step[0],
                                                 colorSpace,
                                                 kCGImageAlphaNoneSkipLast|kCGBitmapByteOrderDefault);

    // Draw
    CGContextDrawImage(context, CGRectMake(0, 0, columns, rows), self.CGImage);



    // Cleanup
    CGColorSpaceRelease(colorSpace);
    CGContextRelease(context);

    // Return
    return m;

}

它似乎工作正常,但在某些图像上,cv::Mat如果我只是从文件中读取它,结果会有所不同imread

NSURL *url = [[NSBundle mainBundle] URLForResource:@"blue"
                                         withExtension:@"png"];
cv::Mat fromFile = cv::imread([url.path cStringUsingEncoding:NSUTF8StringEncoding], CV_LOAD_IMAGE_UNCHANGED | CV_LOAD_IMAGE_COLOR);
cv::Mat withAlpha;
cv::cvtColor(fromFile, withAlpha, CV_BGRA2RGBA);

在这种情况下,结果cv::Mat(withAlpha)略有不同,特别是在图像的角落。

例如,当将图像读取为 aUIImage然后转换为cv::Mat时,最终的像素为:[0,0,110,255] this is RGBA

而使用 imread 直接读取后的最后一个像素是: [0,0,255, 110] 也是 RGBA

为了使事情变得更好,并非所有图像都会发生这种情况。

任何想法为什么会发生这种情况?

这是测试图像:blue.png

4

1 回答 1

0

正在读取的格式与创建 cv::Mat 的格式之间存在一些不匹配。

我看到从资源包加载图像时,您正在使用:

           CV_LOAD_IMAGE_UNCHANGED | CV_LOAD_IMAGE_COLOR. 

只需保留 CV_LOAD_IMAGE_UNCHANGED 并检查。这应该保证从您的 PNG 加载 alpha 通道。看看是否有帮助。

于 2013-08-29T09:50:38.663 回答