iphone - cv::mat 到 UIImage 的转换无法恢复精确图像

标签 iphone opencv uiimage mat

我正在使用此函数将 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 委托(delegate)中获取 cv:Mat

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

这段代码有什么问题。

最佳答案

这是我的工作代码

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

}

关于iphone - cv::mat 到 UIImage 的转换无法恢复精确图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16440254/

相关文章:

ios - 调整 UIImage 大小时内存泄漏

swift - SwiftUI-将边框添加到图像的一个边缘

javascript - requestAnimFrame 被多次执行

iphone:如何停止增量变量

iphone - 如何从数组中删除一个对象?

iphone - 自动布局约束不起作用

c++ - 如何使用 C++ 在 opencv 中训练我自己的 svm?

android - 使用没有 surfaceview 或 textureview 的相机

ios 崩溃 "could not execute support code to read Objective-C"在 ios 12.4.2 上而不是在 12.0.1 上

iphone - 如何在iphone、xcode中播放视频