数字图像EXIF信息之Jhead
来源:互联网 发布:vb select选中触发事件 编辑:程序博客网 时间:2024/05/01 17:57
前言
在OpenCV相机标定中,有如下公式:
其中
一般可通过相机标定,估计相机内参。此外还有一种方式进行估计,公式如下:
上式很容易理解,即已知图片的宽度,焦距的实际尺寸(mm)以及CCD的宽度大小(mm),即可计算出以像素表示的焦距,通常情况下,
现在问题来了,图像的大小这个获取很简单,那怎么获得焦距以及CCD宽度以mm为单位的尺寸呢?
EXIF
EXIF, 是可交换图像文件的缩写,全称Exchangeable image file format。是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。EXIF可以附加于JPEG、TIFF、RIFF等文件之中,为其增加有关数码相机拍摄信息的内容和索引图或图像处理软件的版本信息。
也就是说,当使用数码相机或者手机拍照获得的图片,都会包含EXIF信息。现在的问题是需要一个EXIF信息的读取工具。
Jhead
读取EXIF的工具很多,其中Jhead算是功能够用,极易简单的工具了。很多其他工具也是基于它而开发。
Jhead webpage。
其官网上提供可执行程序,可直接使用。运行效果如图:
为了使用更方便灵活,重新封装其代码,生成Lib库文件,方便外部程序调用。
头文件定义如下:
//Jheadlib.h#ifndef _JHEADLIB_HPP__#define _JHEADLIB_HPP__#pragma once#ifdef __cplusplusextern "C"{#endif //Jhead Version char* jhead_version(); //ShowInfo = 0,不输出图片信息 // ShowInfo = 1, 输出图片信息 void readJpgExifInfo(char * FileName, int ShowInfo); char* getJpgName(); //Jpg File Size unsigned int getJpgSize(); //Camera Make char * getCamMake(); char * getCamModel(); char * getDateTime(); int getWidth(); int getHeight(); float getFocalLength(); float getCCDWidth(); float getExposureTime(); float getAperture(); float getDistance(); int getJpgQuality();#ifdef __cplusplus}#endif#endif
其中,readJpgExifInfo为获取图片信息的唯一入口,get*()函数为获取对应的图片信息。
主函数调用方式如下:
// main.c#include "stdafx.h"#include "../Jlib/jheadLib.h"#include <stdio.h>#ifdef _DEBUG#pragma comment(lib, "../Debug/Jlib.lib")#else#pragma comment(lib, "../Release/Jlib.lib")#endif // _DEBUGint _tmain(int argc, _TCHAR* argv[]){ char* ch = jhead_version(); printf("Jhead Versin \t: %s\n",ch); if(argc < 2) { printf("Usage: JheadDemo filename(*.jpg). \n"); return -1; } readJpgExifInfo(argv[1],1); printf("======================================\n"); printf("File Name \t: %s\n",getJpgName()); printf("Camera Model \t: %s\n",getCamModel()); printf("Resolution \t: %d x %d\n",getWidth(),getHeight()); printf("Focal Length \t:%4.1fmm\n",getFocalLength()); printf("CCD Width \t: %4.2fmm\n",getCCDWidth()); return 0;}
运行结果如图:
由此,我们可以获得图像的宽度,焦距(mm),以及CCD宽度,使用起来很方便。
通常情况,这里获取到的ccd的宽度是不太准确或者有时图片不包含CCD相关信息,这时候就需要我们通过网络查询了。那怎么查询呢?
这里我们可以获得相机的型号信息,即Camera model。对于数码相机,我们可以很容易查到对应得CCD尺寸,一般该尺寸是对角线长度,单位为英寸,例如,Canon A10 的CCD尺寸为1/2.7” 。根据传感器尺寸对照表,可得出CCD的宽高尺寸为:5.27mm * 3.96mm。
因此,根据开头公式,即可计算出焦距对应的像素尺寸:
focal_length_in_pixel = 640* 5.4 / 5.27 = 655.79 pixels
库文件见个人资源。
- 数字图像EXIF信息之Jhead
- 玩转照片EXIF信息的利刃:jhead命令详解 依据EXIF照片自动旋转
- jhead:编辑exif的利刃
- jhead修改exif的CMD
- PHP开发之读取照片EXIF中的经纬度位置信息
- 读取数码照片Exif信息
- python 取Exif信息
- Android获取Exif信息
- 修改图片exif信息
- JPEG: Exif信息相关
- 获取照片Exif信息
- JPG图片EXIF信息提取工具exif
- C#读取JPEG Exif 信息
- JPG图片叠加exif信息
- Java读取图片EXIF信息
- C#读取图片Exif信息
- Python 读取图片EXIF信息
- Java获取照片EXIF信息
- 44. Wildcard Matching
- Windows编程无聊小游戏
- 接口作为数据类型的应用
- 文章标题
- 批量删除 反选
- 数字图像EXIF信息之Jhead
- 使用redis实现分布式锁(在集群环境下让任务排队执行)
- 1到10的平方和
- FPGA入门实验
- 五.从尾到头打印链表
- hdu 2544 最短路
- CentOS65安装Mysql5.7.20
- 基础练习 字母图形
- 轻松解决桌面或者开始菜单里的图标显示异常