0

次のコードを使用して 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

4

1 に答える 1

0

読み取られる形式と cv::Mat が作成される形式との間に不一致があります。

リソースバンドルから画像をロードしているときに、次のものを使用していることがわかります。

           CV_LOAD_IMAGE_UNCHANGED | CV_LOAD_IMAGE_COLOR. 

CV_LOAD_IMAGE_UNCHANGED を保持して確認してください。これにより、PNG からのアルファ チャネルの読み込みが保証されます。それが役立つかどうかを確認してください。

于 2013-08-29T09:50:38.663 に答える