欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何通過??低曉O備網絡SDK進行Java二次開發(fā)攝像頭車牌識別詳解

 更新時間:2025年02月20日 10:37:50   作者:alecbennington  
這篇文章主要介紹了如何通過??低曉O備網絡SDK進行Java二次開發(fā)攝像頭車牌識別的相關資料,描述了如何使用??低曉O備網絡SDK進行車牌識別和圖片抓拍的開發(fā)流程,包括遇到的問題及其解決辦法,需要的朋友可以參考下

前言

作為實習生接的第一個需求,雖然很簡單,但是還是要記錄一下在這個過程中遇到的問題和解決辦法。

開發(fā)流程

  • 打開??低暪倬W找到開發(fā)文檔,并下載對應的設備網絡SDK ,在設備網絡SDK的壓縮包里面也有對應的開發(fā)文檔的chm版,查看比較方便,同樣在其中我們可以找到Java的demo,注意將dll支持庫復制到demo的lib目錄下之后就可以嘗試運行了。
  • 設備檢測車輛時進行車牌識別、圖片抓拍,并且上傳識別抓拍結果。識別和抓拍是設備實現(xiàn)的,由設備主動上傳,SDK被動接收。這也就是說,我們只需要在后端new一個SDK對象,與設備建立連接之后選擇好布防方式,設備那一端就會把信息上傳給SDK,由SDK來處理信息。布防通俗理解就是打開識別功能的意思,這里布防有兩種方式,

    1)報警布防方式,是指SDK主動連接設備,建立報警上傳通道,設備發(fā)生報警之后發(fā)送給SDK。需要先注冊登錄設備。
    2)報警監(jiān)聽方式,是指觸發(fā)事件時設備主動連接SDK并且上傳報警信息,SDK在設定的端口上監(jiān)聽和接收。需要先在設備端配置報警主機的IP和端口,和SDK監(jiān)聽的IP、端口需要一致。

  • 我這里選擇報警布防方式,由于??低暤腟DK是根據C++編寫的,里面的JavaSDK也是根據C++翻譯來的,所有比較反直覺,不過沒事,我會講清楚遇到的問題。demo的代碼我就不貼出來了,文檔都有,我重點講一下遇到的問題。

問題和解決方案

dll庫加載不到的問題

如果直接運行demo的話,不出意外應該沒什么問題,除非你沒用自己的設備和ip然后登錄失敗,并且?guī)煲彩悄芗虞d到的。

但是我們做二次開發(fā)總會需要把這些東西整合到項目中,可能是單體項目,可能是微服務項目,大部分時候我們需要把lib放到項目一個固定的文件夾,比如WEB-INF下的lib目錄,比如我的項目就是,這個目錄下本來就放了很多依賴,已經add as library了。

private static boolean createSDKInstance() {
        if (hCNetSDK == null) {
            synchronized (HCNetSDK.class) {
                String strDllPath = "";
                try {
                    if (osSelect.isWindows())
                        //win系統(tǒng)加載庫路徑
                        strDllPath = System.getProperty("user.dir") + "\\lib\\HCNetSDK.dll";
                    else if (osSelect.isLinux())
                        //Linux系統(tǒng)加載庫路徑
                        strDllPath = System.getProperty("user.dir") + "/lib/libhcnetsdk.so";
                    hCNetSDK = (HCNetSDK) Native.loadLibrary(strDllPath, HCNetSDK.class);
                    System.out.println(strDllPath);
                } catch (Exception ex) {
                    System.out.println("loadLibrary: " + strDllPath + " Error: " + ex.getMessage());
                    return false;
                }
            }
        }
        return true;
    }

Native.loadLibrary()這個方法,前一個參數是要加載的dll的位置,后一個是要加載的類,在demo里面第一個參數填的是絕對路徑,我在整合到項目里面的時候發(fā)現(xiàn)這里總是報錯,后來調試發(fā)現(xiàn)獲取到的路徑是tomcat部署目錄的路徑,而在項目根目錄新建lib文件夾他沒有識別到。后來嘗試寫成絕對路徑,寫成絕對路徑還是不行,報錯變成了很奇怪的一條信息,顯示找不到xxx(dll的絕對路徑)在xxx(WEB-INF下的lib的目錄),但是實際上我已經將dll放到了WEB-INF下的lib目錄,為什么找不到呢?

后來搜索發(fā)現(xiàn)Native.loadLibrary()這個方法第一個參數只需要填dll支持的名稱就可以了,于是改為

