2013-05-08 130 views
3

我正在使用此函數將cv :: mat轉換爲UIImage。cv :: mat到UIImage轉換不能恢復精確圖像

-(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; 
} 

恢復圖像顏色與原始圖像不匹配。我從CvVideoCamera代理獲得cv:Mat

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

這段代碼有什麼問題。

回答

3

它可能與openCV(bgr)的默認顏色空間順序有關。我認爲你應該檢查CGImageCreate構造函數來找出根本原因。

+0

感謝fuatcoskun完美的答案 – Nik 2013-05-08 13:32:47

+0

你解決這個問題?你可以分享你的代碼嗎? – 2014-03-14 17:30:48

+0

cvtColor(image,image,CV_BGR2RGB); – gbk 2016-12-29 10:53:58

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

酷!爲我工作。是否有機會爲其他設備(iPad,iPhone 6Plus)使用不同的冷碼(CV_BGR2RGB)?有沒有辦法以編程方式檢測設備的色彩空間? – rakeshNS 2015-08-22 17:43:18