JAVA-通过大疆TSDK的API直接获取红外图片温度信息
一、前言
看过很多关于大疆红外图片用TSDK取温的方式,但是网上能搜到的大部分教程都是通过官方下载文件smple编译出来的程序来取温,如果这样做,虽然确实也能够实现目的,但不得不说,不但会降低运行速度,而且代码调用起来也麻烦。所以不如研究一下怎么直接调用他们的C++ API。
先说下大疆TSDK(Thermal Sdk),目前更新版本为1.6,这个版本目前已经适配的机型和镜头包括御2、御3无人机、M30T无人机、H20T/N镜头、H30T镜头,理论上这个SDK能够在任何基于X86架构的操作系统中使用,包含Linux和windows,但对于ARM架构的操作系统比如Android、移动计算设备等都是不支持的,这个SDK定位就只是桌面端应用。
Thermal Sdk下载地址:https://www.dji.com/cn/downloads/softwares/dji-thermal-sdk,下载之后可以看到以下目录:

sample目录是一个集成所有功能的实例程序,可以直接运行里面的build就可编译出来,然后参考readme.md来执行命名行,相应的在JAVA可以通过调用命令行来实现功能。但本文并不讲这个。
调用api所需要的所有库都存放在tsdk-coare,打开后是这样的:

api中的头文件可以看到官方暴露出来的api,lib则是对应的so/dll库文件,需要将所有库文件放在同一目录。
二、环境依赖
既然TSDK的库是so或dll,那么理所当然的可以使用JNA或者JNI调用,我使用的是JNA。在pom.xml中引入JNA依赖:
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.13.0</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>5.13.0</version>
</dependency>
三、调用
1、调用准备
新建一个TsdkLibrary类,并继承jna的library接口:

