在opencv2.4.x版本中处理图像EXIF orientation不统一的问题

OpenCV图像直角旋转:cv2.rotate原理、方向判断与坐标映射详解 在图像处理领域,几何变换是基础且高频的技术环节,其中旋转操作尤其常见。对于任意角度的旋转,通常依赖仿射变换,但在处理90度、180度、270度等整数倍直角旋转时,若沿用通用方法不仅计算冗余,还容易因插值产生模糊或尺寸错乱。OpenCV提供的cv2.rotate函数专为这类场景设计,支持三种旋转模式,能自动交换宽高且无需插值,确保像素精准映射。理解其背后的坐标变换公式,可方便地同步旋转目标框与关键点。该函数在照片EXIF方向纠正、OCR文本预处理以及深度学习数据增强中均有广泛应用,相比np.rot90也能避免 阅读详情

在用opencv的imread函数读取手机拍的照片时会出现翻转的情况,即用opencv中的imshow看到的图像和手机上看到的图像的宽高是相反的。(当然,读取电脑上的照片时也可能会出现这个问题)
出现这个问题的原因是opencv中的imread函数读取图像时没有对图像exif中的orientation信息进行解析。而通常的看图工具打开图像时都会根据orientation对图像进行相应的翻转以便我们看到的图像是正常的。
通过查找发现在opencv的源码github中,有人解决了读取orientation的问题,并且在opencv源码中进行了提交。另外,在opencv3.2中也对该问题进行了相关的支持。

为了解决该问题,我从源码中抽取了exif.hpp和exif.cpp两个相关文件,并通过如下函数成功解决了根据orientation对图像进行翻转。

void ReadWithExifOrientation(const String& filename, Mat& img)
{
    img = imread(filename);
    int orientation = IMAGE_ORIENTATION_TL;

    if (filename.size() > 0)
    {
        ExifReader reader( filename );
        if( reader.parse() )
        {
            ExifEntry_t entry = reader.getTag( ORIENTATION );
            if (entry.tag != INVALID_TAG)
            {
                orientation = entry.field_u16; //orientation is unsigned short, so check field_u16
            }
        }
    }

    switch( orientation )
    {
        case    IMAGE_ORIENTATION_TL: //0th row == visual top, 0th column == visual left-hand side
            //do nothing, the image already has proper orientation
            break;
        case    IMAGE_ORIENTATION_TR: //0th row == visual top, 0th column == visual right-hand side
            flip(img, img, 1); //flip horizontally
            break;
        case    IMAGE_ORIENTATION_BR: //0th row == visual bottom, 0th column == visual right-hand side
            flip(img, img, -1);//flip both horizontally and vertically
            break;
        case    IMAGE_ORIENTATION_BL: //0th row == visual bottom, 0th column == visual left-hand side
            flip(img, img, 0); //flip vertically
            break;
        case    IMAGE_ORIENTATION_LT: //0th row == visual left-hand side, 0th column == visual top
            transpose(img, img);
            break;
        case    IMAGE_ORIENTATION_RT: //0th row == visual right-hand side, 0th column == visual top
            transpose(img, img);
            flip(img, img, 1); //flip horizontally
            break;
        case    IMAGE_ORIENTATION_RB: //0th row == visual right-hand side, 0th column == visual bottom
            transpose(img, img);
            flip(img, img, -1); //flip both horizontally and vertically
            break;
        case    IMAGE_ORIENTATION_LB: //0th row == visual left-hand side, 0th column == visual bottom
            transpose(img, img);
            flip(img, img, 0); //flip vertically
            break;
        default:
            //by default the image read has normal (JPEG_ORIENTATION_TL) orientation
            break;
    }
}

exif.hpp和exif.cpp下载地址:http://download.youkuaiyun.com/detail/computerme/9884696
使用姿势如下:

#include <opencv2/opencv.hpp>
#include "exif.hpp"

int  main(int argc,char *argv[])
{
    char* testimage = "/Users/Downloads/IMG_4198.JPG";
    Mat img; 
    ReadWithExifOrientation(testimage, img);  //new image read function

    return 1;
}

Reference:
https://github.com/opencv/opencv/pull/5538/commits/0a306f88047586356548335f5e8c9697ce43b8fc
https://my.oschina.net/shf/blog/876489
https://fossies.org/dox/opencv-3.2.0/exif_8cpp_source.html
http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html

