2013-02-08 2 views
1

Я работаю над плагином Quartz Composer с OpenCV, и у меня есть эта проблема с неподвижными изображениями (только), преобразованными в серый цвет через cvCvtColor. Я работаю на 2.4, но у меня была такая же проблема с 2.3:OpenCV искажает проблемы с неподвижными изображениями

Все нормально для веб-камеры изображений, и - странно, не правда ли? - для прямых изображений jpeg с iPhone. Но с другими изображениями у меня есть эта проблема с искажениями.

Когда я масштабирую исходное изображение, это исправляет проблему, но это не очень хороший способ решить проблему.

Вот оригинальное изображение, а справа изображение с высоты масштабируется 1.226 (???):

enter image description here

ли кто-нибудь есть эта проблема. Мне было интересно, не было ли это способом преобразования входного изображения в 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]; 

} 

Спасибо!

ответ

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); 
+0

Спасибо @smokris! К сожалению, у меня есть ошибка в XCode на строке: memcpy (r-> imageData + y * r-> widthStep, qcImageData + y * qcImageBytesPerRow, r-> widthStep); ** арифметика на указателе на пустоту ** Я знаю, что должно быть очевидное решение, но хорошо ... Я должен его бросить? К какому типу? –

+0

(Обновленный ответ.) – smokris

+0

Thx, и извините: (char *) тоже был в моей начальной функции ... Но, ну ... это не работает, и у меня такая же проблема с вашим методом ...:/ –