if (hcNetSDK == null) {
            synchronized (HCNetSDK.class) {
                String strDllPath = "";
                try {
                
                    // 加載庫
                    hcNetSDK = (HCNetSDK) Native.loadLibrary("HCNetSDK", HCNetSDK.class);
                } catch (Exception ex) {
                    logger.info("loadLibrary: " + strDllPath + " Error: " + ex.getMessage());
                    return false;
                }
            }

現(xiàn)在就可以加載到了,分析原因可能是Native.loadLibrary()這個方法會到項目指定的lib目錄下去找對應的dll,如果項目沒有指定lib目錄,那就需要指定絕對路徑,如果指定了,那么就只需要名稱就可以了??赡芪业睦斫庥袉栴},大家有更好的理解歡迎指出。

老舊版本sdk不兼容的問題

如果你使用的是新下載的sdk,那么下邊這個問題應該不會遇到

在demo給出的HCNetSdk.java中,可以看到所有的類都繼承了一個Structure,這是因為Java中沒有結構體,而我們前面提到他這個sdk是由c++翻譯來的,所以他自定義了一個結構體,但是有一個問題,老版本的sdk中,這個Structure里面有一個getFiledName()方法需要自己實現(xiàn),我們得自定義一個BaseStructure,寫好這個方法之后再把sdk中所有集成Structure的地方換成我們這個自定義的BaseStructure,代碼如下

public class BaseStructure extends Structure
{
	@Override
	protected List<String> getFieldOrder()
	{
		return getFiledName(this);
	}

	public static List<String> getFiledName(Object o)
	{
		Field[] fields = o.getClass().getDeclaredFields();
		String[] fieldNames = new String[fields.length];
		for (int i = 0; i < fields.length; i++)
		{
			fieldNames[i] = fields[i].getName();
		}
		return Arrays.asList(fieldNames);
	}
}

但是在新版的sdk中,這個方法已經不需要我們重寫了。

我的項目中之前使用過老版的sdk編寫過一些老模塊,所以我碰到了上邊這個問題。另外就是我在更換老版sdk時發(fā)現(xiàn),在老版sdk中很多方法使用了nativelong這個類型作為返回值或者變量類型,而在新版sdk中,這些都變成了int,所以如果你使用的sdk有新老版本沖突的問題,可以嘗試把nativelong類型都換成int。

關鍵實現(xiàn)流程

創(chuàng)建sdk實例;

if (hCNetSDK == null) {
            if (!createSDKInstance()) {
                System.out.println("Load SDK fail");
                return;
            }
        }

初始化并加載日志

        /**初始化*/
        hCNetSDK.NET_DVR_Init();
        /**加載日志*/
        hCNetSDK.NET_DVR_SetLogToFile(3, "./sdklog1", false);
        

編寫并設置回調函數(回調函數就是處理車牌信息的函數,COMM_ITS_PLATE_RESULT這個類型的lCommand就是我們需要的車牌信息的情況,可以在里面編寫自己的邏輯),車牌照片有不同的類型,可以根據需要自己保存照片,文檔里面有寫不同編號對應不同場景圖

public class FMSGCallBack implements HCNetSDK.FMSGCallBack_V31 {
    //報警信息回調函數
    public boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {

        LOGGER.info("報警事件類型: lCommand:" + Integer.toHexString(lCommand));
        String MonitoringSiteID;
        switch (lCommand) {
            case 0x3058:
                LOGGER.info("報警事件類型: 0x3058 車輛黑白名單數據需要同步報警上傳");
                break;

            case HCNetSDK.COMM_UPLOAD_PLATE_RESULT:
                LOGGER.info("報警事件類型: COMM_UPLOAD_PLATE_RESULT");
                break;

            case HCNetSDK.COMM_ITS_PLATE_RESULT:  // 交通抓拍結果(新報警信息)
                HCNetSDK.NET_ITS_PLATE_RESULT strItsPlateResult = new HCNetSDK.NET_ITS_PLATE_RESULT();
                //可以在這里處理自己的邏輯
                break;

            default:
                LOGGER.info("報警類型:" + Integer.toHexString(lCommand));
                break;
        }
        return true;
    }

}
if (fMSFCallBack_V31 == null) {
            fMSFCallBack_V31 = new FMSGCallBack_V31();
            Pointer pUser = null;
            if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fMSFCallBack_V31, pUser)) {
                System.out.println("設置回調函數失敗!");
                return;
            } else {
                System.out.println("設置回調函數成功!");
            }
        }

設置結果分離參數

