gpt4 book ai didi

ios - 从 Matrix 转换时旋转的图像

转载 作者:可可西里 更新时间:2023-11-01 17:08:18 25 4
gpt4 key购买 nike

我正在开发一个应用程序并使用 opencv 库。

我遇到的问题只发生在某些图像上(通常是用手机的相机拍摄的),我确定这只是一个转换问题。当我将(有问题的)图像转换为 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),解释为什么某些图像看起来是旋转的。

关于ios - 从 Matrix 转换时旋转的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18659436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com