去api目录中的dirp_api.h找需要的函数,比如说下面几个是红外取温需要的:
// 存放图片分辨率的结构体
typedef struct {
int32_t width; /**< Horizontal size */
int32_t height; /**< Vertical size */
} dirp_resolution_t;
// 通过图片创建指针DIRP_HANDLE
dllexport int32_t dirp_create_from_rjpeg(const uint8_t *data, int32_t size, DIRP_HANDLE *ph);
// 获取图片分辨率
dllexport int32_t dirp_get_rjpeg_resolution(DIRP_HANDLE h, dirp_resolution_t *resolution);
// 销毁DIRP_HANDLE
dllexport int32_t dirp_destroy(DIRP_HANDLE h);
// 获取红外图片温度,返回值为整数(真实温度=返回值/10)
dllexport int32_t dirp_measure(DIRP_HANDLE h, int16_t *temp_image, int32_t size);
// 获取红外图片温度,返回值为小数(为真实温度)
dllexport int32_t dirp_measure_ex(DIRP_HANDLE h, float *temp_image, int32_t size);
因为有结构体,所以还有创建一个jna对应的图片分辨率结构体类,然后将属性填入(注意要初始化):
package org.fly.library.struct;
import com.sun.jna.Structure;
public class dirp_resolution_t extends Structure {
public int width = 0;
public int height = 0;
@Override
protected java.util.List<String> getFieldOrder() {
return java.util.Arrays.asList("width", "height");
}
}
比如要重写getFieldOrder方法!!!
然后再将需要的函数填写到TsdkLibrary接口(要注意名字一定要对应上!!):
package org.fly.library;
import com.sun.jna.Library;
import com.sun.jna.Pointer;
import org.fly.library.struct.dirp_resolution_t;
public interface TsdkLibrary extends Library {
// 通过图片创建指针DIRP_HANDLE
int dirp_create_from_rjpeg(byte[] data, int size, Pointer ph);
// 获取图片分辨率
int dirp_get_rjpeg_resolution(Pointer h, dirp_resolution_t resolution);
// 销毁DIRP_HANDLE
int dirp_destroy(Pointer h);
// 获取红外图片温度,返回值为整数(真实温度=返回值/10)
int dirp_measure(Pointer h, byte[] temp_image, int size);
// 获取红外图片温度,返回值为小数(为真实温度)
int dirp_measure_ex(Pointer h, byte[] temp_image, int size);
}
因为c++中很多数据类型是java中没有的,所以需要更换对应,比如说c++中的int32_t对应java中的int,int8对应byte,typedef void对应Pointer等等,可自行网上查找,这里不列举了。
2、使用
新建一个工具类或者在你想要调用api的类中通过静态代码块加载TsdkLibrary:
// tsdk库
public static TsdkLibrary tsdkLibrary;
static {
tsdkLibrary = Native.load("E:\\SDK\\dji_thermal_sdk_v1.6_20240927\\tsdk-core\\lib\\windows\\release_x64\\libdirp.dll", TsdkLibrary.class);
}
然后就可以进行使用了,获取图片温度如下:
package org.fly;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import org.fly.library.TsdkLibrary;
import org.fly.library.struct.dirp_resolution_t;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class Main {
// tsdk库
public static TsdkLibrary tsdkLibrary;
static {
tsdkLibrary = Native.load("E:\\SDK\\dji_thermal_sdk_v1.6_20240927\\tsdk-core\\lib\\windows\\release_x64\\libdirp.dll", TsdkLibrary.class);
}
// 图像处理指针
public static Pointer dirpHandle;
/**
* 创建指针句柄
*/
public static void createHandle(InputStream is,long length) throws IOException {
// 创建空句柄指针
dirpHandle = new Memory(length);
byte[] buffer = new byte[(int)length];
is.read(buffer,0,(int)length);
// 指针分配
tsdkLibrary.dirp_create_from_rjpeg(buffer, buffer.length, dirpHandle);
}
/**
* 关闭指针
*/
public static void closeHandle(Pointer handle) {
tsdkLibrary.dirp_destroy(handle.getPointer(0));
}
/**
* 设置红外图片
*/
public static void setImageFile(String fileName) throws IOException {
FileInputStream fis = new FileInputStream(fileName);
if(dirpHandle !=null){
closeHandle(dirpHandle);
}
createHandle(fis,fis.available());
fis.close();
}
/**
* 获取红外图片温度
*/
public static float[][] getImageTem(String fileName) throws IOException {
setImageFile(fileName);
// 获取分辨率
dirp_resolution_t resolution = new dirp_resolution_t();
tsdkLibrary.dirp_get_rjpeg_resolution(dirpHandle.getPointer(0),resolution);
int imageSize = resolution.width * resolution.height*4;
byte[] imageBytes = new byte[imageSize];
tsdkLibrary.dirp_measure_ex(dirpHandle.getPointer(0),imageBytes,imageSize);
int k = 0;
float[][] imageTem = new float[resolution.height][resolution.width];
byte[] data = new byte[4];
int col = 0;
int row = 0;
// 循环获取float温度
while (k < imageSize) {
data[0] = imageBytes[k];
data[1] = imageBytes[k+1];
data[2] = imageBytes[k+2];
data[3] = imageBytes[k+3];
imageTem[row][col] = bytes2Float(data);
k += 4;
col++;
if(col == resolution.width){
row++;
col = 0;
}
}
return imageTem;
}
/**
* 字节数组转float
*/
public static float bytes2Float(byte[] bytes) {
int accum = 0;
accum = accum | ( bytes[0] & 0xFF);
accum = accum | ( bytes[1] & 0xFF) << 8;
accum = accum | ( bytes[2] & 0xFF) << 16;
accum = accum | ( bytes[3] & 0xFF) << 24;
return Float.intBitsToFloat(accum);
}
public static void main(String[] args) {
float[][] imageTem = null;
try {
imageTem = getImageTem("E:\\SDK\\dji_thermal_sdk_v1.6_20240927\\dataset\\H20T\\DJI_0001_R.JPG");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
JAVA-通过大疆TSDK的API直接获取红外图片温度信息的更多相关文章
- 【API】获取优酷视频信息接口
序: 自己的网站中需要接入一个视频模块,虚拟主机的空间小所以只能引用第三方的链接.感觉国内优酷好不错,所以查了一下优酷的接口. 0x00: 先去优酷API开放中心申请一个开 ...
- 如何精确地测量java对象的大小-底层instrument API
转载: 如何精确地测量java对象的大小-底层instrument API 关于java对象的大小测量,网上有很多例子,大多数是申请一个对象后开始做GC,后对比前后的大小,不过这样,虽然说这样测量对象 ...
- Java 9 揭秘(10. 模块API)
Tips 做一个终身学习的人. 在本章节中,主要介绍以下内容: 什么是模块 API 如何在程序中表示模块和模块描述 如何读取程序中的模块描述 如何表示模块的版本 如何使用Module和ModuleDe ...
- java处理大文本方案
转载自:http://langgufu.iteye.com/blog/2107023 java处理大文件,一般用BufferedReader,BufferedInputStream这类带缓冲的Io类, ...
- python、Java、大数据和Android的薪资如何?
莫名其妙,从去年年底开始,Python这个东西在中国,突然一下子就火起来了,直至现在,他的热度更是超越了java,成为软件工程师最为关注的话题.Python之所以能火起来,很大一方面是因为大数据.人工 ...
- java十大低级错误和常见注意点
Java十大低级错误 1. 不能用“==”比较两个字符串内容相等. 2. 对list做foreach循环时,循环代码中不能修改list的结构. java foreach只能用于只读的情况.如果需要删除 ...
- 大疆无人机 Android 开发总结——视频解码
DJI_Mobile_SDK是大疆为开发者提供的开发无人机应用的开发接口,可以实现对无人机飞行的控制,也可以利用无人机相机完成一些视觉任务.目前网上的开发教程主要集中于DJI 开发者社区,网上的资源非 ...
- java之大文件分段上传、断点续传
文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦.缺乏交互.用户体验差. 一.前端代码 英国程序员Remy Sharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用 ...
- java+web+大文件上传下载
文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦.缺乏交互.用户体验差. 一.前端代码 英国程序员Remy Sharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用 ...
- java集合大总结
Java集合大总结 java集合框架简图(API关系图): 虚线框表示接口,实线框表示类. 特点和使用总结: Collection: 单列单值. List: 有序(查询顺序和插入顺序一致),有下标(索 ...
随机推荐
- CF1661 Educational Codeforces Round 126 (Rated for Div. 2) 题解
感觉,越来越拉胯了,有点难过,明天希望可以好好学习,好好准备考研!八成新的自己我来力! A Array Balancing 很明显的签到题,要求两个数组各自的相邻项差的绝对值最小,设\(mn=\min ...
- (系列六).net8 全局异常捕获机制
说明 该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发). 该系统文章,我会尽量说的非常详细,做到不管新手.老手都能看懂. 说明:OverallAuth2 ...
- 2024 年 04 月编程语言排行榜,PHP 排名创新低?
编程语言的流行度总是变化莫测,每个月的排行榜都揭示着新的趋势.2024年4月的编程语言排行榜揭示了一个引人关注的现象:PHP的排名再次下滑,创下了历史新低.这种变化对于PHP开发者和整个技术社区来 ...
- Vue 实现 PDF 导出功能
旨在通过 html2canvas 和 jspdf,先将页面的 html 转成 canvas,再将 canvas 转成 pdf,同时解决了分页截断的问题. 安装依赖 yarn add html2canv ...
- 从0到1实现项目Docker编排部署
在深入讨论 Docker 编排之前,首先让我们了解一下 Docker 技术本身.Docker 是一个开源平台,旨在帮助开发者自动化应用程序的部署.扩展和管理.自 2013 年推出以来,Docker 迅 ...
- Linux新建用户无法登陆系统的解决方案
前言 出现这个问题的原因,就是大家没有从基础开始学Linux,导致很多基础操作不会使用,遇到问题反而用搜索引擎搜索,得到一堆相似的答案,你就信了,因为重复就是权威.而你不清楚的是,这个答案是无数人复制 ...
- 需求解决 _针对特定Class设置样式 _CSS _20210906
需求解决 _针对特定Class设置样式 _CSS _20210906 有一个需求,需要对一些具有 某个Class的标签 ,icon,以及其中的字体设置 隐藏或者展示 解决方法如下:(需要对 该页面引用 ...
- vue3 + h5 构建流程
目录 目录 初始化项目架构 技术栈 工具类 环境 搭建流程 初始化项目 初始化git 运行项目 配置 server环境 vite.config.ts 配置项目环境 增加三个文件 修改package.j ...
- 登陆mysql,Can 't connect to local MySQL server through socket '/tmp/mysql.sock '(2) "
今天ssh到slave机器上,登陆mysql,遇到下图的报错. 查了一圈,最终解决办法简洁的出乎意料. 首先,要查看mysql服务是否已经启动(真的太容易漏掉) 第2步,你可能会自然而然的以为密码也是 ...
- 【一步步开发AI运动小程序】七、进行运动计时、计数
随着人工智能技术的不断发展,阿里体育等IT大厂,推出的"乐动力"."天天跳绳"AI运动APP,让云上运动会.线上运动会.健身打卡.AI体育指导等概念空前火热.那 ...