2013-05-08 2 views
3

Я использую эту функцию для преобразования cv :: mat в UIImage.cv :: mat to UIImage conversion не восстанавливает точное изображение

-(UIImage *)UIImageFromCVMat:(cv::Mat)cvMat 
{ 
    NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()]; 
    CGColorSpaceRef colorSpace; 

    if (cvMat.elemSize() == 1) { 
     colorSpace = CGColorSpaceCreateDeviceGray(); 
    } else { 
     colorSpace = CGColorSpaceCreateDeviceRGB(); 
    } 

    CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data); 

    // Creating CGImage from cv::Mat 
    CGImageRef imageRef = CGImageCreate(cvMat.cols,         //width 
             cvMat.rows,         //height 
             8,           //bits per component 
             8 * cvMat.elemSize(),      //bits per pixel 
             cvMat.step[0],       //bytesPerRow 
             colorSpace,         //colorspace 
             kCGImageAlphaNone|kCGBitmapByteOrderDefault,// bitmap info 
             provider,         //CGDataProviderRef 
             NULL,          //decode 
             false,          //should interpolate 
             kCGRenderingIntentDefault     //intent 
             ); 


    // Getting UIImage from CGImage 
    UIImage *finalImage = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef); 
    CGDataProviderRelease(provider); 
    CGColorSpaceRelease(colorSpace); 

    return finalImage; 
} 

Цвет изображения восстановления не совпадает с исходным изображением. Я получаю cv: Мат от делегата CvVideoCamera

- (void)processImage:(Mat&)image 
{ 
    UIImage* img = [self UIImageFromCVMat:image] 
} 

что не так с этим кодом.

ответ

3

Возможно, это связано с порядком цветового пространства по умолчанию для openCV (bgr). Я думаю, вы должны проверить конструктор CGImageCreate для выяснения основной причины.

+0

Благодаря fuatcoskun для идеального ответа – Nik

+0

ли вы решить эту проблему? Не могли бы вы поделиться своим кодом, если бы вы это сделали? – 2014-03-14 17:30:48

+0

cvtColor (изображение, изображение, CV_BGR2RGB); – gbk

6

Вот мой рабочий код

- (UIImage *)UIImageFromMat:(cv::Mat)image 
{ 
    cvtColor(image, image, CV_BGR2RGB); 
    NSData *data = [NSData dataWithBytes:image.data length:image.elemSize()*image.total()]; 

    CGColorSpaceRef colorSpace; 

    if (image.elemSize() == 1) { 
     colorSpace = CGColorSpaceCreateDeviceGray(); 
    } else { 
     colorSpace = CGColorSpaceCreateDeviceRGB(); 
    } 

    CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data);//CGDataProviderCreateWithCFData((__bridge CFDataRef)data); 

    // Creating CGImage from cv::Mat 
    CGImageRef imageRef = CGImageCreate(image.cols,         //width 
             image.rows,         //height 
             8,           //bits per component 
             8 * image.elemSize(),      //bits per pixel 
             image.step.p[0],       //bytesPerRow 
             colorSpace,         //colorspace 
             kCGImageAlphaNone|kCGBitmapByteOrderDefault,// bitmap info 
             provider,         //CGDataProviderRef 
             NULL,          //decode 
             false,          //should interpolate 
             kCGRenderingIntentDefault     //intent 
             ); 


    // Getting UIImage from CGImage 
    UIImage *finalImage = [UIImage imageWithCGImage:imageRef]; 
    //[self.imgView setImage:finalImage]; 
    CGImageRelease(imageRef); 
    CGDataProviderRelease(provider); 
    CGColorSpaceRelease(colorSpace); 

    return finalImage; 

} 
+0

круто! Работал для меня. Любая возможность иметь другой холодный код (CV_BGR2RGB) для другого устройства (iPad, iPhone 6Plus)? Есть ли способ определить цветовое пространство устройства программно? – rakeshNS

Смежные вопросы