1

我正在使用 OpenCV 开发 Quartz Composer 插件,我遇到了通过 cvCvtColor 将静态图像(仅)转换为灰色的问题。我正在开发 2.4 但我遇到了与 2.3 相同的问题:

网络摄像头图像一切正常,而且 - 很奇怪,不是吗?- 用于来自 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 回答