海康大华宇视SDK车牌号开发主要方法

2024-01-28 14:28

本文主要是介绍海康大华宇视SDK车牌号开发主要方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一个控制台程序的pro内容,功能:使用海康、大华、宇视的SDK进行车牌号获取开发,其包含了SDK外部库的添加。
pro文件内容:

QT -= gui
QT += xml core network serialport
CONFIG += c++14 console
DEFINES += KERNEL_LIBRARY QT_MESSAGELOGCONTEXT
CONFIG -= app_bundle
DEFINES += QT_DEPRECATED_WARNINGSSOURCES += \cardetectorparams.cpp \configparams.cpp \dahuacameramanager.cpp \dahuacamgetcarnumber.cpp \hikoncameramanager.cpp \hikoncamgetcarnumber.cpp \main.cpp \serviceCarNumberCaptureGlobal.cpp \servicefun_dahua_sdkapi_getcarnumber.cpp \servicefun_hikon_sdkapi_getcarnumber.cpp \servicefun_udpnetwork_forcarnumber.cpp \servicefun_uv_sdkapi_getcarnumber.cpp \uvcameramanager.cpp \uvcamgetcarnumber.cpp
TRANSLATIONS += \DHCarNumCapConsole_zh_CN.ts
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += targetHEADERS += \cardetectorparams.h \configparams.h \dahuacameramanager.h \dahuacamgetcarnumber.h \hikoncameramanager.h \hikoncamgetcarnumber.h \kernel_global.h \serviceCarNumberCaptureGlobal.h \servicefun_dahua_sdkapi_getcarnumber.h \servicefun_hikon_sdkapi_getcarnumber.h \servicefun_udpnetwork_forcarnumber.h \servicefun_uv_sdkapi_getcarnumber.h \uvcameramanager.h \uvcamgetcarnumber.h#64位
#大华
LIBS += "D:/DHCarNumCapConsole/dhsdkwin64_is_v3.057/Lib/Win64/dhnetsdk.lib"
INCLUDEPATH += "D:/DHCarNumCapConsole/dhsdkwin64_is_v3.057/Include/Common"
DEPENDPATH += "D:/DHCarNumCapConsole/dhsdkwin64_is_v3.057/Include/Common"#海康
LIBS += "D:/DHCarNumCapConsole/CH-HCNetSDKV6.1.9.48_build20230410_win64/Lib/HCNetSDK.lib"
INCLUDEPATH += "D:/DHCarNumCapConsole/CH-HCNetSDKV6.1.9.48_build20230410_win64/Include"
DEPENDPATH += "D:/DHCarNumCapConsole/CH-HCNetSDKV6.1.9.48_build20230410_win64/Include"#宇视
LIBS += "D:/DHCarNumCapConsole/ITSSDK-B0303.164.2.0.220511_UV/dll/lib/NetDEVSDK.lib"
INCLUDEPATH += "D:/DHCarNumCapConsole/ITSSDK-B0303.164.2.0.220511_UV/dll/include"
DEPENDPATH += "D:/DHCarNumCapConsole/ITSSDK-B0303.164.2.0.220511_UV/dll/include"DISTFILES += \使用和开发说明.txt``

二、海康SDK绑定摄像头

