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

ios – 从Matrix转换时旋转的图像,第1张

概述我正在开发一个应用程序并使用opencv库. 我遇到的问题只发生在某些图像上(通常是用手机的相机拍摄的),我认为只是转换问题.当我将(有问题的)图像转换为cv :: Mat对象然后向后转动它只旋转90度. 以下是导致问题的调用: cv::Mat tmpMat = [sentImage CVMat];UIImage * tmpImage = [[UIImage alloc] initWithCV 我正在开发一个应用程序并使用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 channelsCGContextRef 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 flagsCGContextDrawImage(contextRef,CGRectMake(0,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);                     // Intentself = [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转换时旋转的图像全部内容,希望文章能够帮你解决ios – 从Matrix转换时旋转的图像所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1018488.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-23
下一篇2022-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存