前提:红外摄像厂商的SDK中只提供了在windows下的红外温度获取及解析的代码实例并且需要依托VS进行部署,那么如何在linux下实现这个功能?
准备资料:供应商的SDK、linux环境等
本次是以c++代码进行二次开发为例,具体代码如下:
1. 红外温度数据获取代码:
#include <iostream>
#include <cstring>
#include "HCNetSDK.h"
FILE* fTemData = NULL;
void CALLBACK g_RealDataCallBack_V30(LONG lRealHandle, DWORD dwDataType, BYTE* pBuffer, DWORD dwBufSize, void* dwUser)
{
// 将获取到的全屏测温温度矩阵数据保存到本地文件,后面需要根据数据结构自行解析
switch (dwDataType)
{
case NET_DVR_SYSHEAD:
break;
case NET_DVR_STREAMDATA:
if (fTemData != NULL)
{
fwrite(pBuffer, dwBufSize, 1, fTemData);
}
break;
default:
break;
}
}
int main() {
//---------------------------------------
// 初始化
NET_DVR_Init();
//---------------------------------------
// 注册设备
LONG lUserID;
// 登录参数,包括设备地址、登录用户、密码等
NET_DVR_USER_LOGIN_INFO struLoginInfo = { 0 };
struLoginInfo.bUseAsynLogin = 0; // 同步登录方式
strcpy(struLoginInfo.sDeviceAddress, "xxx"); // 设备IP地址
struLoginInfo.wPort =xxx ; // 设备服务端口
strcpy(struLoginInfo.sUserName, "admin"); // 设备登录用户名
strcpy(struLoginInfo.sPassword, "xxx"// 设备登录密码
// 设备信息,输出参数
NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = { 0 };
lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40);
if (lUserID < 0)
{
printf("Login failed, error code: %d\n", NET_DVR_GetLastError());
NET_DVR_Cleanup();
return 1;
}
//---------------------------------------
// 全屏测温参数配置
// 输入参数
NET_DVR_XML_CONFIG_INPUT struInput = { 0 };
struInput.dwSize = sizeof(struInput);
// 输出参数
NET_DVR_XML_CONFIG_OUTPUT struOutputParam = { 0 };
struOutputParam.dwSize = sizeof(struOutputParam);
char szUrl[512]; // URL
char szOutput[8 * 1024] = { 0 }; // 输出结果
char szStatusBuf[1024] = { 0 }; // 状态信息
char pBuf[2 * 1024] = { 0 };
// 获取参数
memset(szUrl, 0, sizeof(szUrl));
sprintf(szUrl, "%s", "GET /ISAPI/Thermal/channels/2/streamParam\r\n");
// 不同功能对应不同URL
struInput.lpRequestUrl = szUrl;
struInput.dwRequestUrlLen = strlen(szUrl);
// 获取时输入为空
struInput.lpInBuffer = NULL;
struInput.dwInBufferSize = 0;
// 分配输出内存
memset(szOutput, 0, sizeof(szOutput));
struOutputParam.lpOutBuffer = szOutput;
struOutputParam.dwOutBufferSize = sizeof(szOutput);
// 输出状态
memset(szStatusBuf, 0, sizeof(szStatusBuf));
struOutputParam.lpStatusBuffer = szStatusBuf;
struOutputParam.dwStatusSize = sizeof(szStatusBuf);
if (!NET_DVR_STDXMLConfig(lUserID, &struInput, &struOutputParam))
{
printf("NET_DVR_STDXMLConfig failed, error code: %d\n", NET_DVR_GetLastError());
}
else
{
printf("NET_DVR_STDXMLConfig successfully!\n");
printf("%s\n", szOutput);
}
// 设置参数
memset(szUrl, 0, sizeof(szUrl));
sprintf(szUrl, "%s", "PUT /ISAPI/Thermal/channels/2/streamParam\r\n");
// 输入JSON数据
memset(pBuf, 0, sizeof(pBuf));
strcpy(pBuf, "<ThermalStreamParam xmlns=\"http://www.isapi.org/ver20/XMLSchema\" version=\"2.0\">"
"<videoCodingType>pixel-to-pixel_thermometry_data</videoCodingType>"
"</ThermalStreamParam>");
// 输入参数
struInput.lpInBuffer = pBuf;
struInput.dwInBufferSize = sizeof(pBuf);
// 输出结果
memset(szOutput, 0, sizeof(szOutput));
struOutputParam.lpOutBuffer = szOutput;
struOutputParam.dwOutBufferSize = sizeof(szOutput);
// 输出状态
memset(szS