次のコードを使用して aUIImage
を 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) は、特に画像の隅でわずかに異なります。
たとえば、イメージを として読み取ってUIImage
から に変換するcv::Mat
場合、最終的なピクセルは [0,0,110,255] です。これは RGBA です。
imread で直接読み取った後の最後のピクセルは [0,0,255, 110] また RGBA
状況を改善するために、これはすべての画像で発生するわけではありません。
なぜこれが起こっているのですか?
テスト画像は次のとおりです: blue.png