/** 設備上傳的報警信息是COMM_VCA_ALARM(0x4993)類型,
         在SDK初始化之后增加調用NET_DVR_SetSDKLocalCfg(enumType為NET_DVR_LOCAL_CFG_TYPE_GENERAL)設置通用參數NET_DVR_LOCAL_GENERAL_CFG的byAlarmJsonPictureSeparate為1,
         將Json數據和圖片數據分離上傳,這樣設置之后,報警布防回調函數里面接收到的報警信息類型為COMM_ISAPI_ALARM(0x6009),
         報警信息結構體為NET_DVR_ALARM_ISAPI_INFO(與設備無關,SDK封裝的數據結構),更便于解析。*/

        HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG struNET_DVR_LOCAL_GENERAL_CFG = new HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG();
        struNET_DVR_LOCAL_GENERAL_CFG.byAlarmJsonPictureSeparate = 1;   //設置JSON透傳報警數據和圖片分離
        struNET_DVR_LOCAL_GENERAL_CFG.write();
        Pointer pStrNET_DVR_LOCAL_GENERAL_CFG = struNET_DVR_LOCAL_GENERAL_CFG.getPointer();
        hCNetSDK.NET_DVR_SetSDKLocalCfg(17, pStrNET_DVR_LOCAL_GENERAL_CFG);

接著登錄設備并布防即可

lUserID=Alarm.loginDevice( "10.9.137.17", (short) 8000, "admin", "hik12345");  //登錄設備

lAlarmHandle=Alarm.setAlarmChan(lUserID);//報警布防,和報警監(jiān)聽二選一即可

有一點需要注意,他這個車牌識別無法直接識別靜止的圖片,比如說我們當時采用放個平板(平板上放個車牌照片)的方式測試,攝像頭就沒有抓拍,移動了好幾次才識別出來,大家測試的時候可以注意。雖然它此時沒有抓拍車牌,但還是有一些報警信息,

報警事件類型: 0x3058 車輛黑白名單數據需要同步報警上傳

這個信息隔一段時間就會出現(xiàn),問了客服說這個信息不用解析,大家也可以將這個信息作為自己攝像頭是否正常布防的調試信息,如果有這個類型的報警說明已經布防成功了。

總結

到此這篇關于如何通過??低曉O備網絡SDK進行Java二次開發(fā)攝像頭車牌識別的文章就介紹到這了,更多相關??低曉O備網絡SDK攝像頭車牌識別內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • spring security 5.x實現(xiàn)兼容多種密碼的加密方式

    spring security 5.x實現(xiàn)兼容多種密碼的加密方式

    spring security針對該功能有兩種實現(xiàn)方式,一種是簡單的使用加密來保證基于 cookie 的 token 的安全,另一種是通過數據庫或其它持久化存儲機制來保存生成的 token。這篇文章主要給大家介紹了關于spring security 5.x實現(xiàn)兼容多種密碼的加密方式,需要的朋友可以參考下。
    2018-01-01
  • java springboot的概述、特點與構建介紹

    java springboot的概述、特點與構建介紹

    大家好,本篇文章主要講的是springboot的概述、特點與構建介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 一篇文章帶你深入了解Java基礎(4)

    一篇文章帶你深入了解Java基礎(4)

    這篇文章主要給大家介紹了關于Java中方法使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • shiro編碼和加密代碼詳解

    shiro編碼和加密代碼詳解

    Shiro提供了base64和16進制字符串編碼/解碼的API支持,方便一些編碼解碼操作。下面通過實例代碼給大家詳解shiro編碼和加密知識,感興趣的朋友一起看看吧
    2017-09-09
  • 使用阿里云OSS的服務端簽名后直傳功能的流程分析

    使用阿里云OSS的服務端簽名后直傳功能的流程分析

    這篇文章主要介紹了使用阿里云OSS的服務端簽名后直傳功能,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • 談談我對Spring Bean 生命周期的理解

    談談我對Spring Bean 生命周期的理解

    Spring Bean 的生命周期在整個 Spring 中占有很重要的位置,掌握這些可以加深對 Spring 的理解。這篇文章主要介紹了Spring Bean 生命周期,需要的朋友可以參考下
    2018-03-03
  • JavaFX實現(xiàn)界面跳轉

    JavaFX實現(xiàn)界面跳轉

    這篇文章主要為大家詳細介紹了JavaFX實現(xiàn)界面跳轉,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 自定義注解實現(xiàn)Spring容器注入Bean方式(類似于mybatis的@MapperScans)

    自定義注解實現(xiàn)Spring容器注入Bean方式(類似于mybatis的@MapperScans)

    本文介紹了如何通過自定義注解@MyService和@MyServiceScans在SpringBoot項目中自動將指定包下的類注入Spring容器,詳細解釋了創(chuàng)建自定義注解、定義包掃描器ClassPathBeanDefinitionScanner的作用與實現(xiàn)
    2024-09-09
  • Java中Parser的用法

    Java中Parser的用法

    這篇文章主要介紹了Java?Parser使用指南,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • 解決@Value注解不能注入static修飾的屬性問題

    解決@Value注解不能注入static修飾的屬性問題

    這篇文章主要介紹了解決@Value注解不能注入static修飾的屬性問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評論