车辆识别功能模块

车牌识别模块流程

#include <stdio.h>
#include <iostream>
#include "Windows.h"
#include "HCNetSDK.h"
using namespace std;

int iNum=0;
BOOL CALLBACK MSesGCallback(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser)
{
    int i=0;
    char filename[100];
    FILE *fSnapPic=NULL;
    FILE *fSnapPicPlate=NULL;

    //以下代码仅供参考,实际应用中不建议在该回调函数中直接处理数据保存文件,
    //例如可以使用消息的方式(PostMessage)在消息响应函数里进行处理。

    switch (lCommand) 
    {
        case COMM_UPLOAD_PLATE_RESULT:
        {
            NET_DVR_PLATE_RESULT struPlateResult={0};
            memcpy(&struPlateResult, pAlarmInfo, sizeof(struPlateResult));
            printf("车牌号: %s\n", struPlateResult.struPlateInfo.sLicense);//车牌号

            switch(struPlateResult.struPlateInfo.byColor)//车牌颜色
            {
                case VCA_BLUE_PLATE:
                    printf("车辆颜色: 蓝色\n");
                    break;
                case VCA_YELLOW_PLATE:
                    printf("车辆颜色: 黄色\n");
                    break;
                case VCA_WHITE_PLATE:
                    printf("车辆颜色: 白色\n");
                    break;
                case VCA_BLACK_PLATE:
                    printf("车辆颜色: 黑色\n");
                    break;	
                default:
                    break;
            } 

            //场景图
            if (struPlateResult.dwPicLen != 0 && struPlateResult.byResultType == 1 ) 
            {
                sprintf(filename,"testpic_%d.jpg",iNum);
                fSnapPic=fopen(filename,"wb");
                fwrite(struPlateResult.pBuffer1,struPlateResult.dwPicLen,1,fSnapPic);
                iNum++;
                fclose(fSnapPic);
            }
            //车牌图
            if (struPlateResult.dwPicPlateLen != 0 && struPlateResult.byResultType == 1) 
            {
                sprintf(filename,"testPicPlate_%d.jpg",iNum);
                fSnapPicPlate=fopen(filename,"wb");
                fwrite(struPlateResult.pBuffer1,struPlateResult.dwPicLen,1,fSnapPicPlate);
                iNum++;
                fclose(fSnapPicPlate);
            }	

            //其他信息处理......
            break;
        }
        case COMM_ITS_PLATE_RESULT:
        {
            NET_ITS_PLATE_RESULT struITSPlateResult={0};
            memcpy(&struITSPlateResult, pAlarmInfo, sizeof(struITSPlateResult));

            for (i=0;i < struITSPlateResult.dwPicNum;i++)
            {
                printf("车牌号: %s\n", struITSPlateResult.struPlateInfo.sLicense);//车牌号

                switch(struITSPlateResult.struPlateInfo.byColor)//车牌颜色
                {
                    case VCA_BLUE_PLATE:
                        printf("车辆颜色: 蓝色\n");
                        break;
                    case VCA_YELLOW_PLATE:
                        printf("车辆颜色: 黄色\n");
                        break;
                    case VCA_WHITE_PLATE:
                        printf("车辆颜色: 白色\n");
                        break;
                    case VCA_BLACK_PLATE:
                        printf("车辆颜色: 黑色\n");
                        break;
                    default:
                        break;
                }

                //保存场景图
                if ((struITSPlateResult.struPicInfo[i].dwDataLen != 0)&&(struITSPlateResult.struPicInfo[i].byType== 1)||(struITSPlateResult.struPicInfo[i].byType == 2))
                {
                    sprintf(filename,"testITSpic%d_%d.jpg",iNum,i);
                    fSnapPic=fopen(filename,"wb");
                    fwrite(struITSPlateResult.struPicInfo[i].pBuffer, struITSPlateResult.struPicInfo[i].dwDataLen,1,fSnapPic);
                    iNum++;
                    fclose(fSnapPic);
                }
                //车牌小图片
                if ((struITSPlateResult.struPicInfo[i].dwDataLen != 0)&&(struITSPlateResult.struPicInfo[i].byType == 0))
                {
                    sprintf(filename,"testPicPlate%d_%d.jpg",iNum,i);
                    fSnapPicPlate=fopen(filename,"wb");
                    fwrite(struITSPlateResult.struPicInfo[i].pBuffer, struITSPlateResult.struPicInfo[i].dwDataLen, 1, fSnapPicPlate);
                    iNum++;
                    fclose(fSnapPicPlate);
                }
                //其他信息处理......
            }
            break;
        }
        default:
            break;
    }

    return TRUE;
}