OpenCV核心接口与图像处理实战指南 计算机视觉作为人工智能的重要分支,其核心在于图像处理算法的实现与应用。OpenCV作为行业标准库,通过模块化接口设计提供了从基础图像容器到高级视觉算法的完整解决方案。在工程实践中,掌握核心接口如cv::imread图像读写、cvtColor色彩空间转换、以及特征检测匹配等关键技术,能显著提升开发效率。特别是在工业视觉检测、智能安防、自动驾驶等场景中,合理使用UMat加速接口和并行处理技术,可实现算法性能的成倍提升。本文以OpenCV4.x为例,详解包括图像滤波、相机标定、深度学习模型部署在内的20%高频使用 阅读详情

相关推荐

ImageGlass:用C#打造的“图像魔法引擎“——从像素到EXIF的全栈图像查看器

某设计师因图像查看器崩溃丢失元数据——而这个灾难本可以通过C#的高性能图像处理避免! 本文将用代码+架构+实战案例,手把手教你:用户界面图像渲染引擎文件读取模块格式解析器EXIF元数据解析GPU加速层快捷键系统 二、核心模块:图像渲染的"心脏" 2.1 图像加载类 三、性能优化:用GPU加速的"丝滑缩放" 3.1 GPU加速渲染类(SkiaSharp) 四、多格式支持:用Magick.NET处理特殊格式 五、EXIF元数据解析:用ExifLib挖掘隐藏信息 六、UI交互:用WPF实现"丝

java专栏 1144

OPENCV针对图像EXIF旋转问题

1. 20170227. EXIF信息的说明(opencv320 ApplyExifOrientation) https://blog.csdn.net/u014488388/article/details/58102020 2.使用OpenCV读写图片 https://www.cnblogs.com/puheng/p/9228500.html 3.图片Exif 信息中Orientat...

fangyan的专栏 2740

算法实战应用案例精讲-【图像处理】数字图像处理从原理到应用(python代码实战)

将图片翻译成文字一般被称为光学文字识别(Optical Character Recognition,OCR)。可以实现OCR 的底层库并不多,目前很多库都是使用共同的几个底层OCR 库,或者是在上面进行定制。Tesseract 是一个OCR 库,目前由Google 赞助(Google 也是一家以OCR 和机器学习技术闻名于世的公司)。Tesseract 是目前公认最优秀、最精确的开源OCR 系统。除了极高的精确度,Tesseract 也具有很高的灵活性。

qq_36130719的博客 1082

图像处理之EXIF信息

在绘制图片上标注的轮廓或矩形框等形状时,如果EXIF信息存在则需要注意

qq_15203169的博客 1331

Python图像批量处理:鲁棒性、EXIF保留与跨平台实践

图像批量处理是数字内容生产中的基础技术需求,涉及格式兼容、元数据管理、内存控制与环境适配等核心问题。其底层原理依赖于图像解码器稳定性(如OpenCV快速校验 vs Pillow元数据保留)、重采样算法选择(LANCZOS兼顾清晰度与性能)及进程调度机制(tqdm+concurrent.futures实现可靠多进程)。该技术具备显著工程价值:提升万级图片处理吞吐量、规避损坏文件中断、支持中文路径与Docker无头环境。典型应用场景包括摄影工作室自动化出片、电商图素材预处理、医疗影像归档系统。本文聚焦真实落地难

weixin_31364787的博客 190

处理图像的exif中的orientation信息

解决用opencv imread读取图像时方向存在翻转的问题,使用参考http://blog.csdn.net/computerme/article/details/73929406

opencv常用图像处理函数详解(一)

opencv 常用图像处理函数详解(一),利用opencv读取图像,保存图像,获取Mat中指定位置像素的值,转换图像的色彩,叠加两张图像,对图像进行二值化处理

qq_30150579的博客 1310

读取或解析图片的exif信息

通过导入一张图片,调用封装好的函数尽心解析图片的信息,可以提取里面全部信息,例如经纬度,时间,相机的信息,光照,高度,等等,你需要按照一下步骤进行了 Cexif exif; // EXIFINFO pexif=(EXIFINFO *)malloc(sizeof(EXIFINFO)); if(pexif==NULL) return; FILE *fp=fopen(path,"rb");//path图片的路径 exif.DecodeExif(fp); exif.getExifinfo(pexif); fclose(fp);

