opencv ios透明图像加载没有透明度

von*_*dip 5 opencv ios

我正在开发一个使用opencv功能的ios应用程序(删除背景,边缘检测等)

除此之外,我加载透明图像(pngs).出于某种原因,当我加载图像时,opencv决定忽略一些透明区域,同时尊重他人.我可以通过将我的半透明UIImage转换为IplImage然后返回到UIImage(不对iplimage进行任何操作)并将两个图像保存到本地文件来看到这一点.

这是我用于将UIImage转换为IplImage并向后转换的代码:

- (IplImage *)CreateIplImageFromUIImageWithTransparency:(UIImage *)image {
    // Getting CGImage from UIImage
    CGImageRef imageRef = image.CGImage;

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    // Creating temporal IplImage for drawing
    IplImage *iplimage = cvCreateImage(
                                       cvSize(image.size.width,image.size.height), IPL_DEPTH_8U, 4
                                       );
    // Creating CGContext for temporal IplImage
    CGContextRef contextRef = CGBitmapContextCreate(
                                                    iplimage->imageData, iplimage->width, iplimage->height,
                                                    iplimage->depth, iplimage->widthStep,
                                                    colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault
                                                    );
    // Drawing CGImage to CGContext
    CGContextDrawImage(
                       contextRef,
                       CGRectMake(0, 0, image.size.width, image.size.height),
                       imageRef
                       );
    CGContextRelease(contextRef);
    CGColorSpaceRelease(colorSpace);

    // Creating result IplImage
    IplImage *ret = cvCreateImage(cvGetSize(iplimage), IPL_DEPTH_8U, 4);
    cvCvtColor(iplimage, ret, CV_RGBA2BGRA);
    cvReleaseImage(&iplimage);

    return ret;
}


- (UIImage *)UIImageFromIplImage:(IplImage *)image {
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    NSData *data = [NSData dataWithBytes:image->imageData length:image->imageSize];
    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
    CGImageRef imageRef = CGImageCreate(image->width, image->height,
                                        image->depth, image->depth * image->nChannels, image->widthStep,
                                        colorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaLast ,
                                        provider, NULL, false, kCGRenderingIntentDefault);
    UIImage *ret = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpace);
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

什么可能导致这种行为?

谢谢

Pok*_*oko 1

IplImage *ret = cvLoadImage("file.png", CV_LOAD_IMAGE_UNCHANGED);
Run Code Online (Sandbox Code Playgroud)

查看文档:http://opencv.willowgarage.com/documentation/c/reading_and_writing_images_and_video.html

CV_LOAD_IMAGE_UNCHANGED 加载的图像将按原样加载,而默认参数将您的 img 转换为 RGB