Video Analysis底层库拆分,sdk的go封装
chenshijun
2020-09-09 a3dc3aa4ec63bcc7844bc4ae7a77f992b9fa74dd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include "detector.h"
 
#include <stdio.h>
#include <stdlib.h>
#include "LPRecognition.h"
 
#include "csdk_struct.h"
 
namespace csdk_wrap
{
    static void* pInstance;
    static LPR_RecParma RecParam;
 
    void init_plate_id_cloud_sdk_config(const cPlateIDCloudSDKCfg *params);
 
    int init_plate_id_cloud_sdk_detector(const cPlateIDCloudSDKCfg *params, char *keyPath, char *modelPath) {
        // 读取授权
        int iInitFlag = LPR_ThreadInit(keyPath);
        if(iInitFlag != LPR_OK)
        {
            return iInitFlag;
        }
 
        // 初始化配置参数
        init_plate_id_cloud_sdk_config(params);
 
        // 设置Licence Manager运行路径
        pInstance = LPR_Cloud_Init(RecParam, modelPath);
 
        return pInstance == NULL ? 1 : 0;
    }
 
    void init_plate_id_cloud_sdk_config(const cPlateIDCloudSDKCfg *params) {
        RecParam.eImageType = E_LPR_BGR;
        RecParam.iHorCorrect = 1;
        RecParam.iVerCorrect = 1;
        
        RecParam.iPlateBornThr = 0;
        RecParam.iPlateNumThr = 0;
        RecParam.iPlateDeadThr = 0;
        RecParam.iResultNum = 4;
 
        RecParam.iRecMode = params->iRecMode;
        RecParam.iImageMode = params->iImageMode;
 
        RecParam.iMinPlateWidth = params->iMinPlateWidth;
        RecParam.iMaxPlateWidth = params->iMaxPlateWidth;
 
        RecParam.iImageHeight = params->iImageHeight;
        RecParam.iImageWidth = params->iImageWidth;
 
        RecParam.iMinHorAngle = params->iMinHorAngle; 
        RecParam.iMaxHorAngle = params->iMaxHorAngle;
        RecParam.iMinVerAngle = params->iMinVerAngle;
        RecParam.iMaxVerAngle = params->iMaxVerAngle;
 
        RecParam.fExpLeftRightR = params->fExpLeftRightR;
        RecParam.fExpTopR = params->fExpTopR;
        RecParam.fExpBottomR = params->fExpBottomR;
    }
 
    cPlateIDCloudSDKResult* plate_id_cloud_sdk_detect(int *plateIDCount, const cIMAGE *img, const cRECT *rect) {
        if (!img) {
            return NULL;
        }
 
        cPlateIDCloudSDKResult *ppos = NULL;
 
        ::LPR_Result pLprResult[20];
        memset(&pLprResult, 0, sizeof(pLprResult));
 
        // 设置识别区域
        ::LPR_Rect rcDetect = {rect->left, rect->top, rect->right, rect->bottom};
 
        int iVehicleNum = LPR_Cloud_RecImage((BYTE*)(img->data), img->width, img->height, pLprResult, &rcDetect, pInstance);
 
        if (iVehicleNum > 0){
            ppos = (cPlateIDCloudSDKResult*)malloc(iVehicleNum * sizeof(cPlateIDCloudSDKResult));
            *plateIDCount = iVehicleNum;
            memcpy(ppos, pLprResult, sizeof(LPR_Result) * iVehicleNum);
        }
        return ppos;
    }
 
    void uninit_plate_id_cloud_sdk_detector() {
        LPR_Cloud_Uninit(pInstance);
    }
 
} // csdk_wrap