使用opencv和PIL矫正带有EXIF信息的图像

【代码】使用opencv和PIL矫正带有EXIF信息的图像。

穆友航的博客 417

revit二次开发环境搭建(2024版)(小白友好)

revit二次开发环境配置,SDK、addin manager和lookup新手友好安装教程

m0_56961251的博客 1420

Robocopy 参数进阶:/MIR 镜像同步与 /PURGE 删除操作的风险规避指南

本文深入解析Robocopy的/MIR镜像同步与/PURGE删除操作的高级用法及风险规避策略。通过实际案例和四重防护机制,指导用户安全实现目录同步,避免数据丢失风险,特别适用于远程主机间的数据复制与备份场景。

weixin_33462927的博客 356

YOLO26 OpenCV依赖:cv2在图像预处理中的关键作用

本文介绍了如何在星图GPU平台上自动化部署最新 YOLO26 官方版训练与推理镜像,充分发挥OpenCV(cv2)在图像预处理中的核心作用。该镜像开箱即用,支持高效目标检测任务,典型应用于安防监控中实时车辆与行人识别、工业质检中的缺陷定位等场景,显著提升检测精度与部署效率。

weixin_42388898的博客 702

形式化方法(Formal Methods)和人工智能(Artificial Intelligence)

一、形式化方法(Formal Methods) ​ 形式化方法最初应用在硬件上,验证硬件的正确性,后面逐渐应用到软件编程中,能够在软件中找到软件的错误,验证软件的安全可靠。形式化方法更加接近离散数学,所以其应用难度非常大,同时学习成本也较高。再加上形式化方法的大多数理论还停留在上个世纪,由于程序越来越复杂,导致形式化方法进行验证需要大量人工和时间,以至于现在绝大部分软件开发人员完全没有考虑过这个方法,甚至没有听说过这个名词。 ​ 形式化方法最新的应用成果是在工业上,比如一些极其重要且对安全性要求极高的领域(

qq_37030400的博客 4004

Python OpenCV图像处理基础

numpy.np.full((height,width,channels),dtype=np. uint8) (需要import numpy),表示程序将会等待1000毫秒后关闭,这种方式常用于视频播放或实时摄像头捕获场景,以便控制每一帧停留的时间,同时允许用户通过按键来中断循环或发出命令。语句:numpy.zeros((height,width,channels),dtype=np. uint8)例如提取图像左上角 100x100 区域,坐标为(0,0) ,(100,100)

qq_65609043的博客 738

simulink求解器选择的小tip

给出了simulink选择求解器的一种tip,与积分初值有关。

高能阿博特的博客 2054

CCSP考后复盘:那些刷题时感觉良好,考场却发懵的题目到底长什么样?

本文深入分析了CCSP考试中常见的题目陷阱和解题策略,揭示了刷题与实战的差距。通过解析换装题、双胞胎选项和场景题等典型题型,帮助考生掌握拆题技巧和思维模式转变,提升应对CCSP考试的能力。

weixin_30485379的博客 436

图片旋转判断模型+OpenCV:构建端到端图像处理系统

本文介绍了基于“星图GPU”平台自动化部署“图片旋转判断”镜像的完整方案。通过集成阿里开源的深度学习模型与OpenCV,系统可高效实现图像方向检测与自动校正,适用于文档扫描、OCR预处理等场景,显著提升AI图像处理流程的自动化水平与准确性。

weixin_30633869的博客 993

【四足机器人实战】四足机器人运动学、动力学模型

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!四足机器人的运动学和动力学模型是其设计和控制的基础,涉及到如何精确描述和预测机器人在不同条件下的运动状态和行为本文先对四足机器人运动学、动力学模型做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章运动学模型主要关注四足机器人的几何形态和时间序列下的运动特性,而动力学模型则进一步考虑了引起这些运动的力和扭矩的作用效果。运动学模型:运动学模型描述了四足机器人在没有考虑力的影响下的运动特性。

qq_35635374的博客 1055

从图片压缩到格式转换:用OpenCV cv2.imwrite打造你的简易图像处理工作流

本文详细介绍了如何利用OpenCV的`cv2.imwrite`函数构建高效的图像处理工作流,涵盖图片压缩、格式转换和批量处理等核心功能。通过实际案例展示JPEG、PNG和WebP等格式的质量优化技巧,帮助开发者快速实现自动化图像处理,提升工作效率。

weixin_30847939的博客 418

DeepSeek与YOLO融合技术的微信小程序实现方案

本文介绍了一个基于微信小程序和Flask后端的智能图像检测系统。系统采用DeepSeek-7B进行自然语言理解,YOLOv8执行目标检测,并通过融合验证模块确保结果准确性。核心流程包括:用户通过小程序上传图片和文本需求,后端解析意图后执行目标检测,最后验证并返回结果。关键技术包括DeepSeek的指令理解、动态阈值调整和模型优化(ONNX、TensorRT)。系统适用于工业质检等场景,如"检测表面划痕",能自动识别目标并验证结果。部署需GPU服务器,并包含安全机制保障系统稳定运行。

老郑的博客 273

王者荣耀AI绝悟如何选英雄?

王者荣耀AI绝悟如何选英雄? 【抢射手?抢中单位?「绝悟」在打王者荣耀时是如何选英雄的?】 腾讯 AI Lab 开发的 AI 智能体「绝悟」已让王者峡谷不再只是人类召唤师的竞技场,而且这个 AI 战队在上月底进化成了「完全体」。在一局完整的比赛中,英雄选择阶段是至关重要的(比如五射手或五法师阵容会有官方劝退)。 近日,腾讯 AI Lab 和上海交通大学发布的一篇论文介绍了绝悟的英雄选择策略:Ju...

不断学习,不断进步,提高自己 1万+

python获取图像的长和宽_关于python读jpg照片长宽不对应问题

最近在做相机照片的物体检测,处理数据进行数据增强(data augument)时候,采用的读图操作:img = cv2.imread(path)然后在检查数据增强后的数据和对应的box框是否对应时候,发现,居然出问题了!新resize扩充的图像的Box与原图并不对应!!!经查找资料,发现opencv 2.x版本在读取相机jpg照片时候,没有正确解析相机的EXIF信息,所以读取的长宽和实际的长宽是反...

weixin_35304632的博客 1245

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

锐浪报表PictureBox图像打印排坑指南:模糊变形裁切性能与方向处理

在报表开发中,图片打印的清晰度与稳定性往往取决于对图像数据的规范化处理。DPI作为打印分辨率的基准,决定了像素到物理尺寸的换算逻辑,而EXIF方向信息则直接影响手机照片的显示效果。理解屏幕渲染与打印渲染的差异,是解决图像模糊、变形等问题的前提。在实际工程中,通过统一DPI、预处理图像体积、修正方向等操作,可以大幅提升报表输出质量。针对锐浪报表(Grid++Report)中的PictureBox控件,本文梳理了图像打印最常见的五大类高频故障,包括模糊发虚、变形失真、显示不全、性能瓶颈以及方向与局部放大需求,并

weixin_34200628的博客 287

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

AI图像处理实战:从基础分类到照片增强

图像处理是计算机视觉的基础技术,通过算法对像素矩阵进行变换实现特征提取与增强。其核心原理包括色彩空间转换、卷积运算和特征映射等技术,在工业质检、医疗影像等领域有广泛应用。深度学习框架如PyTorch通过预训练模型大幅降低了技术门槛,配合OpenCV等工具链可快速构建照片处理系统。本文以典型AI照片处理项目为例,详解从数据预处理到模型部署的全流程,特别针对图像分类、目标检测等常见任务,分享使用ResNet、YOLOv8等模型的实战经验,并给出内存优化、训练加速等工程化建议。

weixin_34138056的博客 395

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

OpenCV笔记-图像预处理1

个人笔记整理

CavalierJHC的博客 2064

C# 使用OpenCV基本图像操作功能

OpenCV是一个开源的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。C#在上位机开发中比较常用,有些项目需要在上位机上加入一些机器视觉相关的功能,在下面简单介绍了C#中使用OpenCV库的方法。

海盗Sharp的博客 4432
上一篇: C++读取存储float文件(txt文件和二进制文件)
下一篇: 把txt中的中文字从一行转换到一列存到新文件中
IT修道者
IT修道者 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄17年 326粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值