bool HikonCamGetCarNumber::bindHkCamSDK(QString ip,QString username,QString password,int relationNumber,QString servicePort)
{//接收到的是一个指令结构,是否过期在run()方法中已经进行了判断,过期的不会发过来,所以这里只需要把这个结构传给车牌号抓取程序即可//此处调用海康抓取车牌号的程序,在回调函数中把获取到的车牌号按照方向车道,累加到road_car_number这结构中。等待run()方法中发送//---------------------------------------//初始化BOOL result=NET_DVR_Init();if(!result){return false;}NET_DVR_SetLogToFile(3,(char *)std::string("../log").c_str(),false);//设置连接时间与重连时间NET_DVR_SetConnectTime(2000, 1);NET_DVR_SetReconnect(10000, true);//---------------------------------------//注册设备//登录参数,包括设备地址、登录用户、密码等LONG lUserID = -1; //初始化lUserIDNET_DVR_USER_LOGIN_INFO struLoginInfo = {0};//创建一个数据结构对象并为每个属性赋初值为0struLoginInfo.bUseAsynLogin = 0; //设置为同步登录方式strcpy(struLoginInfo.sDeviceAddress,ip.toStdString().c_str()); //设置设备IP地址为192.168.2.184(大门口海康能够获取车牌号的摄像头的IP)struLoginInfo.wPort = servicePort.toInt(); //设置服务端口默认值为8000strcpy(struLoginInfo.sUserName, username.toStdString().c_str()); //设置:用户名strcpy(struLoginInfo.sPassword, password.toStdString().c_str()); //设置:密码//设备信息, 输出参数NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = {0};//创建一个V40数据结构对象lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40);//登录注册并将设备信息存储在struDeviceInfoV40结构中if (lUserID < 0){//登录失败时提示错误信息qDebug("HK Login fail!");return false;}else{qDebug("HK Login success!");}//---------------------------------------//报警布防//设置报警回调函数NET_DVR_SetDVRMessageCallBack_V31(MSesGCallback, NULL);//启用布防NET_DVR_SETUPALARM_PARAM struSetupParam={0};//创建布防结构对象并初始化为0struSetupParam.dwSize=sizeof(NET_DVR_SETUPALARM_PARAM);//根据NET_DVR_SETUPALARM_PARAM的大小来设置dwSize的值struSetupParam.byLevel = 1; //布防优先级:0- 一等级(高),1- 二等级(中),2-多设备布防,即允许同一时间多个设备同时布防struSetupParam.byAlarmInfoType = 1; //上传报警信息类型: 0- 老报警信息(NET_DVR_PLATE_RESULT), 1- 新报警信息(NET_ITS_PLATE_RESULT)LONG lHandle = NET_DVR_SetupAlarmChan_V41(lUserID,&struSetupParam);//开始布防并设置回调函数//如果lHandle<0则布防失败,然后出登出并清除if (lHandle < 0){qDebug("HK setAlarm fail");NET_DVR_Logout(lUserID);return false;}qDebug("HK Set Alarm Success!");qDebug()<<"ip:"<<ip;//---------------------------------------//网络触发抓拍NET_DVR_SNAPCFG struSnapCfg;memset(&struSnapCfg, 0, sizeof(NET_DVR_SNAPCFG));//结构体大小struSnapCfg.dwSize = sizeof(NET_DVR_SNAPCFG);//线圈抓拍次数,0-不抓拍,非0-连拍次数,目前最大5次struSnapCfg.bySnapTimes  = 0;//抓拍等待时间,单位ms,取值范围[0,60000]struSnapCfg.wSnapWaitTime   = 1;//1000//连拍间隔时间,单位ms,取值范围[67,60000]struSnapCfg.wIntervalTime[0]  = 67;//1000struSnapCfg.wIntervalTime[1]  = 67;//1000//触发IO关联的车道号//qDebug()<<"bind relationNumber:"<<HikonCamGetCarNumber::relationNumber;//struSnapCfg.byRelatedDriveWay = relationNumber;//关联号struSnapCfg.byRelatedDriveWay = 2;//关联号//网络触发连拍if (!NET_DVR_ContinuousShoot(lUserID, &struSnapCfg)){//qDebug("NET_DVR_ContinuousShoot failed, error code: %d\n", NET_DVR_GetLastError());return false;}// qDebug("网络触发连拍!\n");return true;}

三、海康SDK的回调函数:

BOOL CALLBACK MSesGCallback(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void *pUser)
{//以下代码仅供参考,实际应用中不建议在该回调函数中直接处理数据保存文件,//例如可以使用消息的方式(PostMessage)在消息响应函数里进行处理。switch (lCommand){case COMM_UPLOAD_PLATE_RESULT:{NET_DVR_PLATE_RESULT struPlateResult={0};memcpy(&struPlateResult, pAlarmInfo, sizeof(struPlateResult));QString ip_str=QString(pAlarmer->sDeviceIP).trimmed();int iCurRelationNumber=struPlateResult.byDriveChan;QString key_str=ip_str+"_"+QString::number(iCurRelationNumber).trimmed();QTextCodec *codec = QTextCodec::codecForName("GBK");QString carNumber = codec->toUnicode(struPlateResult.struPlateInfo.sLicense);//如果关联号与要求的相同,则把车牌号加入到对应的方向车道车牌号列表中carNumList_Mutex.lock();auto carNumIt = carNumList.find(key_str);//根据关联车道号key值查找value,返回的是一个迭代器,如果找不到就返回末尾的迭代器// 检查是否找到关联号对应的 CarNum 对象if (carNumIt != carNumList.end())//如果不等于最后一个迭代器,则认为是查到了{CarNumForHK &carNumObject = carNumIt.value();// 将GBK编码的QString转换为UTF-8编码的QStringQTextCodec *codec = QTextCodec::codecForName("GBK");QString carNumber = codec->toUnicode(struPlateResult.struPlateInfo.sLicense);if(carNumber!="无车牌"&&lastCarNumber!=carNumber){lastCarNumber=carNumber;//不相同时保存到上一个车牌号中carNumber=carNumber.mid(1);//注意获取到的车牌号的第一个字符是颜色,所以要去掉第一个字符。if(!carNumIsConforms(carNumber)){CarNumber_stu temp_stu;//创建结构对象temp_stu.ip=ip_str;temp_stu.relationNumber=iCurRelationNumber;temp_stu.carNumber=carNumber;temp_stu.captureDateTime=QDateTime::currentDateTime();carNumObject.carlist.append(temp_stu);//追加到QList}}}else{//如果等于最后一个迭代器,则认为未查到,就要根据关联车道号为Key,创建一个键值对// 将GBK编码的QString转换为UTF-8编码的QStringQTextCodec *codec = QTextCodec::codecForName("GBK");QString carNumber = codec->toUnicode(struPlateResult.struPlateInfo.sLicense);if(carNumber!="无车牌"&&lastCarNumber!=carNumber){lastCarNumber=carNumber;//不相同时保存到上一个车牌号中carNumber=carNumber.mid(1);//注意获取到的车牌号的第一个字符是颜色,所以要去掉第一个字符。if(!carNumIsConforms(carNumber)){CarNumForHK tempCarNum;CarNumber_stu temp_stu;//创建结构对象temp_stu.ip=ip_str;temp_stu.relationNumber=iCurRelationNumber;temp_stu.carNumber=carNumber;temp_stu.captureDateTime=QDateTime::currentDateTime();tempCarNum.carlist.append(temp_stu);//创建QListcarNumList.insert(key_str,tempCarNum);//插入QMap}}}carNumList_Mutex.unlock();break;}case COMM_ITS_PLATE_RESULT:{NET_ITS_PLATE_RESULT struITSPlateResult={0};memcpy(&struITSPlateResult, pAlarmInfo, sizeof(struITSPlateResult));QString ip_str=QString(pAlarmer->sDeviceIP).trimmed();int iCurRelationNumber=struITSPlateResult.byDriveChan;QString key_str=ip_str+"_"+QString::number(iCurRelationNumber).trimmed();QTextCodec *codec = QTextCodec::codecForName("GBK");QString carNumber = codec->toUnicode(struITSPlateResult.struPlateInfo.sLicense);//byDriveChan:车道号(即关联号) 例如:左:1 直:2 右:3//如果关联号与要求的相同,则把车牌号加入到对应的方向车道车牌号列表中carNumList_Mutex.lock();auto carNumIt = carNumList.find(key_str);//根据关联车道号key值查找value,返回的是一个迭代器,如果找不到就返回末尾的迭代器// 检查是否找到关联号对应的 CarNum 对象if (carNumIt != carNumList.end())//如果不等于最后一个迭代器,则认为是查到了{CarNumForHK &carNumObject = carNumIt.value();// 将GBK编码的QString转换为UTF-8编码的QStringQTextCodec *codec = QTextCodec::codecForName("GBK");QString carNumber = codec->toUnicode(struITSPlateResult.struPlateInfo.sLicense);if(carNumber!="无车牌"&&lastCarNumber!=carNumber){lastCarNumber=carNumber;//不相同时保存到上一个车牌号中carNumber=carNumber.mid(1);//注意获取到的车牌号的第一个字符是颜色,所以要去掉第一个字符。if(!carNumIsConforms(carNumber)){// 调用 CarNum 类的方法进行数据查找、发送和删除CarNumber_stu temp_stu;temp_stu.ip=ip_str;temp_stu.relationNumber=iCurRelationNumber;temp_stu.carNumber=carNumber;temp_stu.captureDateTime=QDateTime::currentDateTime();carNumObject.carlist.append(temp_stu);}}}else{//如果等于最后一个迭代器,则认为未查到,就要根据关联车道号为Key,创建一个键值对// 将GBK编码的QString转换为UTF-8编码的QStringQTextCodec *codec = QTextCodec::codecForName("GBK");QString carNumber = codec->toUnicode(struITSPlateResult.struPlateInfo.sLicense);if(carNumber!="无车牌"&&lastCarNumber!=carNumber){lastCarNumber=carNumber;//不相同时保存到上一个车牌号中carNumber=carNumber.mid(1);//注意获取到的车牌号的第一个字符是颜色,所以要去掉第一个字符。if(!carNumIsConforms(carNumber)){CarNumForHK tempCarNum;CarNumber_stu temp_stu;temp_stu.ip=ip_str;temp_stu.relationNumber=iCurRelationNumber;temp_stu.carNumber=carNumber;temp_stu.captureDateTime=QDateTime::currentDateTime();tempCarNum.carlist.append(temp_stu);carNumList.insert(key_str,tempCarNum);}}}carNumList_Mutex.unlock();break;}default:break;}return TRUE;
}

三、大华SDK绑定摄像头

bool DahuaCamGetCarNumber::bindDahuaCamSDK(QString ip,QString username,QString password,int relationNumber,QString servicePort)
{//获取界面登录信息char D_Ip[32] ={0};char D_UserName[32] = {0};char D_Pasdwd[32] = {0};int D_Port = 37777;int nIndex = 0;strcpy(D_Ip,ip.toStdString().c_str());strcpy(D_UserName,username.toStdString().c_str());strcpy(D_Pasdwd,password.toStdString().c_str());//SDK初始化if(CLIENT_Init((fDisConnect)DisConnectFunc, (LDWORD)0)){cout<<"DH SDK INIT OK!"<<endl;//初始化成功}else{cout<<"DH SDK INIT FAIL!"<<endl;//初始化失败return false;}//获取SDK版本信息DWORD dwNetSdkVersion = CLIENT_GetSDKVersion();printf("NetSDK version is [%d]\n",dwNetSdkVersion);//设置断线重连回调接口,设置过断线重连成功回调函数后,当设备出现断线情况,SDK内部会自动进行重连操作CLIENT_SetAutoReconnect(&HaveReConnect,0);//设置登录超时时间和尝试次数int nWaitTime = 5000; //登录请求响应超时时间设置为5sint nTryTimes = 3; //登录时尝试建立连接3次CLIENT_SetConnectTime(nWaitTime,nTryTimes);//设置更多网络参数,NET_PARAM的nWaittime,nConnectTryNum成员与CLIENT_SetConnectTime 接口设置的登录设备超时时间和尝试次数的意义相同NET_PARAM stuNetparm ={0};stuNetparm.nConnectTime = 3000;//登录时尝试建立连接的超时时间CLIENT_SetNetworkParam(&stuNetparm);// 登录NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY stInparam;memset(&stInparam, 0, sizeof(stInparam));stInparam.dwSize = sizeof(stInparam);strncpy(stInparam.szIP, D_Ip, sizeof(stInparam.szIP) - 1);strncpy(stInparam.szPassword, D_Pasdwd, sizeof(stInparam.szPassword) - 1);strncpy(stInparam.szUserName, D_UserName, sizeof(stInparam.szUserName) - 1);stInparam.nPort = D_Port;stInparam.emSpecCap = EM_LOGIN_SPEC_CAP_TCP;tagNET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY stOutparam;LoginHandle = CLIENT_LoginWithHighLevelSecurity(&stInparam, &stOutparam);if (!LoginHandle){std::cout<<"DH login fails...!"<<std::endl;return false;//登录失败返回false}else{std::cout<<"DH login success...!"<<std::endl;}//登录成功后执行下面代码//订阅交通路口事件,事件代码:0x00000017LLONG lAnalyerHandle = CLIENT_RealLoadPictureEx(LoginHandle, 0, (DWORD)EVENT_IVS_TRAFFICJUNCTION, TRUE, AnalyzerDataCallBack, NULL, NULL);if(NULL == lAnalyerHandle){//订阅失败printf("DH CLIENT_RealLoadPictureEx: failed!");return false;}else{//订阅成功printf("DH CLIENT_RealLoadPictureEx Regist success!");}Ip_LoginID_RealID temp;temp.ip=ip;temp.loginId=LoginHandle;temp.subscriptionId=lAnalyerHandle;ipMap_list.push_back(temp);return true;}

四、大华SDK回调函数

//交通路口回调
int CALLBACK AnalyzerDataCallBack(LLONG lAnalyzerHandle, DWORD dwAlarmType, void*  pAlarmInfo, BYTE *pBuffer, DWORD dwBufSize, LDWORD dwUser, int nSequence, void *reserved)
{switch(dwAlarmType){case EVENT_IVS_TRAFFICJUNCTION:{//取实时车牌号://事件名称:交通路口事件//事件代码:0x00000017//对应的结构体:DEV_EVENT_TRAFFICJUNCTION_INFODEV_EVENT_TRAFFICJUNCTION_INFO* pInfo = (DEV_EVENT_TRAFFICJUNCTION_INFO*)pAlarmInfo;int iCurRelationNumber=pInfo->stTrafficCar.nLane;//车道号QString ip_str="";// 使用迭代器遍历QList<Ip_LoginID_RealID>::iterator it;for (it = ipMap_list.begin(); it != ipMap_list.end(); ++it) {Ip_LoginID_RealID temp=*it;if(temp.subscriptionId==lAnalyzerHandle){ip_str=temp.ip;}}QString key_str=ip_str+"_"+QString::number(iCurRelationNumber).trimmed();//byDriveChan:车道号(即关联号) 例如:左:1 直:2 右:3//如果关联号与要求的相同,则把车牌号加入到对应的方向车道车牌号列表中carNumList_MutexForDH.lock();auto carNumIt = carNumListForDH.find(key_str);//根据关联车道号key值查找value,返回的是一个迭代器,如果找不到就返回末尾的迭代器// 检查是否找到关联号对应的 CarNum 对象if (carNumIt != carNumListForDH.end())//如果不等于最后一个迭代器,则认为是查到了{string platNubmer=removeZeroConvert(pInfo->stTrafficCar.szPlateNumber);//去掉车牌号中的0,因为c++字符串遇0会截断,软码会出错。CarNumForDH &carNumObject = carNumIt.value();// 将GBK编码的QString转换为UTF-8编码的QStringQTextCodec *codec = QTextCodec::codecForName("GBK");QString carNumber = codec->toUnicode(platNubmer.c_str());if(carNumber!=""&&carNumber!="无车牌"&&lastCarNumberForDH!=carNumber){lastCarNumberForDH=carNumber;//不相同时保存到上一个车牌号中if(!carNumIsConformsForDH(carNumber)){// 调用 CarNum 类的方法进行数据查找、发送和删除CarNumber_stu temp_stu;temp_stu.ip=ip_str;temp_stu.relationNumber=iCurRelationNumber;temp_stu.carNumber=carNumber;temp_stu.captureDateTime=QDateTime::currentDateTime();carNumObject.carlist.append(temp_stu);}}}else{//如果等于最后一个迭代器,则认为未查到,就要根据关联车道号为Key,创建一个键值对// 将GBK编码的QString转换为UTF-8编码的QStringstring platNubmer=removeZeroConvert(pInfo->stTrafficCar.szPlateNumber);QTextCodec *codec = QTextCodec::codecForName("GBK");QString carNumber = codec->toUnicode(platNubmer.c_str());if(carNumber!=""&&carNumber!="无车牌"&&lastCarNumberForDH!=carNumber){lastCarNumberForDH=carNumber;//不相同时保存到上一个车牌号中if(!carNumIsConformsForDH(carNumber)){CarNumForDH tempCarNum;CarNumber_stu temp_stu;temp_stu.ip=ip_str;temp_stu.relationNumber=iCurRelationNumber;temp_stu.carNumber=carNumber;temp_stu.captureDateTime=QDateTime::currentDateTime();tempCarNum.carlist.append(temp_stu);carNumListForDH.insert(key_str,tempCarNum);}}}carNumList_MutexForDH.unlock();break;}default:break;}return 0;}

五、宇视SDK绑定摄像头

bool UvCamGetCarNumber::bindUvCamSDK(QString ip,QString username,QString password,int relationNumber,QString servicePort)
{BOOL result=NETDEV_Init();if(!result){return false;}//设置连接时间NETDEV_REV_TIMEOUT_S stRevTimeout = {0};stRevTimeout.dwRevTimeOut = 5;stRevTimeout.dwFileReportTimeOut = 30;NETDEV_SetRevTimeOut(&stRevTimeout);//登录参数,包括设备地址、登录用户、密码等strncpy(stDevLoginInfo.szIPAddr, ip.toStdString().c_str(), sizeof(stDevLoginInfo.szIPAddr)); //设备IP地址strncpy(stDevLoginInfo.szUserName, username.toStdString().c_str(), sizeof(stDevLoginInfo.szUserName));//设备登录用户名strncpy(stDevLoginInfo.szPassword, password.toStdString().c_str(), sizeof(stDevLoginInfo.szPassword));//设备登录密码stDevLoginInfo.dwPort = servicePort.toUInt();//设备服务端口stDevLoginInfo.dwLoginProto = NETDEV_LOGIN_PROTO_ONVIF;     //登录协议//输出参数,仅私有协议登录有效NETDEV_SELOG_INFO_S stSELogInfo = {0};LPVOID lUserID = NETDEV_Login_V30(&stDevLoginInfo, &stSELogInfo);if (NULL == lUserID){printf("UV Login failed, error code: %d\n", NETDEV_GetLastError());return false;}LPVOID m_1pPicHandle=NETDEV_StartPicStream(lUserID,0,false,(char *)(""),(NETDEV_PIC_UPLOAD_PF)MultiPicDataCallBackFun,&stDevLoginInfo);if(m_1pPicHandle==FALSE){std::cout<<"UV Start PicStream fail."<<std::endl;return FALSE;}else{std::cout<<"UV start Picszztream succeed."<<std::endl;}Sleep(1000);  //millisecondreturn true;
}

六、宇视SDK回调函数

int CALLBACK MultiPicDataCallBackFun(IN NETDEV_PIC_DATA_S *pstUniviewData,IN LPVOID lpUserParam){NETDEV_DEVICE_LOGIN_INFO_S *temp=(NETDEV_DEVICE_LOGIN_INFO_S *)lpUserParam;//根据传入的地址创建登录信息对象指针QString ip_str=removeZeroConvertForUV(temp->szIPAddr).c_str();//去掉IP地址中的'\0'QString carNumber=pstUniviewData->szCarPlate;qDebug()<<"carNumber:"<<carNumber;//取实时车牌号:int iCurRelationNumber=pstUniviewData->lLaneID;//车道号QString key_str=ip_str+"_"+QString::number(iCurRelationNumber).trimmed();//byDriveChan:车道号(即关联号) 例如:左:1 直:2 右:3//如果关联号与要求的相同,则把车牌号加入到对应的方向车道车牌号列表中carNumList_MutexForUV.lock();auto carNumIt = carNumListForUV.find(key_str);//根据关联车道号key值查找value,返回的是一个迭代器,如果找不到就返回末尾的迭代器// 检查是否找到关联号对应的 CarNum 对象if (carNumIt != carNumListForUV.end())//如果不等于最后一个迭代器,则认为是查到了{//                string platNubmer=removeZeroConvert(pInfo->stTrafficCar.szPlateNumber);//去掉车牌号中的0,因为c++字符串遇0会截断,软码会出错。CarNumForUV &carNumObject = carNumIt.value();//                // 将GBK编码的QString转换为UTF-8编码的QString//                QTextCodec *codec = QTextCodec::codecForName("GBK");//                QString carNumber = codec->toUnicode(platNubmer.c_str());if(carNumber!=""&&carNumber!="-"&&lastCarNumberForUV!=carNumber){lastCarNumberForUV=carNumber;//不相同时保存到上一个车牌号中if(!carNumIsConformsForUV(carNumber)){// 调用 CarNum 类的方法进行数据查找、发送和删除CarNumber_stu temp_stu;temp_stu.ip=ip_str;temp_stu.relationNumber=iCurRelationNumber;temp_stu.carNumber=carNumber;temp_stu.captureDateTime=QDateTime::currentDateTime();carNumObject.carlist.append(temp_stu);}}}else{//如果等于最后一个迭代器,则认为未查到,就要根据关联车道号为Key,创建一个键值对// 将GBK编码的QString转换为UTF-8编码的QString
//        string platNubmer=removeZeroConvert(pInfo->stTrafficCar.szPlateNumber);//        QTextCodec *codec = QTextCodec::codecForName("GBK");
//        QString carNumber = codec->toUnicode(platNubmer.c_str());if(carNumber!=""&&carNumber!="无车牌"&&lastCarNumberForUV!=carNumber){lastCarNumberForUV=carNumber;//不相同时保存到上一个车牌号中if(!carNumIsConformsForUV(carNumber)){CarNumForUV tempCarNum;CarNumber_stu temp_stu;temp_stu.ip=ip_str;temp_stu.relationNumber=iCurRelationNumber;temp_stu.carNumber=carNumber;temp_stu.captureDateTime=QDateTime::currentDateTime();tempCarNum.carlist.append(temp_stu);carNumListForUV.insert(key_str,tempCarNum);}}}carNumList_MutexForUV.unlock();}

秋风写于淄博,业务咨询与技术交流:Q375172665

这篇关于海康大华宇视SDK车牌号开发主要方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/653898

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

便携式气象仪器的主要特点

TH-BQX9】便携式气象仪器,也称为便携式气象仪或便携式自动气象站,是一款高度集成、低功耗、可快速安装、便于野外监测使用的高精度自动气象观测设备。以下是关于便携式气象仪器的详细介绍:   主要特点   高精度与多功能:便携式气象仪器能够采集多种气象参数,包括但不限于风速、风向、温度、湿度、气压等,部分高级型号还能监测雨量和辐射等。数据采集与存储:配备微电脑气象数据采集仪,具有实时时钟、数据存

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验