我正在开发一个应用程序并使用opencv库. 我遇到的问题只发生在某些图像上(通常是用手机的相机拍摄的),我认为只是转换问题.当我将(有问题的)图像转换为cv :: Mat对象然后向后转动它只
我遇到的问题只发生在某些图像上(通常是用手机的相机拍摄的),我认为只是转换问题.当我将(有问题的)图像转换为cv :: Mat对象然后向后转动它只旋转90度.
以下是导致问题的调用:
cv::Mat tmpMat = [sentImage CVMat]; UIImage * tmpImage = [[UIImage alloc] initWithCVMat:tmpMat]; [imageHolder setImage: tmpImage];
以下是执行从图像到矩阵的转换的函数,反之亦然.
-(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 | kCGBitmapByteOrderDefault); // Bitmap info flags CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), self.CGImage); CGContextRelease(contextRef); return 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 kCGImageAlphaNone | 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; }
现在我在imageHolder(一个UIImageView)中使用了“Aspect Fill”属性,并尝试更改它而没有成功.我也试过看看是否存在转换矩阵的问题并试图改变而没有成功,它也不合逻辑,因为它不会转换每张图片.
我不明白为什么它适用于某些图片而其他图片不适用(用手机相机拍摄的所有照片都不起作用).
如果有人能够阐明这件事我会很感激.
来自相机的以不同方向拍摄的图像(纵向/横向)由iPhone相机以相同的分辨率(相同的行数和列数)保存.不同之处在于JPEG包含一个标志(确切地说,Exif.Image.Orientation标志),用于告诉显示软件图像需要如何旋转才能正确显示.我的猜测是OpenCV在转换时丢失了那些信息(存储在imageOrientation属性中的UIImage中),因此当图像转换回UIImage时,这条信息被设置为默认值(UIImageOrientationUp),解释了为什么某些图像出现在旋转.