void main()
{
    //---------------------------------------
    //初始化
    NET_DVR_Init();

    //设置连接时间与重连时间
    NET_DVR_SetConnectTime(2000, 1);
    NET_DVR_SetReconnect(10000, true);

    //---------------------------------------
    //注册设备

    //登录参数,包括设备地址、登录用户、密码等
	LONG lUserID = -1;
    NET_DVR_USER_LOGIN_INFO struLoginInfo = {0};
    struLoginInfo.bUseAsynLogin = 0; //同步登录方式
    strcpy(struLoginInfo.sDeviceAddress, "192.0.0.64"); //设备IP地址
    struLoginInfo.wPort = 8000; //设备服务端口
    strcpy(struLoginInfo.sUserName, "admin"); //设备登录用户名
    strcpy(struLoginInfo.sPassword, "abcd1234"); //设备登录密码
  
    //设备信息, 输出参数
    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;
    }

    //---------------------------------------
    //报警布防

    //设置报警回调函数
    NET_DVR_SetDVRMessageCallBack_V31(MSesGCallback, NULL);

    //启用布防
    NET_DVR_SETUPALARM_PARAM struSetupParam={0};
    struSetupParam.dwSize=sizeof(NET_DVR_SETUPALARM_PARAM);
    struSetupParam.byLevel = 1; //布防优先级:0- 一等级(高),1- 二等级(中)   
    struSetupParam.byAlarmInfoType = 1; //上传报警信息类型: 0- 老报警信息(NET_DVR_PLATE_RESULT), 1- 新报警信息(NET_ITS_PLATE_RESULT)

    LONG lHandle = NET_DVR_SetupAlarmChan_V41(lUserID,&struSetupParam);
    if (lHandle < 0)
    {
        printf("NET_DVR_SetupAlarmChan_V41 failed, error code: %d\n", NET_DVR_GetLastError());
        NET_DVR_Logout(lUserID);
        NET_DVR_Cleanup(); 
        return;
    }
    printf("布防成功!\n");

    //---------------------------------------
    //网络触发抓拍	

    NET_DVR_SNAPCFG struSnapCfg;
    memset(&struSnapCfg, 0, sizeof(NET_DVR_SNAPCFG));

    //结构体大小
    struSnapCfg.dwSize = sizeof(NET_DVR_SNAPCFG);

    //线圈抓拍次数,0-不抓拍,非0-连拍次数,目前最大5次 
    struSnapCfg.bySnapTimes  = 3;

    //抓拍等待时间,单位ms,取值范围[0,60000]
    struSnapCfg.wSnapWaitTime   = 1000;

    //连拍间隔时间,单位ms,取值范围[67,60000]
    struSnapCfg.wIntervalTime[0]  = 1000;
    struSnapCfg.wIntervalTime[1]  = 1000;

    //触发IO关联的车道号,取值范围[0,9]
    struSnapCfg.byRelatedDriveWay = 0; 

    //网络触发连拍
    if (!NET_DVR_ContinuousShoot(lUserID, &struSnapCfg))
    {
        printf("NET_DVR_ContinuousShoot failed, error code: %d\n", NET_DVR_GetLastError());
        return;
    }
    printf("网络触发连拍!\n");

    Sleep(20000); //等待接收数据

    //---------------------------------------
    //退出
	
    //撤销布防上传通道
    if (!NET_DVR_CloseAlarmChan_V30(lHandle))
    {
        printf("NET_DVR_CloseAlarmChan_V30 failed, error code: %d\n", NET_DVR_GetLastError());
        NET_DVR_Logout(lUserID);
        NET_DVR_Cleanup(); 
        return;
    }

    //注销用户
    NET_DVR_Logout(lUserID);

    //释放SDK资源
    NET_DVR_Cleanup();

    return;
}

车辆二次识别模块流程

#include <stdio.h>
#include <iostream>
#include "Windows.h"
#include "HCNetSDK.h"
using namespace std;

int iNum=0;
void CALLBACK MSesGCallback(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser)
{
    int i=0;
    char filename[100];
    FILE *fSnapPic=NULL;
    FILE *fSnapPicPlate=NULL;

    switch(lCommand) 
    {       
        case COMM_VEHICLE_RECOG_RESULT:
            NET_DVR_VEHICLE_RECOG_RESULT struVehicleRecogResult;
            memcpy(&struVehicleRecogResult, pAlarmInfo, sizeof(NET_DVR_VEHICLE_RECOG_RESULT));
            printf("车辆二次识别数据上传: DataIndex[%s] TaskNo[%d] PlateRect{fX[%f] fY[%f] fWidth[%f] fHeight[%f]} sLicense[%s]\
            VehicleType[%d] ColorDepth[%d] CarColor[%d] VehicleLogoRecog[%d] VehicleSubLogoRecog[%d]", \
            struVehicleRecogResult.sDataIndex, struVehicleRecogResult.wTaskNo, struVehicleRecogResult.struPlateRect.fX, \
            struVehicleRecogResult.struPlateRect.fY, struVehicleRecogResult.struPlateRect.fWidth, \
            struVehicleRecogResult.struPlateRect.fHeight, struVehicleRecogResult.sLicense, \
            struVehicleRecogResult.byVehicleType, struVehicleRecogResult.byColorDepth, struVehicleRecogResult.byColor, \
            struVehicleRecogResult.byVehicleLogoRecog, struVehicleRecogResult.byVehicleSubLogoRecog);
            //数据流水号、任务处理号、车牌信息、车型、车身颜色、汽车品牌等
            break;
        default:
            break;
    }

    return;
}

