我正在使用 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];
}
谢谢 !