2013-05-08 127 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