Ошибка сохранения изображения на iPhone - PullRequest
2 голосов
/ 09 марта 2011

Я знаю, что пытался приступить к обработке изображений для iPhone / iPad с помощью openCV. Я нашел несколько хороших учебников, но не очень много информации.

Что ж, я пытаюсь сохранить изображение, вырезанное изROI большего изображения, XCode и Simulator не сообщают об ошибках, но после того, как я пытаюсь открыть изображение, сохраненное с помощью Finder, он сообщает об ошибке «Поврежден файл или формат не распознан».

Это код дляобрезка и сохранение изображения (оно вставлено в учебник по распознаванию лиц с nashruddin.com

cvSetImageROI(image, cvRect(cvrect.x * scale, cvrect.y * scale, cvrect.width * scale, cvrect.height * scale));


        /* create destination image
         Note that cvGetSize will return the width and the height of ROI */

        IplImage *img2 = cvCreateImage(cvGetSize(image),
                                       image->depth,
                                       image->nChannels);

        cvCopy(image, img2, NULL);

        cvResetImageROI(image);

        CvAttrList attributes;

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0]; //2
        NSString *path = [documentsDirectory stringByAppendingPathComponent:@"prueba.jpg"];

        cvSave([path UTF8String], img2, NULL, NULL, attributes);

Заранее благодарим за любую предоставленную помощь

Серхио

Ответы [ 3 ]

1 голос
/ 25 ноября 2011

Кажется, что цветовое пространство отличается в источнике и цели. Попробуйте использовать разные цветовые пространства, например, комбинации RGBA, BGRA. или попробуйте cvCvtColor для своего iplimage к CV_RGBA2BGRA

PS: прошу прощения, если вышеизложенное содержит какие-либо ошибки в правильности написания функций и констант. Я не помню их точно

1 голос
/ 09 марта 2011

Вы должны использовать cvSaveImage для этого. cvSave сохраняет изображение в формате XML / YAML.Или, как вариант, вы можете взять необработанные данные изображения и получить представление PNG / JPEG, используя UIImagePNGRepresentation() / UIImageJPEGRepresentation(), и сохранить, используя [NSData writeToFile...]

. Для преобразования IplImage в UIImage используйте:

UIImage*  CreateUIImageFromIplImage(IplImage* ipl_image) {
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    NSData* data = [NSData dataWithBytes: ipl_image->imageData length: ipl_image->imageSize];
    CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data);
    CGImageRef imageRef = CGImageCreate(ipl_image->width, ipl_image->height,
                                        ipl_image->depth, ipl_image->depth * ipl_image->nChannels, ipl_image->widthStep,
                                        colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault,
                                        provider, NULL, false, kCGRenderingIntentDefault);
    UIImage* ret = [UIImage imageWithCGImage: imageRef];
    CGImageRelease(imageRef);
    CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpace);

    return ret;
}
0 голосов
/ 26 декабря 2012

Это результат изменения порядка цветов, красный и синий каналы чередуются. Исходное изображение находится в цветовом пространстве BGRA (по умолчанию для OpenCV), и вы сохраняете изображение как RGB. Чтобы это исправить, добавьте

cvCvtColor (мат, мат, CV_BGR2RGBA);

перед оператором saveImage.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...