1

私は OpenCV を使用して Quartz Composer プラグインに取り組んでおり、cvCvtColor を介してグレーに変換された静止画像 (のみ) でこの問題が発生しています。私は2.4に取り組んでいますが、2.3でも同じ問題がありました:

ウェブカメラの画像ならなんでもOK。- iPhone からの直接の JPEG 画像用。しかし、他の画像では、この歪みの問題があります。

元の画像を拡大縮小すると、問題は修正されますが、問題を解決するにはあまり良い方法ではありません。

これが元の画像で、右側の画像は高さを 1.226 (???) でスケーリングしたものです。

ここに画像の説明を入力

誰もがこの問題を抱えていますか。IplImage で入力画像を変換するのが私のやり方ではないかと思っていましたが、同じ方法を使用している他のプログラムを見つけたので、私のコードは正しいようです...

出力のチャンネル数の問題でしょうか?

ありがとうございました。

編集 :

これがメソッドのコードです。

- (void) createWithInputImage: (id<QCPlugInInputImageSource>) image {

IplImage *r = NULL;
if (image != nil) {
    // NSLog(@"Carasuelo OpenCV - width: %f", [image imageBounds].size.width);
    CvSize size = cvSize([image imageBounds].size.width, [image imageBounds].size.height);
    const char *colorModel;
    const char *channelSeq;
    int depth;
    int channels;
    if ([image bufferPixelFormat] == QCPlugInPixelFormatARGB8) {
        depth = IPL_DEPTH_8U;
        channels = 4;
        colorModel = (char *)"RGBA";
        channelSeq = (char *)"ARGB";

    } else if ([image bufferPixelFormat] == QCPlugInPixelFormatBGRA8) {
        depth = IPL_DEPTH_8U;
        channels = 4;
        colorModel = (char *)"RGBA";
        channelSeq = (char *)"BGRA";

        // QUARTZ COMPOSER IMAGES ARE ALWAYS BGRA8 -> 8U

    } else if ([image bufferPixelFormat] == QCPlugInPixelFormatRGBAf) {
        depth = IPL_DEPTH_32F;
        channels = 4;
        colorModel = (char *)"RGBA";
        channelSeq = (char *)"RGBA";

    } else if ([image bufferPixelFormat] == QCPlugInPixelFormatI8) {
        depth = IPL_DEPTH_8U;
        channels = 1;
        colorModel = (char *)"GREY";
        channelSeq = (char *)"GREY";

    } else if ([image bufferPixelFormat] == QCPlugInPixelFormatIf) {
        depth = IPL_DEPTH_32F;
        channels = 1;
        colorModel = (char *)"GREY";
        channelSeq = (char *)"GREY";

    } else {
        NSLog(@"Format d'image non supporté: %@", [image bufferPixelFormat]);
    }


    r = cvCreateImage(size, depth, channels);

    r->imageData = (char *)[image bufferBaseAddress];

    strcpy(r->colorModel, colorModel);
    strcpy(r->channelSeq, channelSeq);
}

[self setImageCV:r];

}

ありがとうございました !

4

1 に答える 1

0

[image bytesPerRow]ピクセルの行のバイト数を返します。これは、と同じではない場合があります[image imageBounds].size.width * bytesPerPixel(プロセッサのアドレス指定効率のために、各行が16の倍数で始まるようにパディングが追加されます)。

したがって、次のr->imageData = (char *)[image bufferBaseAddress];ようなことを試す代わりに、次のようにします。

unsigned long qcImageHeight = [image imageBounds].size.height;
unsigned long qcImageBytesPerRow = [image bytesPerRow];
char * qcImageData = (char *)[image imageBufferBaseAddress];
for(unsigned long y = 0; y < height; ++y)
    memcpy((char *)r->imageData + y * r->widthStep, qcImageData + y * qcImageBytesPerRow, r->widthStep);
于 2013-02-08T22:20:07.057 に答える