海思3519DV500使用libexif

一、交叉编译libexif

1.下载代码与编译
git clone https://github.com/libexif/libexif.git  ##整个地方建议用release版本
cd libexif
mkdir install 
./configure --prefix=${PWD}/install  --enable-shared --enable-static CC=aarch64-v01c01-linux-gnu-gcc --host=aarch64-v01c01-linux-gnu
make 
make install

2.编译完成
/home/ll/code/libexif/
├── include
│   └── libexif
│       ├── exif-byte-order.h
│       ├── exif-content.h
│       ├── exif-data.h
│       ├── exif-data-type.h
│       ├── exif-entry.h
│       ├── exif-format.h
│       ├── exif-ifd.h
│       ├── exif-loader.h
│       ├── exif-log.h
│       ├── exif-mem.h
│       ├── exif-mnote-data.h
│       ├── exif-tag.h
│       ├── exif-utils.h
│       └── _stdint.h
└── lib
    └── libexif.a

二、基础写exif

1.生成exif参数

封装简单接口,获取JPG图片的exif的内存数据,主要是ISO exp,ev,代码可以参考 libexif/contrib/examples/write-exif.c

int GetExifData(char* exifdata, int* exiflen, int iso, int exp, int ev)
{
  ExifEntry* entry;
  ExifData* exif = exif_data_new();
  exif_data_set_option(exif, EXIF_DATA_OPTION_FOLLOW_SPECIFICATION);
  exif_data_set_data_type(exif, EXIF_DATA_TYPE_COMPRESSED);
  exif_data_set_byte_order(exif, FILE_BYTE_ORDER);

  //曝光时间设置 uint:s
  ExifRational exposure_time;   //曝光时间
  exposure_time.numerator = 1;
  exposure_time.denominator = exp;
  entry = init_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_TIME);
  exif_set_rational(entry->data, FILE_BYTE_ORDER, exposure_time);

  //ISO 大小
  entry = init_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_ISO_SPEED_RATINGS);
  exif_set_short(entry->data, FILE_BYTE_ORDER, iso);

  //曝光补偿 unit EV
  ExifSRational exposure_bias_value;
  exposure_bias_value.numerator = 0;
  exposure_bias_value.denominator = ev;
  entry = init_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_BIAS_VALUE);
  exif_set_srational(entry->data, FILE_BYTE_ORDER, exposure_bias_value);
  unsigned char* exif_data;
  unsigned int exif_data_len;
  exif_data_save_data(exif, &exif_data, &exif_data_len);

  int len = 0;
  memcpy(exifdata, exif_header, exif_header_len);
  len = exif_header_len;
  exifdata[len++] = (exif_data_len + 2) >> 8;
  exifdata[len++] = (exif_data_len + 2) & 0xff;
  memcpy(exifdata + len, exif_data, exif_data_len);
  len += exif_data_len;
  *exiflen = len;
  return 0;
}

#### 2.把exif信息写道JPG里面

写入海思编码JPG的时候,因为写入exif信息,需要跳过jpg的头,否则jpg图片会没法显示;
jpg头的数据长度是

int jpegdata_offset = (pData[4] << 8) + pData[5] + 4;

//然后写文件:文件数据内容如下
exifdata + jpg data(jpgData需要把前面jpegdata_offset 长度的数据去掉)

2.2 读取exif

按照写入的逻辑 读取即可

int GetFileExif(char* filename, int* iso, int* exp, int* ev)
{
  ExifData* ed;
  ExifEntry* entry;
  ed = exif_data_new_from_file(filename);
  if (!ed) {
    return -1;
  }
  entry = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_EXPOSURE_TIME);
  ExifRational exposure_time = exif_get_rational(entry->data, FILE_BYTE_ORDER);
  *exp = 1000 / exposure_time.denominator;

  entry = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_ISO_SPEED_RATINGS);
  *iso = exif_get_short(entry->data, FILE_BYTE_ORDER);

  entry = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_EXPOSURE_BIAS_VALUE);
  ExifRational exposure_bias_value = exif_get_rational(entry->data, FILE_BYTE_ORDER);
  *ev = exposure_bias_value.denominator;

  return 0;
}
### 使用UVC协议与海思Hi3519DV500芯片进行视频捕获或流媒体 #### 海思Hi3519DV500简介 Hi3519DV500是一款专为视觉行业设计的超高清新智能SoC,能够支持高达4K@30fps的ISP图像处理能力,并具备多种高级特性如宽动态范围(WDR)、多级降噪、六轴防抖等功能[^2]。 #### UVC协议概述 USB Video Class (UVC) 是一种用于定义如何通过USB接口传输视频的标准。它允许设备无需安装特定驱动即可被操作系统识别并使用其内置摄像头或其他视频源的功能。对于基于Linux系统的嵌入式平台来说,实现UVC功能通常涉及到配置内核模块和支持库。 #### 实现步骤详解 ##### 准备工作环境 确保已经正确设置了开发环境,包括但不限于获取官方提供的SDK工具包,并按照文档说明完成必要的初始化操作。这一步骤至关重要,因为后续所有的开发活动都将依赖于此基础之上[^1]。 ##### 安装必要组件 为了让Hi3519DV500支持UVC功能,需要向目标板加载一些额外的支持文件,比如`libasound.so.2`及其关联的声音子系统资源(`alsa`)。这些软件包有助于构建完整的多媒体框架,从而使得硬件加速编码解码成为可能[^4]。 ##### 编译和部署应用程序 接下来就是编写具体的应用逻辑来控制摄像机的工作模式了。这里推荐采用官方样例工程中的`uvc_app`作为起点,因为它不仅实现了基本的数据采集流程,还展示了怎样调用API函数去设置参数选项(例如分辨率大小)。值得注意的是,在实际运行前还需执行脚本命令`./ConfigUVC.sh`以激活相应的服务端口。 ```bash # 执行此命令启动UVC配置 ./ConfigUVC.sh start ``` ##### 运行测试案例 最后一步便是检验整个链路是否畅通无阻。可以通过连接一台PC主机来进行远程调试;当一切正常运作之后,则应该能够在宿主机侧看到来自远端设备传来的实时画面流。如果遇到任何异常情况,请参照错误提示信息逐步排查原因所在[^3]。 #### 注意事项 在整个过程中可能会碰到各种各样的挑战,特别是关于兼容性和性能优化方面的问题。建议密切跟踪社区论坛上的最新讨论帖,从中汲取宝贵的经验教训,同时也积极分享个人见解以便共同进步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱爬山的木木

佛系111

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值