Java 實現 海康攝像頭抓拍圖像 Windows、Linux


先抱怨一下,打死都想不到,海康的攝像頭SDK居然是一個Java類,還有必須的兩個jar包(jna.jar,examples.jar)。鬼能想得到會這么命名。
下面開始吧。

Windows

  1. 把從官網下載的SDK(和當前系統對應)解壓,把庫文件整個拷貝到某個目錄(我是D:\hik\libs),然后把D:\hik\libs和D:\hik\libs\HCNetSDKCom加入到系統環境變量path中。可以嘗試從代碼中把這兩個文件夾加入path,我沒有試成功。

  2. 項目引入jna.jar和examples.jar這兩個jar包。注意:一定要用官網SDK里面的,千萬不要用其他版本的jna

  3. 從ClientDemo中把HCNetSDK.java拷貝到自己的項目中(這就是神奇的SDK)。

  4. 開始主體,Java代碼:

public class CameraManager {

private static Logger logger = LoggerFactory.getLogger(CameraManager.class);
private static HCNetSDK sdk = HCNetSDK.INSTANCE;
private static NativeLong userId = new NativeLong(-1);//用戶登錄ID,值為0,1,2...
private static NativeLong startChan = new NativeLong(-1); // start channel number

private void login(String ip, short port, String username, String pwd){
    //sdk初始化
    if (!sdk.NET_DVR_Init()){
        logger.error("海康SDK初始化失敗!" + sdk.NET_DVR_GetLastError());
    }
    //注冊設備
    NET_DVR_DEVICEINFO_V30 deviceInfo = new NET_DVR_DEVICEINFO_V30();
    //登錄
    userId = sdk.NET_DVR_Login_V30(ip, port, username, pwd, deviceInfo);
    if (userId.intValue() < 0){
        logger.error("攝像頭用戶登錄失敗!Err:" + sdk.NET_DVR_GetLastError());
    }
    startChan.setValue(deviceInfo.byStartChan);
}

public boolean takePic(String ip, short port, String username, String pwd) {
    if (userId.intValue() < 0 || startChan.intValue() < 0) {
        logger.info("執行海康攝像機登錄,ip[{}],port[{}],username[{}].",ip,port,username);
        login(ip,port,username,pwd);
    }
    logger.info("准備拍照,userId:[{}],startChan:[{}]",userId.intValue(),startChan.intValue());
    //拍照
    NET_DVR_JPEGPARA strJpeg = new NET_DVR_JPEGPARA();
    strJpeg.wPicQuality = 1; //圖像參數
    strJpeg.wPicSize = 2;

    String filePath = "E:\\123q.jpg";
    boolean b = sdk.NET_DVR_CaptureJPEGPicture(userId, startChan, strJpeg, filePath);//嘗試用NET_DVR_CaptureJPEGPicture_NEW方法,但不是報43就是JDK崩潰....
    if(!b){//單幀數據捕獲圖片
        System.out.println("抓拍失敗!" + " err: " + sdk.NET_DVR_GetLastError());
    }
    else{
        System.out.println("抓拍成功");
    }
    return b;
}

public void logout(){
    sdk.NET_DVR_Logout(userId);
    sdk.NET_DVR_Cleanup();
}

}


5. 完成。以上代碼中我刪除了異常處理。記得加上。

# Linux

1. 需要把libs和HCNetSDKCom加入到LD_LIBRARY_PATH中,而不是Path中。
    vi /etc/profile在最后添加
    ```
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/jans/test/libs:/home/jans/test/libs/HCNetSDKCom
    ```
    以上路徑替換為自己的包路徑。使用`source /etc/profile`立即生效。如果這里路徑填寫錯誤,攝像頭登錄時會報41錯誤。

2. 編輯/etc/ld.so.conf
    一般這個文件只有一行。在文件末尾加入
    ```
    /home/jans/test/libs
    /home/jans/test/libs/HCNetSDKCom
    ```
    以上路徑替換為自己的包路徑。使用`sudo ldconfig`立即生效。

3. 拷貝Linux項目demo中的HCNetSDK.java,(Linux和Windows中這個SDK名字一樣,但是內容不一樣,咱們寫的代碼無需更改)直接運行代碼即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM