Conversiones UIImage cv :: Mat con canal alfa

Estoy usando los siguientes códigos para convertir UIImage* y cv::Mat entre sí:

 - (cv::Mat)cvMatFromUIImage:(UIImage *)image { CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage); CGFloat cols = image.size.width; CGFloat rows = image.size.height; cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels (color channels + alpha) CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // Pointer to data cols, // Width of bitmap rows, // Height of bitmap 8, // Bits per component cvMat.step[0], // Bytes per row colorSpace, // Colorspace kCGImageAlphaNoneSkipLast | kCGBitmapByteOrderDefault); // Bitmap info flags CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage); CGContextRelease(contextRef); return cvMat; } 

y

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

Tomé estos de la documentation de OpenCV . Los uso de la siguiente manera:

 UIImage *img = [UIImage imageNamed:@"transparent.png"]; UIImage *img2 = [self UIImageFromCVMat:[self cvMatFromUIImage:img]]; 

Sin embargo, estas funciones pierden la información del canal alfa. Sé que es debido a las banderas kCGImageAlphaNone y kCGImageAlphaNoneSkipLast , desafortunadamente no pude encontrar una manera de no perder información alfa al cambiar estos indicadores.

Entonces, ¿cómo convierto estos dos types entre sí sin perder información alfa?

Aquí está la image que uso:

introduzca la descripción de la imagen aquí

No debe pasar kCGImageAlphaNoneSkipLast y, en su lugar, pasar (kCGBitmapByteOrder32Host | kCGImageAlphaPremultipliedFirst) para get alfa premultiplicado en formatting BGRA. CoreGraphics solo admite alfa premultiplicado. Pero, necesitará verificar cómo OpenCV representa alfa en píxeles para determinar cómo decirle a OpenCV que los píxeles ya están premultiplicados. El código que he utilizado supone alfa recta con OpenCV, por lo que debes tener cuidado con eso.