我正在使用以下代码将 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