void main()
{
    //---------------------------------------
    //初始化
    NET_DVR_Init();

    //设置连接时间与重连时间
    NET_DVR_SetConnectTime(2000, 1);
    NET_DVR_SetReconnect(10000, true);

    //---------------------------------------
    //启动监听
    LONG lHandle = NET_DVR_StartListen_V30(NULL, 7200, MSesGCallback, NULL);
    if (lHandle < 0)
    {
        printf("NET_DVR_StartListen_V30 failed, error code: %d\n", NET_DVR_GetLastError());
        NET_DVR_Cleanup(); 
        return;
    }
    printf("启动监听成功!\n");

    //登录参数,包括设备地址、登录用户、密码等
    LONG lUserID = -1;
    NET_DVR_USER_LOGIN_INFO struLoginInfo = {0};
    struLoginInfo.bUseAsynLogin = 0; //同步登录方式
    strcpy(struLoginInfo.sDeviceAddress, "192.0.0.64"); //设备IP地址
    struLoginInfo.wPort = 8000; //设备服务端口
    strcpy(struLoginInfo.sUserName, "admin"); //设备登录用户名
    strcpy(struLoginInfo.sPassword, "abcd1234"); //设备登录密码
  
    //设备信息, 输出参数
    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;
    }
  
    //---------------------------------------
    //识别任务提交
    NET_DVR_VEHICLE_RECOG_COND m_struVehRecogCond = {0};
    m_struVehRecogCond.dwSize = sizeof(m_struVehRecogCond);
    m_struVehRecogCond.dwChannel = 1;

    NET_DVR_VEHICLE_RECOG_CFG m_struVehRecogCfg = {0};
    m_struVehRecogCfg.dwSize = sizeof(m_struVehRecogCfg);
    strncpy((char*)(m_struVehRecogCfg.sDataIndex), "1", 64);//数据流水号
    m_struVehRecogCfg.wTaskNo = 1; //任务处理号
    m_struVehRecogCfg.dwRecogOperate = 2047; //二进制:111 1111 1111, 车辆图片二次识别操作类型,按位表示
    m_struVehRecogCfg.dwDataUploadType = 63; //二进制:11 1111, 车辆图片数据上传类型,按位表示
    m_struVehRecogCfg.byPicDataType = 0; //图片数据类型:0- 数据直接上传,1- 云存储服务器URL 
    strncpy((char*)(m_struVehRecogCfg.sPicDataPath), "E:/1.jpg", 256); //本地PC上的图片路径,包括文件名的绝对路径  

    NET_DVR_VEHICLERECOG_TASK_RESULT m_struVehicleRecogTaskResult = {0};
    DWORD dwStatus = 0;
    NET_DVR_IN_PARAM struInputPapam = {0};
    NET_DVR_OUT_PARAM struOutputPapam = {0};
    struInputPapam.struCondBuf.pBuf = &m_struVehRecogCond;
    struInputPapam.struCondBuf.nLen = sizeof(NET_DVR_VEHICLE_RECOG_COND);
    struInputPapam.struInParamBuf.pBuf = &m_struVehRecogCfg;
    struInputPapam.struInParamBuf.nLen = sizeof(NET_DVR_VEHICLE_RECOG_CFG);
    struOutputPapam.lpStatusList = &dwStatus;
    struOutputPapam.struOutBuf.pBuf = &m_struVehicleRecogTaskResult;
    struOutputPapam.struOutBuf.nLen = sizeof(NET_DVR_VEHICLERECOG_TASK_RESULT);

    BOOL bRet = NET_DVR_SetDeviceConfigEx(lUserID, NET_DVR_SET_VEHICLE_RECOG_TASK_V50, 1, &struInputPapam, &struOutputPapam);
    if (!bRet)
    {
        printf("NET_DVR_SET_VEHICLE_RECOG_TASK_V50 failed, error code: %d\n", NET_DVR_GetLastError());
        NET_DVR_Logout(lUserID);
        NET_DVR_StopListen_V30(lHandle);
        NET_DVR_Cleanup();
        return;
    }
    printf("下发任务成功,设备数据流水号: %s!\n",m_struVehicleRecogTaskResult.sDevDataIndex);

    Sleep(20000); //等待接收数据

    //---------------------------------------
    //退出
	
    //注销用户
    NET_DVR_Logout(lUserID);

    //停止监听
    if (!NET_DVR_StopListen_V30(lHandle))
    {
        printf("NET_DVR_StopListen_V30 failed, error code: %d\n", NET_DVR_GetLastError());
    }

    //释放SDK资源
    NET_DVR_Cleanup();

    return;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值