当前位置: 首页 > news >正文

海康相机SDK封装

1.海康双光相机SDK

a.fcg_jmc_temp_ai.cpp

#include <stdio.h>
#include <iostream>
#include "Windows.h"
#include "./include/HCNetSDK.h"
#include"HikCamera.h"
#include <opencv2/opencv.hpp>
using namespace std;void saveMat(const char* pDataBuf, const int m_AnalysisHotPic_W=384, const int m_AnalysisHotPic_H=288)
{cv::Mat temp_mat(m_AnalysisHotPic_H, m_AnalysisHotPic_W, CV_32FC1);int iIndex = 0;float minTemp = 10000.0;float maxTemp = -10000.0;for (int iWriteHeight = 0; iWriteHeight < m_AnalysisHotPic_H; ++iWriteHeight){for (int iWriteWidth = 0; iWriteWidth < m_AnalysisHotPic_W; ++iWriteWidth){float fTemp = *((float*)(pDataBuf + iIndex));//判断fTemp是否是一个正常值,不是则赋值最大或最小,防止设备崩溃fTemp = (9999 < fTemp) ? 9999 : ((-9999 > fTemp) ? -9999 : fTemp);minTemp = (minTemp > fTemp) ? fTemp : minTemp;maxTemp = (maxTemp > fTemp) ? maxTemp : fTemp;temp_mat.at<float>(iWriteHeight, iWriteWidth) = fTemp;iIndex += 4;}}printf("convert Successfully!\n");return;
}void Analyze_temp_data()
{//打开本地保存的文件FILE* datafilefp = fopen("Jpegwithappend_20250925112824163.data", "rb+");if (NULL == datafilefp){printf("Failed to open the file\n");return;}int m_AnalysisHotPic_W = 384; //根据抓热图接口返回的图像宽dwJpegPicWidth进行赋值int m_AnalysisHotPic_H = 288; //根据抓热图接口返回的图像高dwJpegPicHeight进行赋值int bufSize = m_AnalysisHotPic_H * m_AnalysisHotPic_W * 4;char* pDataBuf = (char*)malloc(bufSize);if (NULL == pDataBuf){return;}//读取文件里面所有数据fread(pDataBuf, bufSize, 1, datafilefp);//保存分析结果的文件FILE* fp = fopen("JpegwithappendResult.csv", "wb");if (NULL == fp){return;}int iIndex = 0;char temp[10] = { 0 };float minTemp = 10000.0;float maxTemp = -10000.0;for (int iWriteHeight = 0; iWriteHeight < m_AnalysisHotPic_H; ++iWriteHeight){for (int iWriteWidth = 0; iWriteWidth < m_AnalysisHotPic_W; ++iWriteWidth){float fTemp = *((float*)(pDataBuf + iIndex));//判断fTemp是否是一个正常值,不是则赋值最大或最小,防止设备崩溃fTemp = (9999 < fTemp) ? 9999 : ((-9999 > fTemp) ? -9999 : fTemp);minTemp = (minTemp > fTemp) ? fTemp : minTemp;maxTemp = (maxTemp > fTemp) ? maxTemp : fTemp;memset(temp, 0, sizeof(temp));sprintf(temp, "%.2f,", fTemp);if (1 != fwrite(temp, sizeof(temp), 1, fp)){fclose(fp);fp = NULL;return;}iIndex += 4;}if (1 != fwrite("\n", sizeof("\n"), 1, fp)){fclose(fp);fp = NULL;return;}}if (datafilefp != NULL){fclose(datafilefp);datafilefp = NULL;}if (fp != NULL){fclose(fp);fp = NULL;}printf("Analyze Successfully!\n");return;}void capture_img_get_temp() 
{//---------------------------------------// 初始化NET_DVR_Init();//---------------------------------------// 注册设备LONG lUserID;//登录参数,包括设备地址、登录用户、密码等NET_DVR_USER_LOGIN_INFO struLoginInfo = { 0 };struLoginInfo.bUseAsynLogin = 0; //同步登录方式strcpy(struLoginInfo.sDeviceAddress, "192.168.110.113"); //设备IP地址struLoginInfo.wPort = 8000; //设备服务端口strcpy(struLoginInfo.sUserName, "admin"); //设备登录用户名strcpy(struLoginInfo.sPassword, "HikHMLeaddo"); //设备登录密码//设备信息, 输出参数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;}else{printf("Login ok!\n");}//////////////////////////////////////////////////////全屏测温参数配置//输入参数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];memset(szUrl, 0, sizeof(szUrl));sprintf(szUrl, "%s", "GET /ISAPI/Thermal/channels/2/thermometry/pixelToPixelParam\r\n");//不同功能对应不同URL,具体参考相应的协议文档struInput.lpRequestUrl = szUrl;struInput.dwRequestUrlLen = strlen(szUrl);//获取时输入为空struInput.lpInBuffer = NULL;struInput.dwInBufferSize = 0;//分配输出内存char szGetOutput[8 * 1024] = { 0 };struOutputParam.lpOutBuffer = szGetOutput;struOutputParam.dwOutBufferSize = sizeof(szGetOutput);//输出状态char szStatusBuf[1024] = { 0 };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", szGetOutput);}//设置参数memset(szUrl, 0, sizeof(szUrl));sprintf(szUrl, "%s", "PUT /ISAPI/Thermal/channels/2/thermometry/pixelToPixelParam\r\n");//输入JSON数据char pBuf[2 * 1024] = { 0 };strcpy(pBuf, "<?xml version=\"1.0\" encoding=\"UTF - 8\"?>""<PixelToPixelParam version = \"2.0\" xmlns = \"http://www.hikvision.com/ver20/XMLSchema\">""<id>2</id>""<maxFrameRate>400</maxFrameRate>""<reflectiveEnable>false</reflectiveEnable>""<reflectiveTemperature>20.00</reflectiveTemperature>""<emissivity>0.98</emissivity>""<distance>3000</distance>""<refreshInterval>50</refreshInterval>""<distanceUnit>centimeter</distanceUnit>""<temperatureDataLength>4</temperatureDataLength>""<JpegPictureWithAppendData>""<jpegPicEnabled>true</jpegPicEnabled>""<visiblePicEnabled>true</visiblePicEnabled>""</JpegPictureWithAppendData>""</PixelToPixelParam>");//中文字符需要使用UTF-8字符集//输入参数struInput.lpInBuffer = pBuf;struInput.dwInBufferSize = sizeof(pBuf);//输出结果char szOutput[8 * 1024] = { 0 };struOutputParam.lpOutBuffer = szOutput;struOutputParam.dwOutBufferSize = sizeof(szOutput);//输出状态char szStatusBuff[1024] = { 0 };struOutputParam.lpStatusBuffer = szStatusBuff;struOutputParam.dwStatusSize = sizeof(szStatusBuff);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("lpOutBuffer: %s\n", szOutput);printf("lpStatusBuffer: %s\n", szStatusBuff);}//////////////////////////////////////////////////////抓热图NET_DVR_JPEGPICTURE_WITH_APPENDDATA struJpegWithAppendAata = { 0 };//自己分配内存,需要大于实际数据长度if (struJpegWithAppendAata.pJpegPicBuff == NULL){struJpegWithAppendAata.pJpegPicBuff = new char[2 * 1024 * 1024];memset(struJpegWithAppendAata.pJpegPicBuff, 0, 2 * 1024 * 1024);}if (struJpegWithAppendAata.pP2PDataBuff == NULL){struJpegWithAppendAata.pP2PDataBuff = new char[2 * 1024 * 1024];memset(struJpegWithAppendAata.pP2PDataBuff, 0, 2 * 1024 * 1024);}if (struJpegWithAppendAata.pVisiblePicBuff == NULL)//可见光图至少为4M{struJpegWithAppendAata.pVisiblePicBuff = new char[10 * 1024 * 1024];memset(struJpegWithAppendAata.pVisiblePicBuff, 0, 10 * 1024 * 1024);}while (1){if (!NET_DVR_CaptureJPEGPicture_WithAppendData(lUserID, 2, &struJpegWithAppendAata)){printf("NET_DVR_CaptureJPEGPicture_WithAppendData failed, error code: %d\n", NET_DVR_GetLastError());}else{printf("NET_DVR_CaptureJPEGPicture_WithAppendData struThermalValidRect[X:%f Y:%f W:%f H:%f] struVisibleValidRect[X:%f Y:%f W:%f H:%f]",struJpegWithAppendAata.struThermalValidRect.fX, struJpegWithAppendAata.struThermalValidRect.fY,struJpegWithAppendAata.struThermalValidRect.fWidth, struJpegWithAppendAata.struThermalValidRect.fHeight,struJpegWithAppendAata.struVisibleValidRect.fX, struJpegWithAppendAata.struVisibleValidRect.fY,struJpegWithAppendAata.struVisibleValidRect.fWidth, struJpegWithAppendAata.struVisibleValidRect.fHeight);SYSTEMTIME t;GetLocalTime(&t);char chTime[128];sprintf(chTime, "%4.4d%2.2d%2.2d%2.2d%2.2d%2.2d%3.3d", t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond, t.wMilliseconds);if (struJpegWithAppendAata.dwP2PDataLen > 0 && struJpegWithAppendAata.pP2PDataBuff != NULL){char cFilename[256] = { 0 };sprintf(cFilename, "Jpegwithappend_%s.data", chTime);FILE* fAppendAata = fopen(cFilename, "wb");fwrite(struJpegWithAppendAata.pP2PDataBuff, struJpegWithAppendAata.dwP2PDataLen, 1, fAppendAata);saveMat(struJpegWithAppendAata.pP2PDataBuff);fclose(fAppendAata);}//保存热成像图片if (struJpegWithAppendAata.dwJpegPicLen > 0 && struJpegWithAppendAata.pJpegPicBuff != NULL){char cFilename[256] = { 0 };sprintf(cFilename, "ThermalPic_%s.jpg", chTime);FILE* fJpegPic = fopen(cFilename, "wb");fwrite(struJpegWithAppendAata.pJpegPicBuff, struJpegWithAppendAata.dwJpegPicLen, 1, fJpegPic);fclose(fJpegPic);}//保存可见光图片if (struJpegWithAppendAata.dwVisiblePicLen > 0 && struJpegWithAppendAata.pVisiblePicBuff != NULL){char cFilename[256] = { 0 };sprintf(cFilename, "VisiblePic_%s.jpg", chTime);FILE* fVisiblePic = fopen(cFilename, "wb");fwrite(struJpegWithAppendAata.pVisiblePicBuff, struJpegWithAppendAata.dwVisiblePicLen, 1, fVisiblePic);fclose(fVisiblePic);}}Sleep(3000);}//delete防止内存泄漏if (struJpegWithAppendAata.pJpegPicBuff != NULL){delete[] struJpegWithAppendAata.pJpegPicBuff;struJpegWithAppendAata.pJpegPicBuff = NULL; }if (struJpegWithAppendAata.pP2PDataBuff != NULL){delete[] struJpegWithAppendAata.pP2PDataBuff;struJpegWithAppendAata.pP2PDataBuff = NULL;}if (struJpegWithAppendAata.pVisiblePicBuff != NULL){delete[] struJpegWithAppendAata.pVisiblePicBuff;struJpegWithAppendAata.pVisiblePicBuff = NULL;}//---------------------------------------//退出程序//注销用户NET_DVR_Logout(lUserID);//释放SDK资源NET_DVR_Cleanup();return;
}
int main()
{string ip= "192.168.110.113";int port = 8000;std::string username = "admin";std::string password = "HikHMLeaddo";HikCamera hikCamera;bool ret=hikCamera.initialize(ip, port, username, password);ret = hikCamera.setCameraParam();std::string CurrentTimestamp = hikCamera.getCurrentTimestamp();cv::Mat tempMat = hikCamera.getTemperatureMat(CurrentTimestamp);string imgPre;string imgName;string name1 = hikCamera.DeviceCapturePicture_Visible(imgPre, imgName, CurrentTimestamp);string name2 = hikCamera.DeviceCapturePicture_Thermal(imgPre, imgName, CurrentTimestamp);//Analyze_temp_data();}

b.HikCamera.cpp

#include"HikCamera.h"
#include<chrono>		// 获取系统时间
#include<iomanip>
#include<sstream>
#include<random>	HikCamera::HikCamera() :m_userId(-1), m_initialized(false), m_savePath("./saveImgs/")
{// 创建保存目录_mkdir(m_savePath.c_str());
}HikCamera::~HikCamera()
{release();
}bool HikCamera::initialize(const std::string& ip, int port, const std::string& username, const std::string& password)
{// 初始化SDKif (!NET_DVR_Init()){LONG err = NET_DVR_GetLastError();std::cerr << "SDK初始化失败,错误码:" << err << std::endl;//LOG_ERROR("SDK初始化失败,错误码:%d - %s", err, NET_DVR_GetErrorMsg(&err));return false;}// 设置日志char logFile[] = "./sdkLog";NET_DVR_SetLogToFile(3, logFile, true);NET_DVR_SetConnectTime(2000, 1);NET_DVR_SetReconnect(10000, true);NET_DVR_SetExceptionCallBack_V30(0, NULL, exceptionCallback, NULL);// 登录参数NET_DVR_USER_LOGIN_INFO loginInfo = { 0 };loginInfo.bUseAsynLogin = 0;	// 同步登录strcpy(loginInfo.sDeviceAddress, ip.c_str());loginInfo.wPort = port;strcpy(loginInfo.sUserName, username.c_str());strcpy(loginInfo.sPassword, password.c_str());// 设备信息NET_DVR_DEVICEINFO_V40 deviceInfo = { 0 };// 登录设备m_userId = NET_DVR_Login_V40(&loginInfo, &deviceInfo);if (m_userId < 0){LONG err = NET_DVR_GetLastError();std::cerr << "相机:" << ip << "  登录失败,错误码:" << err << " - " << NET_DVR_GetErrorMsg(&err) << std::endl;//LOG_ERROR("相机 %s 登录失败,错误码:%d - %s", ip, err, NET_DVR_GetErrorMsg(&err));return false;}struJpegWithAppendAata = { 0 };struInput = { 0 };struOutputParam = { 0 };m_initialized = true;//LOG_INFO("相机登录成功,IP: %s, 端口: %d", ip.c_str(), port);Sleep(3000); // 等待流建立return true;
}bool HikCamera::isConnected() const
{return m_initialized && m_userId >= 0;
}bool HikCamera::setCameraParam()
{struInput.dwSize = sizeof(struInput);struOutputParam.dwSize = sizeof(struOutputParam);//获取参数char szUrl[512];memset(szUrl, 0, sizeof(szUrl));sprintf(szUrl, "%s", "GET /ISAPI/Thermal/channels/2/thermometry/pixelToPixelParam\r\n");//不同功能对应不同URL,具体参考相应的协议文档struInput.lpRequestUrl = szUrl;struInput.dwRequestUrlLen = strlen(szUrl);//获取时输入为空struInput.lpInBuffer = NULL;struInput.dwInBufferSize = 0;//分配输出内存char szGetOutput[8 * 1024] = { 0 };struOutputParam.lpOutBuffer = szGetOutput;struOutputParam.dwOutBufferSize = sizeof(szGetOutput);//输出状态char szStatusBuf[1024] = { 0 };struOutputParam.lpStatusBuffer = szStatusBuf;struOutputParam.dwStatusSize = sizeof(szStatusBuf);if (!NET_DVR_STDXMLConfig(m_userId, &struInput, &struOutputParam)){printf("NET_DVR_STDXMLConfig failed, error code: %d\n", NET_DVR_GetLastError());}else{printf("NET_DVR_STDXMLConfig successfully!\n");printf("%s\n", szGetOutput);}//设置参数memset(szUrl, 0, sizeof(szUrl));sprintf(szUrl, "%s", "PUT /ISAPI/Thermal/channels/2/thermometry/pixelToPixelParam\r\n");//输入JSON数据char pBuf[2 * 1024] = { 0 };strcpy(pBuf, "<?xml version=\"1.0\" encoding=\"UTF - 8\"?>""<PixelToPixelParam version = \"2.0\" xmlns = \"http://www.hikvision.com/ver20/XMLSchema\">""<id>2</id>""<maxFrameRate>400</maxFrameRate>""<reflectiveEnable>false</reflectiveEnable>""<reflectiveTemperature>20.00</reflectiveTemperature>""<emissivity>0.98</emissivity>""<distance>3000</distance>""<refreshInterval>50</refreshInterval>""<distanceUnit>centimeter</distanceUnit>""<temperatureDataLength>4</temperatureDataLength>""<JpegPictureWithAppendData>""<jpegPicEnabled>true</jpegPicEnabled>""<visiblePicEnabled>true</visiblePicEnabled>""</JpegPictureWithAppendData>""</PixelToPixelParam>");//中文字符需要使用UTF-8字符集//输入参数struInput.lpInBuffer = pBuf;struInput.dwInBufferSize = sizeof(pBuf);//输出结果char szOutput[8 * 1024] = { 0 };struOutputParam.lpOutBuffer = szOutput;struOutputParam.dwOutBufferSize = sizeof(szOutput);//输出状态char szStatusBuff[1024] = { 0 };struOutputParam.lpStatusBuffer = szStatusBuff;struOutputParam.dwStatusSize = sizeof(szStatusBuff);if (!NET_DVR_STDXMLConfig(m_userId, &struInput, &struOutputParam)){printf("NET_DVR_STDXMLConfig failed, error code: %d\n", NET_DVR_GetLastError());}else{printf("NET_DVR_STDXMLConfig successfully!\n");printf("lpOutBuffer: %s\n", szOutput);printf("lpStatusBuffer: %s\n", szStatusBuff);}//自己分配内存,需要大于实际数据长度if (struJpegWithAppendAata.pJpegPicBuff == NULL){struJpegWithAppendAata.pJpegPicBuff = new char[2 * 1024 * 1024];memset(struJpegWithAppendAata.pJpegPicBuff, 0, 2 * 1024 * 1024);}if (struJpegWithAppendAata.pP2PDataBuff == NULL){struJpegWithAppendAata.pP2PDataBuff = new char[2 * 1024 * 1024];memset(struJpegWithAppendAata.pP2PDataBuff, 0, 2 * 1024 * 1024);}if (struJpegWithAppendAata.pVisiblePicBuff == NULL)//可见光图至少为4M{struJpegWithAppendAata.pVisiblePicBuff = new char[10 * 1024 * 1024];memset(struJpegWithAppendAata.pVisiblePicBuff, 0, 10 * 1024 * 1024);}if (!NET_DVR_CaptureJPEGPicture_WithAppendData(m_userId, 2, &struJpegWithAppendAata)){printf("NET_DVR_CaptureJPEGPicture_WithAppendData failed, error code: %d\n", NET_DVR_GetLastError());return false;}else{printf("NET_DVR_CaptureJPEGPicture_WithAppendData struThermalValidRect[X:%f Y:%f W:%f H:%f] struVisibleValidRect[X:%f Y:%f W:%f H:%f]",struJpegWithAppendAata.struThermalValidRect.fX, struJpegWithAppendAata.struThermalValidRect.fY,struJpegWithAppendAata.struThermalValidRect.fWidth, struJpegWithAppendAata.struThermalValidRect.fHeight,struJpegWithAppendAata.struVisibleValidRect.fX, struJpegWithAppendAata.struVisibleValidRect.fY,struJpegWithAppendAata.struVisibleValidRect.fWidth, struJpegWithAppendAata.struVisibleValidRect.fHeight);}return true;
}std::string HikCamera::DeviceCapturePicture_Thermal(std::string imgPre, std::string& imgName, std::string timestamp)
{//std::string timestamp = getCurrentTimestamp();std::string picPath_the = m_savePath + "ThermalPic_" + imgPre + "_" + timestamp + ".jpg";imgName = "ThermalPic_" + imgPre + "_" + timestamp + ".jpg";//保存热成像图片if (struJpegWithAppendAata.dwJpegPicLen > 0 && struJpegWithAppendAata.pJpegPicBuff != NULL){FILE* fJpegPic = fopen(picPath_the.c_str(), "wb");fwrite(struJpegWithAppendAata.pJpegPicBuff, struJpegWithAppendAata.dwJpegPicLen, 1, fJpegPic);fclose(fJpegPic);}return picPath_the;
}
std::string HikCamera::DeviceCapturePicture_Visible(std::string imgPre, std::string& imgName, std::string timestamp)
{//std::string timestamp = getCurrentTimestamp();std::string picPath_vis = m_savePath + "VisiblePic_" + imgPre + "_" + timestamp + ".jpg";imgName = "VisiblePic_" + imgPre + "_" + timestamp + ".jpg";//保存可见光图片if (struJpegWithAppendAata.dwVisiblePicLen > 0 && struJpegWithAppendAata.pVisiblePicBuff != NULL){FILE* fVisiblePic = fopen(picPath_vis.c_str(), "wb");fwrite(struJpegWithAppendAata.pVisiblePicBuff, struJpegWithAppendAata.dwVisiblePicLen, 1, fVisiblePic);fclose(fVisiblePic);}return picPath_vis;
}cv::Mat HikCamera::getTemperatureMat(std::string timestamp, const int m_AnalysisHotPic_W , const int m_AnalysisHotPic_H)
{cv::Mat temp_mat(m_AnalysisHotPic_H, m_AnalysisHotPic_W, CV_32FC1);if (struJpegWithAppendAata.dwP2PDataLen > 0 && struJpegWithAppendAata.pP2PDataBuff != NULL){int iIndex = 0;float minTemp = 10000.0;float maxTemp = -10000.0;for (int iWriteHeight = 0; iWriteHeight < m_AnalysisHotPic_H; ++iWriteHeight){for (int iWriteWidth = 0; iWriteWidth < m_AnalysisHotPic_W; ++iWriteWidth){float fTemp = *((float*)(struJpegWithAppendAata.pP2PDataBuff + iIndex));//判断fTemp是否是一个正常值,不是则赋值最大或最小,防止设备崩溃fTemp = (9999 < fTemp) ? 9999 : ((-9999 > fTemp) ? -9999 : fTemp);minTemp = (minTemp > fTemp) ? fTemp : minTemp;maxTemp = (maxTemp > fTemp) ? maxTemp : fTemp;temp_mat.at<float>(iWriteHeight, iWriteWidth) = fTemp;iIndex += 4;}}printf("get Temperature Mat Successfully!\n");}else{printf("get Temperature Mat Failed!\n");}return temp_mat;
}
void CALLBACK HikCamera::exceptionCallback(DWORD dwType, LONG lUserID, LONG lHandle, void* pUser)
{switch (dwType){case EXCEPTION_RECONNECT:printf("------ reconnect------%d\n", time(NULL));//LOG_WARN("相机重连中...");break;case RELOGIN_SUCCESS:printf("用户重登录成功");//LOG_INFO("用户重登录成功");break;case PREVIEW_RECONNECTSUCCESS:printf("预览时重连成功");//LOG_INFO("用户重登录成功");break;default:break;}
}
std::string HikCamera::getCurrentTimestamp()
{// 获取当前系统时间auto now = std::chrono::system_clock::now();// 转换为时间点(time_t)auto now_time_t = std::chrono::system_clock::to_time_t(now);// 转换为本地时间结构auto now_tm = *std::localtime(&now_time_t);// 获取毫秒部分auto now_ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000;// 添加随机数static std::random_device rd;static std::mt19937 gen(rd());std::uniform_int_distribution<> dis(0, 999);int rand_num = dis(gen);// 使用字符串流格式化输出std::ostringstream oss;oss << std::put_time(&now_tm, "%Y%m%d_%H%M%S")<< '_' << std::setfill('0') << std::setw(3) << now_ms.count() << '_' << rand_num;return oss.str();
}void HikCamera::release()
{if (m_initialized){if (struJpegWithAppendAata.pJpegPicBuff != NULL){delete[] struJpegWithAppendAata.pJpegPicBuff;struJpegWithAppendAata.pJpegPicBuff = NULL;}if (struJpegWithAppendAata.pP2PDataBuff != NULL){delete[] struJpegWithAppendAata.pP2PDataBuff;struJpegWithAppendAata.pP2PDataBuff = NULL;}if (struJpegWithAppendAata.pVisiblePicBuff != NULL){delete[] struJpegWithAppendAata.pVisiblePicBuff;struJpegWithAppendAata.pVisiblePicBuff = NULL;}//NET_DVR_Logout(m_userId);NET_DVR_Cleanup();m_initialized = false;m_userId = -1;}
}

c.HikCamera.h

#pragma once#include<string>
#include<iostream>
#include"include\HCNetSDK.h"
#include<direct.h>
#include <opencv2/opencv.hpp>
class HikCamera {
public:HikCamera();~HikCamera();// 初始化相机连接bool initialize(const std::string& ip, int port, const std::string& username, const std::string& password);//参数设置,分配内存等bool setCameraParam();// 设备抓图,可见光和热图std::string DeviceCapturePicture_Thermal(std::string imgPre, std::string& imgName, std::string timestamp);std::string DeviceCapturePicture_Visible(std::string imgPre, std::string& imgName, std::string timestamp);//获取温度矩阵,返回Matcv::Mat getTemperatureMat(std::string timestamp,const int m_AnalysisHotPic_W = 384, const int m_AnalysisHotPic_H = 288);// 检查连接状态bool isConnected() const;// 释放资源void release();// 获取当前时间戳static std::string getCurrentTimestamp();private:LONG m_userId;	//登录IDbool m_initialized; // 初始化标志std::string m_savePath; // 图片保存路径//异常回调函数static void CALLBACK exceptionCallback(DWORD dwType, LONG lUserID, LONG lHandle, void* pUser);NET_DVR_XML_CONFIG_INPUT struInput;NET_DVR_XML_CONFIG_OUTPUT struOutputParam;NET_DVR_JPEGPICTURE_WITH_APPENDDATA struJpegWithAppendAata;
};

2.海康普通相机

a.HikCamera.h

#pragma once
#include<string>
#include<iostream>
#include"include\HCNetSDK.h"
#include"MyLogger.h"
#include<direct.h>class HikCamera {
public:HikCamera();~HikCamera();// 初始化相机连接bool initialize(const std::string& ip, int port, const std::string& username, const std::string& password);// 设备抓图std::string DeviceCapturePicture(std::string imgPre, std::string& imgName);// 检查连接状态bool isConnected() const;// 释放资源void release();private:LONG m_userId;	//登录IDbool m_initialized; // 初始化标志std::string m_savePath; // 图片保存路径//异常回调函数static void CALLBACK exceptionCallback(DWORD dwType, LONG lUserID, LONG lHandle, void* pUser);// 获取当前时间戳static std::string getCurrentTimestamp();
};

b.HikCamera.cpp

#include"HikCamera.h"
#include<chrono>		// 获取系统时间
#include<iomanip>
#include<sstream>
#include<random>		// 用于创建随机数HikCamera::HikCamera() :m_userId(-1), m_initialized(false), m_savePath("./saveImgs/")
{// 创建保存目录_mkdir(m_savePath.c_str());
}HikCamera::~HikCamera()
{release();
}bool HikCamera::initialize(const std::string& ip, int port, const std::string& username, const std::string& password)
{// 初始化SDKif (!NET_DVR_Init()){LONG err = NET_DVR_GetLastError();std::cerr << "SDK初始化失败,错误码:" << err << std::endl;LOG_ERROR("SDK初始化失败,错误码:%d - %s", err, NET_DVR_GetErrorMsg(&err));return false;}// 设置日志char logFile[] = "./sdkLog";NET_DVR_SetLogToFile(3, logFile, true);NET_DVR_SetConnectTime(2000, 1);NET_DVR_SetReconnect(10000, true);NET_DVR_SetExceptionCallBack_V30(0, NULL, exceptionCallback, NULL);// 登录参数NET_DVR_USER_LOGIN_INFO loginInfo = { 0 };loginInfo.bUseAsynLogin = 0;	// 同步登录strcpy(loginInfo.sDeviceAddress, ip.c_str());loginInfo.wPort = port;strcpy(loginInfo.sUserName, username.c_str());strcpy(loginInfo.sPassword, password.c_str());// 设备信息NET_DVR_DEVICEINFO_V40 deviceInfo = { 0 };// 登录设备m_userId = NET_DVR_Login_V40(&loginInfo, &deviceInfo);if (m_userId < 0){LONG err = NET_DVR_GetLastError();std::cerr <<"相机:"<< ip << "  登录失败,错误码:" << err << " - " << NET_DVR_GetErrorMsg(&err) << std::endl;LOG_ERROR("相机 %s 登录失败,错误码:%d - %s", ip, err, NET_DVR_GetErrorMsg(&err));return false;}m_initialized = true;LOG_INFO("相机登录成功,IP: %s, 端口: %d", ip.c_str(), port);Sleep(3000); // 等待流建立return true;
}std::string HikCamera::DeviceCapturePicture(std::string imgPre, std::string& imgName)
{if (!m_initialized){std::cerr << "相机未初始化" << std::endl;LOG_ERROR("相机未初始化");return "";}NET_DVR_JPEGPARA jpegPara = { 0 };jpegPara.wPicQuality = 1;	// 0-最好质量;1-较好质量;2-一般质量jpegPara.wPicSize = 70;std::string timestamp = getCurrentTimestamp();std::string picPath = m_savePath + "device_" + imgPre + "_" + timestamp + ".jpg";imgName = "device_" + imgPre + "_" + timestamp + ".jpg";if (!NET_DVR_CaptureJPEGPicture(m_userId, 1, &jpegPara, (char*)picPath.c_str())){LONG err = NET_DVR_GetLastError();std::cerr << "抓图失败, 错误码:" << err << "-" << NET_DVR_GetErrorMsg(&err) << std::endl;LOG_ERROR("抓图失败,错误码: %d - %s", err, NET_DVR_GetErrorMsg(&err));return "";}std::cout << "抓图成功:" << picPath << std::endl;LOG_INFO("采集图片成功,图片名称: %s", picPath.c_str());return picPath;
}bool HikCamera::isConnected() const
{return m_initialized && m_userId >= 0;
}void HikCamera::release()
{if (m_initialized){NET_DVR_Logout(m_userId);NET_DVR_Cleanup();m_initialized = false;m_userId = -1;}
}void CALLBACK HikCamera::exceptionCallback(DWORD dwType, LONG lUserID, LONG lHandle, void* pUser)
{switch (dwType){case EXCEPTION_RECONNECT:printf("------ reconnect------%d\n", time(NULL));LOG_WARN("相机重连中...");break;case RELOGIN_SUCCESS:printf("用户重登录成功");LOG_INFO("用户重登录成功");break;case PREVIEW_RECONNECTSUCCESS:printf("预览时重连成功");LOG_INFO("用户重登录成功");break;default:break;}
}std::string HikCamera::getCurrentTimestamp()
{// 获取当前系统时间auto now = std::chrono::system_clock::now();// 转换为时间点(time_t)auto now_time_t = std::chrono::system_clock::to_time_t(now);// 转换为本地时间结构auto now_tm = *std::localtime(&now_time_t);// 获取毫秒部分auto now_ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000;// 添加随机数static std::random_device rd;static std::mt19937 gen(rd());std::uniform_int_distribution<> dis(0, 999);int rand_num = dis(gen);// 使用字符串流格式化输出std::ostringstream oss;oss << std::put_time(&now_tm, "%Y%m%d_%H%M%S")<< '_' << std::setfill('0') << std::setw(3) << now_ms.count() << '_' << rand_num;return oss.str();
}

http://www.dtcms.com/a/418652.html

相关文章:

  • 大模型应用:一个基于AI大模型的自动邮件简报系统 - Flask + HTML 方案
  • 开源 C# 快速开发(八)通讯--Tcp服务器端
  • MTK调试-电池识别
  • 网站目标网页制作下载图片代码
  • 钱站网站如何建设手机移动网站
  • Vue调用浏览器打印
  • 捷讯官网 网站建设网站到期只续域名不续空间能打开吗
  • CS231n学习笔记1-4: Image Features
  • DragonBalls_One009*
  • extern关键字
  • 捷为科技亮相新能源汽车产业对接会,数智化平台赋能汽车行业高质量发展
  • ChatBI 学习
  • 百度网站推广咨询建筑网人才
  • 桂林网站建设服务网站定制牛七科技
  • WebRTC 发送端 SSRC 生成流程总结
  • 客户标签自动管理:标签自动化运营,画像持久保鲜
  • 云原生架构与GitOps技术栈介绍
  • 智能外呼产品架构组成
  • 【深度学习新浪潮】如何提升agent的专业性?
  • AI排名查询工具如何助力GEO优化?生成引擎优化中的关键词竞争力分析
  • 福州有网站建设的公司网站都需要什么类别
  • Nginx 反向代理与负载均衡核心内容总结
  • JavaWeb 课堂笔记 —— 20 SpringBootWeb案例 配置文件
  • 算法练习题
  • 9.数组介绍和静态初始化
  • 无重复字符的最长子串_优选算法(C++)滑动窗口
  • 提升雾化片性能,关键是精密测量盲孔尺寸
  • Flannel工作原理-Flannel故障案例-镜像拉取策略-secret对接harbor及ServiceAccount实战
  • GitLab高危漏洞可致实例崩溃(CVE-2025-10858 和 CVE-2025-8014)
  • 中铁建设投资集团有限公司网站自己公司怎样做免费的网站