Commit b2696176 by “liusq”

新增NVR处理抓图失败

parent bb126533
......@@ -223,6 +223,10 @@ int CameraHandle::sdkDevSetAlarmListener(XSDK_HANDLE hDevice, int bListener) {
return XSDK_DevSetAlarmListener(hDevice,bListener);
}
void CameraHandle::setHkDevice(int hk_Device){
this->hk_Device=hk_Device;
}
int CameraHandle::getChannel(){
return channel;
}
......@@ -405,8 +409,19 @@ int CameraHandle::callbackFunction(XSDK_HANDLE hObject, QString &szString) {
if (image.empty())
{
qInfo() << "Failed to read the image";
return -1;
qInfo() << "FaceImageCallBack抓图失败,尝试调用FaceHkImageCallBack";
int hk_channel= mediaFaceImage->getIPChannelInfo(hk_Device,QString(loginParam->sDevId));
if(hk_channel<0){
qInfo() <<QString("SN(%1): callbackFunction通过IP获取到对应通道号失败").arg(sSn);
return -1;
}
// 调用FaceHkImageCallBack抓图
mediaFaceImage->FaceHkImageCallBack(hk_Device, hk_channel, image, sSn);
// 再次检查抓图是否成功
if (image.empty()) {
qInfo() << "FaceHkImageCallBack抓图也失败";
return -1;
}
}
if (image.rows <= 0 || image.cols <= 0 || image.channels() <= 0) {
qInfo() << "图像尺寸或通道数不正确,需排查原因";
......@@ -423,7 +438,7 @@ void CameraHandle::sdkDevSnapSyn(XSDK_HANDLE hDevice, int nChannel){
return;
}
if (!semaphore.tryAcquire()) {
qInfo() << QString("SN(%1): callbackFunction:正在执行线程").arg(sSn);;
qInfo() << QString("SN(%1): callbackFunction:正在执行线程").arg(sSn);
return ;
}
ScopeSemaphoreExit guard([this]() {
......@@ -434,31 +449,40 @@ void CameraHandle::sdkDevSnapSyn(XSDK_HANDLE hDevice, int nChannel){
if(algorithmPermissions ==0x00){
return ;
}
cv::Mat image;
MediaFaceImage* mediaFaceImage= MediaFaceImage::getInstance();
qint64 currentTime= QDateTime::currentSecsSinceEpoch();
int ret=mediaFaceImage->FaceImageCallBack(hDevice,nChannel, image,sSn);
if (ret < 0) {
offlineCount++; // 累加计数器
if (offlineCount >= 3) { // 判断是否连续3次返回0
qInfo() <<QString("SN(%1): 设备离线").arg(sSn);
QString ip=QString::fromUtf8(loginParam->sDevId);
bool is_ping=instace.pingAddress(ip);
qInfo() << sSn<<":ping 的结果"<<is_ping;
if(is_ping){
deviceReboot();
}else {
int hk_channel= mediaFaceImage->getIPChannelInfo(hk_Device,QString(loginParam->sDevId));
if(hk_channel<0){
qInfo() <<QString("SN(%1): sdkDevSnapSyn 通过IP获取到对应通道号失败").arg(sSn);
return ;
}
int retHk = mediaFaceImage->FaceHkImageCallBack(hk_Device, hk_channel, image, sSn);
if(retHk<0){
offlineCount++; // 累加计数器
if (offlineCount >= 3) { // 判断是否连续3次返回0
qInfo() <<QString("SN(%1): 设备离线").arg(sSn);
QString ip=QString::fromUtf8(loginParam->sDevId);
MainWindow::sp_this->clearOfflineCameraHandle(ip,loginParam->nDevPort);
bool is_ping=instace.pingAddress(ip);
qInfo() << sSn<<":ping 的结果"<<is_ping;
if(is_ping){
deviceReboot();
}else {
QString ip=QString::fromUtf8(loginParam->sDevId);
MainWindow::sp_this->clearOfflineCameraHandle(ip,loginParam->nDevPort);
}
// 执行离线处理逻辑
// TODO: 可以在此处更新设备状态、发送告警通知等
// 重置计数器,以便下次再次检测连续离线
offlineCount = 0;
return;
}
// 执行离线处理逻辑
// TODO: 可以在此处更新设备状态、发送告警通知等
// 重置计数器,以便下次再次检测连续离线
}else {
// 如果不连续,则重置计数器
offlineCount = 0;
return;
}
} else {
// 如果不连续,则重置计数器
......@@ -471,7 +495,6 @@ void CameraHandle::sdkDevSnapSyn(XSDK_HANDLE hDevice, int nChannel){
}
if (image.rows <= 0 || image.cols <= 0 || image.channels() <= 0) {
qInfo()<<QString("SN(%1): 图像尺寸或通道数不正确,需排查原因").arg(sSn);
return ;
}
updateImage(image, currentTime);
......
......@@ -49,10 +49,10 @@ public:
CameraHandle();
~CameraHandle();
int sdkDevLoginSyn(QString sDevId, int nDevPort, QString sUserName, QString sPassword, int nTimeout);
//int SdkMediaGetFaceImage(int hDevice, int nSeq, int nTimeout);
//int SdkMediaGetFaceImage(int hDevice, int nSeq, int nTimeout);
int sdkDevSetAlarmListener(XSDK_HANDLE hDevice, int bListener);
void setHkDevice(int hk_Device);
int getHdevice();
int getChannel();
......@@ -185,7 +185,10 @@ private slots:
private :
int hDevice;
int hk_Device;
int channel;
QString httpUrl;
SXSDKLoginParam *loginParam;
......
......@@ -562,6 +562,12 @@ vides_data::response *HttpService::httpDeviceConfig(const QString &serialNumber,
config.humanConfig.isOn=humanConfigObj["isOn"].toBool();
config.humanConfig.updateAt = humanConfigObj["updateAt"].toVariant().toULongLong();
config.humanConfig.faceFrequency = humanConfigObj["faceFrequency"].toVariant().toUInt();
//解析nvrConfig;
QJsonObject nvrConfigObj= dataObj["nvrConfig;"].toObject();
config.nvrConfig.ip=nvrConfigObj["ip"].toString();
config.nvrConfig.port=(unsigned short) nvrConfigObj["port"].toInt();
config.nvrConfig.password=nvrConfigObj["password"].toString();
config.nvrConfig.username=nvrConfigObj["username"].toString();
// 解析 devicesConfig
QJsonObject devicesConfigObj = dataObj["camera"].toObject();
config.camera.password = devicesConfigObj["password"].toString();
......
......@@ -117,6 +117,21 @@ int MediaFaceImage::SdkSearchDevicesSyn(std::map<QString, vides_data::localDevic
}
int MediaFaceImage::SdkIpcSearchDevicesSyn( int lUserID, NET_DVR_IPPARACFG_V40 *reqParams){
int iRet = -1;
DWORD uiReturnLen = 0;
LONG lChannel = 0;
//get
iRet = NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_IPPARACFG_V40, lChannel, \
reqParams, sizeof(NET_DVR_IPPARACFG_V40), &uiReturnLen);
if (!iRet){
qInfo() <<QString("pyd---NET_DVR_GetDVRConfig NET_DVR_GET_IPPARACFG_V40 error.%1\n").arg(NET_DVR_GetLastError());
return -1;
}
return 0;
}
int MediaFaceImage::SdkInit(QString &szConfigPath, QString &szTempPath) {
SXSDKInitParam *pParam=new SXSDKInitParam();
pParam->nLogLevel=8;
......@@ -255,13 +270,78 @@ int MediaFaceImage::FaceImageCallBack(XSDK_HANDLE hMedia, int nChannel, cv::Mat
}
image = std::move(decodedImage);
} catch (const cv::Exception& e) {
qInfo() << QString("SN(%1): 图像解码过程中捕获异常:%2").arg(sSn).arg(e.what());
qInfo() << QString("SN(%1): 图像解码过程中捕获异常:%2").arg(sSn).arg(e.what());
return -1;
}
return pInOutBufferSize;
}
int MediaFaceImage::getIPChannelInfo(int hk_Device,const QString& ip){
NET_DVR_IPPARACFG_V40 m_strIpparaCfg = {0};
m_strIpparaCfg.dwSize = sizeof(m_strIpparaCfg);
bool bRet =SdkIpcSearchDevicesSyn(hk_Device, &m_strIpparaCfg);
if (!bRet) {
qInfo() << "获取IP接入配置参数失败,错误码:" << NET_DVR_GetLastError();
return -1;
}
for (int iChannum = 0; iChannum < m_strIpparaCfg.dwDChanNum; ++iChannum) {
if (m_strIpparaCfg.struStreamMode[iChannum].byGetStreamType == 0) {
int channel = m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.byIPID +
(m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.byIPIDHigh * 256);
if (channel > 0 && m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.byEnable == 1) {
char ip_addr[16] = {0};
strncpy(ip_addr, m_strIpparaCfg.struIPDevInfo[channel - 1].struIP.sIpV4, sizeof(ip_addr) - 1);
QString key = QString::fromUtf8(ip_addr).trimmed();
if (key == ip) {
qInfo() << "找到匹配的IP:" << key << ",通道号:" << channel;
return channel; // 返回找到的第一个匹配的通道号
}
}
}
}
qInfo() << "未找到匹配的IP:" << ip;
return -1; // 没有找到匹配的IP地址
}
int MediaFaceImage::FaceHkImageCallBack(int userID,int channelID,cv::Mat &image,QString &sSn){
image.release();
NET_DVR_JPEGPARA jpegpara = {0};
jpegpara.wPicQuality = 0;
jpegpara.wPicSize = 0xff; // 自动选择图片大小
const size_t M1 = 8 << 20; // 8 MB 缓冲区大小
std::unique_ptr<char[]> buffer(new char[M1]); // 使用智能指针管理缓冲区
unsigned int imageLen = 0;
bool result = NET_DVR_CaptureJPEGPicture_NEW(userID, 32 + channelID, &jpegpara,
buffer.get(), M1, &imageLen);
if (!result || imageLen == 0) {
qInfo() << "抓图失败, 错误码:" << NET_DVR_GetLastError();
return -1;
}
// 使用 std::vector 管理缓冲区数据
std::vector<uchar> imageBuffer(imageLen);
memcpy(imageBuffer.data(), buffer.get(), imageLen);
try {
// 解码 JPEG 数据为 cv::Mat
cv::Mat decodedImage = cv::imdecode(imageBuffer, cv::IMREAD_UNCHANGED);
if (decodedImage.empty()) {
qInfo() << QString("SN(%1): 图像解码失败").arg(sSn);
return -1;
}
// 转移解码后的图像到输出参数
image = std::move(decodedImage);
} catch (const cv::Exception &e) {
qInfo() << QString("SN(%1): 图像解码过程中捕获异常:%2").arg(sSn).arg(e.what());
return -1;
}
return imageLen; // 返回图像数据长度
}
int MediaFaceImage::CameraImage(XSDK_HANDLE hMedia,int nChannel,std::vector<uchar> &buffer){
static const int BufferSize = 1024 * 1024 * 2; // 2MB buffer size
static unsigned char pOutBuffer[BufferSize];
......
......@@ -6,6 +6,7 @@
#include "VidesData.h"
#include "Common.h"
#include "TaskRunnable.h"
#include "HCNetSDK.h"
#include <memory>
#include <map>
#include <QDebug>
......@@ -19,6 +20,9 @@ public:
void ParserImageData(const unsigned char* pData, int nDataLen, char* pJpg, int* nJpgLen, char* pJson);
int FaceImageCallBack(XSDK_HANDLE hMedia,int nChannel,cv::Mat &image,QString &sSn);
int FaceHkImageCallBack(int userID,int channelID,cv::Mat &image,QString &sSn);
int CameraImage(XSDK_HANDLE hMedia,int nChannel,std::vector<uchar> &buffer);
int ToFile(const char* pFileName, const void* pData, int nLenght);
......@@ -26,6 +30,10 @@ public:
int AbFile(const char* pFileName, const void* pData, int nLenght);
int SdkSearchDevicesSyn(std::map< QString,vides_data::localDeviceStatus*>& devices);
int SdkIpcSearchDevicesSyn(int lUserID, NET_DVR_IPPARACFG_V40 *reqParams);
//通过IP获取到对应通道号
int getIPChannelInfo(int hk_Device,const QString& ip);
int SdkInit(QString &szConfigPath, QString &szTempPath);
......
......@@ -6,7 +6,7 @@ class ScopeSemaphoreExit {
public:
explicit ScopeSemaphoreExit(std::function<void()> onExit);
~ScopeSemaphoreExit();
~ScopeSemaphoreExit();
private:
std::function<void()> onExit_;
......
......@@ -311,7 +311,12 @@ struct MqttConfig {
QString password;
quint64 updateAt;
};
struct NvrConfig{
QString ip;
QString username;
QString password;
uint16_t port;
};
struct responseConfig {
......@@ -323,7 +328,7 @@ struct responseConfig {
UniformConfig uniformConfig;
Camera camera;
MqttConfig mqttConfig;
NvrConfig nvrConfig;
HumanConfig humanConfig;
};
......@@ -358,7 +363,6 @@ struct DetectionParams {
float recConfidenceThreshold; ///< 识别置信度阈值
};
inline bool isVirtualMachine()
{
QString dmiPath;
......
......@@ -17,7 +17,9 @@ DEFINES += APP_VERSION=\\\"1.3.2\\\"
DEFINES += QT_MESSAGELOGCONTEXT
DEFINES += QT_NO_DEBUG_OUTPUT
QMAKE_LIBDIR += /usr/local/lib
# 设置库路径
QMAKE_LIBDIR += /usr/local/lib \
/usr/local/lib/HCNetSDKCom
INCLUDEPATH+=/usr/local/include/opencv4
INCLUDEPATH+=/usr/local/include/hyperface
......@@ -27,7 +29,7 @@ INCLUDEPATH+=/usr/local/include/human
INCLUDEPATH+=/usr/local/include/CImg
INCLUDEPATH+=/usr/local/include/mqtt
INCLUDEPATH+=/usr/local/include/stb_image
INCLUDEPATH+=/usr/local/include/hkws
......@@ -88,6 +90,7 @@ LIBS += -lopencv_core \
-lopencv_objdetect \
-lsohuman \
-lpaho-mqtt3a \
-lhcnetsdk \
# -lssl \
# -lcrypto \ sudo apt-get install libjpeg-dev libpng-dev
-lc \
......
......@@ -92,6 +92,9 @@ MainWindow::MainWindow():isResetting(false)
qInfo() << "sdk初始化失败";
return;
}
//QString ip,QString userName,QString passWord,uint16_t port
loginNetDvr(config.nvrConfig.ip,config.nvrConfig.username,config.nvrConfig.password,config.nvrConfig.port);
connect(this, SIGNAL(shutdownSignals(QString,int)), this, SLOT(clearHandle(QString,int)),Qt::QueuedConnection);
......@@ -141,6 +144,36 @@ void MainWindow::runOrRebootMqtt(vides_data::MqttConfig &mqtt_config,QString &ht
subscriber->start();
}
int MainWindow::loginNetDvr(QString ip,QString userName,QString passWord,uint16_t port){
NET_DVR_USER_LOGIN_INFO loginInfo;
NET_DVR_DEVICEINFO_V40 deviceInfo;
loginInfo.wPort=port;
QByteArray bIp = ip.toUtf8();
char* cDevid=bIp.data();
memcpy(loginInfo.sDeviceAddress,cDevid,129);
QByteArray byteName = userName.toUtf8();
char* cName=byteName.data();
memcpy(loginInfo.sUserName, cName,32);
QByteArray bytePassword = passWord.toUtf8();
char* cPassword=bytePassword.data();
memcpy(loginInfo.sPassword, cPassword,32);
LONG lUserID = NET_DVR_Login_V40(&loginInfo, &deviceInfo);
if (lUserID < 0) {
qInfo() << QString("登录设备失败,错误编码:%1").arg(NET_DVR_GetLastError());
return lUserID;
}
this->hk_Device=lUserID;
return lUserID;
}
void MainWindow::divParameterUpdate(vides_data::responseConfig &cloudConfig,QString &httpUrl,QString &serialNumber ){
bool faceAlgorithm = false, licensePlateAlgorithm = false, uniformAlgorithm = false, timeChange = false;
AlgorithmTaskManage &algorithmTaskManage= AlgorithmTaskManage::getInstance();
......@@ -504,6 +537,7 @@ void MainWindow::clearOfflineCameraHandle(QString sDevId, int nDevPort) {
void MainWindow::setIsResetting(bool running) {
this->isResetting.store(running, std::memory_order_release);
}
//平台没有 盒子有 盒子关闭
void MainWindow::startCamera(const QString &httpurl){
if(this->isResetting.load(std::memory_order_acquire)){
......@@ -1058,7 +1092,7 @@ void MainWindow::initCameras(vides_data::cameraParameters &parameter,vides_data:
CameraHandle * cameraHandle =new CameraHandle(parameter.sDevId,parameter.httpUrl,parameter.sSn,parameter.channel,image_save,heightReference,devConfig);
int sdk_handle=cameraHandle->sdkDevLoginSyn(parameter.sDevId,parameter.nDevPort,parameter.sUserName,parameter.sPassword,3000);
qDebug() << QString("SN(%1): 句柄为%2").arg(parameter.sSn).arg(sdk_handle);
qInfo() << QString("SN(%1): 句柄为%2").arg(parameter.sSn).arg(sdk_handle);
if(sdk_handle<=0){
qInfo() << QString("SN(%1): 登录失败").arg(parameter.sSn);
......@@ -1066,12 +1100,11 @@ void MainWindow::initCameras(vides_data::cameraParameters &parameter,vides_data:
}
mediaFaceImage->setMap(sdk_handle,cameraHandle);
initDevConfigSyn(cameraHandle,devConfig);
cameraHandle->sdkDevSetAlarmListener(sdk_handle,0);
cameraHandle->setHkDevice(hk_Device);
int synTime=devConfig.camera.devSnapSynTimer;
uint64 face_frequency=devConfig.humanConfig.faceFrequency;
float carConfidenceMax=devConfig.licensePlateConfig.carConfidenceMax;
......
......@@ -8,6 +8,7 @@
#include "MediaFaceImage.h"
#include "AlgorithmTaskManage.h"
#include "MqttSubscriber.h"
#include "HCNetSDK.h"
#include <algorithm>
#include <QString>
#include <QTextCodec>
......@@ -85,7 +86,8 @@ public:
const std::list<vides_data::responseDeviceStatus>& devices);
void setIsResetting(bool running);
int loginNetDvr(QString ip,QString userName,QString passWord,uint16_t port);
~MainWindow();
signals:
......@@ -126,6 +128,8 @@ private:
vides_data::MqttConfig mqttConfig;
std::atomic<bool> isResetting;
int hk_Device;
};
#endif // MAINWINDOW_H
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment