Я работаю над плагином Quartz Composer с OpenCV, и у меня есть эта проблема с неподвижными изображениями (только), преобразованными в серый цвет через cvCvtColor. Я работаю на 2.4, но у меня была такая же проблема с 2.3:OpenCV искажает проблемы с неподвижными изображениями
Все нормально для веб-камеры изображений, и - странно, не правда ли? - для прямых изображений jpeg с iPhone. Но с другими изображениями у меня есть эта проблема с искажениями.
Когда я масштабирую исходное изображение, это исправляет проблему, но это не очень хороший способ решить проблему.
Вот оригинальное изображение, а справа изображение с высоты масштабируется 1.226 (???):
ли кто-нибудь есть эта проблема. Мне было интересно, не было ли это способом преобразования входного изображения в IplImage, но мой код кажется правильным, поскольку я нашел другие программы, используя тот же путь ...
Может быть, проблема с количеством каналов в выходе?
Спасибо.
EDIT:
Вот код метода.
- (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];
}
Спасибо!
Спасибо @smokris! К сожалению, у меня есть ошибка в XCode на строке: memcpy (r-> imageData + y * r-> widthStep, qcImageData + y * qcImageBytesPerRow, r-> widthStep); ** арифметика на указателе на пустоту ** Я знаю, что должно быть очевидное решение, но хорошо ... Я должен его бросить? К какому типу? –
(Обновленный ответ.) – smokris
Thx, и извините: (char *) тоже был в моей начальной функции ... Но, ну ... это не работает, и у меня такая же проблема с вашим методом ...:/ –