opencv ios image trasparente caricata senza trasparenza

Sto sviluppando un'applicazione ios che utilizza alcune funzionalità opencv (rimuovi lo background, i rilevamenti dei bordi ecc.)

Tra le altre cose, carico le immagini trasparenti (png). Per qualche motivo, quando carico le immagini, opencv decide di ignorare alcune aree trasparenti nel rispetto degli altri. Posso vedere questo convertendo il mio UIImage semi trasparente in un IplImage e poi di nuovo in UIImage (senza fare alcuna operazione sull'iplimage) e salvando entrambe le immagini nel file locale.

Questo è il codice che sto usando per convertire UIImage in IplImage e backward:

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

Cosa potrebbe causare questo comportmento?

Grazie

Solutions Collecting From Web of "opencv ios image trasparente caricata senza trasparenza"

Questo codice funziona per me. Ho modificato il codice da qui

Leggendo da UIImage

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

Conversione in UIImmagine:

 + (UIImage *)imageWithCVMat:(const cv::Mat&)cvMat { return [[UIImage alloc] initWithCVMat:cvMat]; } - (id)initWithCVMat:(const 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); CGImageRef imageRef = CGImageCreate(cvMat.cols, // Width cvMat.rows, // Height 8, // Bits per component 8 * cvMat.elemSize(), // Bits per pixel cvMat.step[0], // Bytes per row colorSpace, // Colorspace kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault, // Bitmap info flags provider, // CGDataProviderRef NULL, // Decode false, // Should interpolate kCGRenderingIntentDefault); // Intent self = [self initWithCGImage:imageRef]; CGImageRelease(imageRef); CGDataProviderRelease(provider); CGColorSpaceRelease(colorSpace); return self; } 

Penso che questo sia il problema:

 CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

Non dovresti usare RGBA qui?

 IplImage *ret = cvLoadImage("file.png", CV_LOAD_IMAGE_UNCHANGED); 

dare un'occhiata al documento: http://opencv.willowgarage.com/documentation/c/reading_and_writing_images_and_video.html

CV_LOAD_IMAGE_UNCHANGED l'image caricata verrà caricata così com'è, mentre l'argomento predefinito convertirà il tuo img in RGB