C#海康車牌識別實戰指南帶源碼

C#海康車牌識別實戰指南帶源碼

前言

車牌識別技術在智能交通、停車場管理等領域有著廣泛的應用。海康威視作為國內領先的安防廠商,其車牌識別相機提供了豐富的SDK接口供開發者使用。本文將詳細介紹如何使用C#語言結合海康威視SDK實現車牌識別功能,并解析關鍵代碼實現。

一、環境準備

在開始之前,需要準備以下環境:

  1. Visual Studio(推薦2017或更高版本)

  2. 海康威視網絡SDK(HCNetSDK.dll)

  3. 海康威視車牌識別相機設備

  4. .NET Framework 4.0或更高版本

二、項目結構

本項目包含兩個核心類文件:

  1. LicenseCameraGroup.cs?- 管理多個車牌識別相機的組類

  2. LicenseCameraItem.cs?- 單個車牌識別相機的實現類

三、核心代碼解析

1. LicenseCameraGroup類解析

LicenseCameraGroup類負責管理多個車牌識別相機,主要功能包括初始化SDK、啟動監聽服務和處理識別結果。

初始化SDK
public bool Init(List<lpr_entity> dataList, List<PictureBox> licenseCameraPicList)
{try{LprList = dataList;bool m_bInitSDK = CHCNetSDK.NET_DVR_Init();if (m_bInitSDK == false){return false;}else{// 設置SDK日志路徑CHCNetSDK.NET_DVR_SetLogToFile(3, "C:\\SdkLog\\", true);// 設置異常消息回調函數if (m_fExceptionCB == null){m_fExceptionCB = new CHCNetSDK.EXCEPYIONCALLBACK(cbExceptionCB);}CHCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, IntPtr.Zero, m_fExceptionCB, IntPtr.Zero);// 設置報警回調函數if (m_falarmData_V31 == null){m_falarmData_V31 = new CHCNetSDK.MSGCallBack_V31(MsgCallback_V31);}CHCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(m_falarmData_V31, IntPtr.Zero);}// 初始化每個車牌識別相機int a = 0;foreach (var item in dataList){LicenseCameraItem licenseCameraItem = new LicenseCameraItem();licenseCameraItem.Init(item.ip, item.port, item.serial_port, item.baud_rate, item.license_account, item.license_password, licenseCameraPicList[a], item.communication_mode);a++;}// 啟動監聽線程Thread thread = new Thread(StartListen);thread.IsBackground = true;thread.Start();return true;}catch (Exception ex){return false;}
}
啟動監聽服務
public void StartListen()
{sLocalIP = GetIpV4();ushort wLocalPort = 7200;if (m_falarmData == null){m_falarmData = new CHCNetSDK.MSGCallBack(MsgCallback);}iListenHandle = CHCNetSDK.NET_DVR_StartListen_V30(sLocalIP, wLocalPort, m_falarmData, IntPtr.Zero);if (iListenHandle < 0){iLastErr = CHCNetSDK.NET_DVR_GetLastError();strErr = "啟動監聽失敗,錯誤號:" + iLastErr;return;}
}
處理車牌識別結果
private void ProcessCommAlarm_ITSPlate(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
{CHCNetSDK.NET_ITS_PLATE_RESULT struITSPlateResult = new CHCNetSDK.NET_ITS_PLATE_RESULT();uint dwSize = (uint)Marshal.SizeOf(struITSPlateResult);struITSPlateResult = (CHCNetSDK.NET_ITS_PLATE_RESULT)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_ITS_PLATE_RESULT));// 保存抓拍圖片for (int i = 0; i < struITSPlateResult.dwPicNum; i++){if (struITSPlateResult.struPicInfo[i].dwDataLen != 0){int iLen = (int)struITSPlateResult.struPicInfo[i].dwDataLen;byte[] by = new byte[iLen];Marshal.Copy(struITSPlateResult.struPicInfo[i].pBuffer, by, 0, iLen);if (isSavePic){// 保存圖片到指定路徑if (!System.IO.Directory.Exists(path)){System.IO.Directory.CreateDirectory(path);}string str = path + "\\[" + name + "]_Pictype_" + struITSPlateResult.struPicInfo[i].byType + "_PicNum[" + (i + 1) + "]_" + iFileNumber + ".jpg";FileStream fs = new FileStream(str, FileMode.Create);fs.Write(by, 0, iLen);fs.Close();iFileNumber++;}}}// 獲取識別到的車牌號碼string stringPlateLicense = System.Text.Encoding.GetEncoding("GBK").GetString(struITSPlateResult.struPlateInfo.sLicense).TrimEnd('\0');if (!CardIds.Contains(stringPlateLicense)){CardIds.Add(stringPlateLicense);}// 觸發車牌識別事件isFront = strIP == LprList[0].ip;GetNumberEvent(CardIds, isFront);CardIds.Clear();
}

2. LicenseCameraItem類解析

LicenseCameraItem類負責單個車牌識別相機的管理,包括相機初始化、登錄、預覽和布防等功能。

相機初始化
public bool Init(string ip, string port, string account, string password)
{try{_IP = ip;_Port = port;_Account = account;_Password = password;bool m_bInitSDK = CHCNetSDK.NET_DVR_Init();if (m_bInitSDK == false){return false;}return true;}catch (Exception ex){return false;}
}
相機登錄
public bool CameraLogin1(out int num, string iP, string port, string account, string password)
{try{//相機參數不能為空if (String.IsNullOrEmpty(iP) || String.IsNullOrEmpty(port) || String.IsNullOrEmpty(account) || String.IsNullOrEmpty(password)){num = 0;return false;}struLogInfo = new CHCNetSDK.NET_DVR_USER_LOGIN_INFO();//登錄//設備IP地址或者域名byte[] byIP = System.Text.Encoding.Default.GetBytes(iP);struLogInfo.sDeviceAddress = new byte[129];byIP.CopyTo(struLogInfo.sDeviceAddress, 0);//設備用戶名byte[] byUserName = System.Text.Encoding.Default.GetBytes(account);struLogInfo.sUserName = new byte[64];byUserName.CopyTo(struLogInfo.sUserName, 0);//設備密碼byte[] byPassword = System.Text.Encoding.Default.GetBytes(password);struLogInfo.sPassword = new byte[64];byPassword.CopyTo(struLogInfo.sPassword, 0);struLogInfo.wPort = ushort.Parse(port);//設備服務端口號if (LoginCallBack == null){LoginCallBack = new CHCNetSDK.LOGINRESULTCALLBACK(cbLoginCallBack);//注冊回調函數                    }struLogInfo.cbLoginResult = LoginCallBack;struLogInfo.bUseAsynLogin = false; //是否異步登錄:0- 否,1- 是 DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V40();//登錄設備m_lUserID = CHCNetSDK.NET_DVR_Login_V40(ref struLogInfo, ref DeviceInfo);if (m_lUserID < 0){iLastErr = CHCNetSDK.NET_DVR_GetLastError();num = 0;return false;}num = m_lUserID;return true;}catch (Exception ex){num = 0;return false;}
}
打開相機預覽
private bool OpenLicenseCamera(PictureBox LicenseCameraPic, string licenseIp, string licensePort, string licenseAccount, string licensePassword)
{try{if (Init(licenseIp, licensePort, licenseAccount, licensePassword)){if (CameraLogin1(out int num, licenseIp, licensePort, licenseAccount, licensePassword)){m_lUserID = num;}else{return false;}//成功后打開攝像頭CHCNetSDK.NET_DVR_PREVIEWINFO lpPreviewInfo = new CHCNetSDK.NET_DVR_PREVIEWINFO();lpPreviewInfo.hPlayWnd = LicenseCameraPic.Handle;//預覽窗口lpPreviewInfo.lChannel = 1;//預te覽的設備通道lpPreviewInfo.dwStreamType = 0;//碼流類型:0-主碼流,1-子碼流,2-碼流3,3-碼流4,以此類推lpPreviewInfo.dwLinkMode = 0;//連接方式:0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP lpPreviewInfo.bBlocked = true; //0- 非阻塞取流,1- 阻塞取流lpPreviewInfo.dwDisplayBufNum = 1; //播放庫播放緩沖區最大緩沖幀數lpPreviewInfo.byProtoType = 0;lpPreviewInfo.byPreviewMode = 0;if (RealData == null){RealData = new CHCNetSDK.REALDATACALLBACK(RealDataCallBack);//預覽實時流回調函數}IntPtr pUser = new IntPtr();//用戶數據//打開預覽m_lRealHandle = CHCNetSDK.NET_DVR_RealPlay_V40(m_lUserID, ref lpPreviewInfo, null/*RealData*/, pUser);if (m_lRealHandle < 0){iLastErr = CHCNetSDK.NET_DVR_GetLastError();return false;}//監聽車牌線程Thread thread = new Thread(LicenseThread);thread.IsBackground = true;thread.Start();return true;}return false;}catch (Exception ex){return false;}
}

四、使用示例

// 創建車牌識別組
LicenseCameraGroup licenseCameraGroup = new LicenseCameraGroup();// 訂閱車牌識別事件
licenseCameraGroup.GetNumberEvent += (cardIds, isFront) =>
{foreach (string cardId in cardIds){Console.WriteLine($"識別到車牌: {cardId}, 方向: {(isFront ? "前" : "后")}");}
};// 初始化車牌識別相機
List<lpr_entity> lprList = new List<lpr_entity>
{new lpr_entity { ip = "192.168.1.64", port = "8000", license_account = "admin", license_password = "12345" }
};List<PictureBox> pictureBoxes = new List<PictureBox> { pictureBox1 };
licenseCameraGroup.Init(lprList, pictureBoxes);

五、注意事項

  1. 確保正確引用海康威視的SDK文件(HCNetSDK.dll)

  2. 需要先初始化SDK再調用其他功能

  3. 確保網絡通暢,相機設備可達

  4. 注意處理異常情況,如網絡斷開、設備離線等

  5. 合理管理資源,及時釋放不需要的連接

  6. 注意編碼問題,海康SDK通常使用GBK編碼

  7. 確保相機參數配置正確,包括IP、端口、用戶名和密碼

六、總結

本文詳細介紹了如何使用C#和海康威視SDK實現車牌識別功能。通過分析LicenseCameraGroupLicenseCameraItem兩個核心類,我們了解了如何初始化SDK、登錄相機、啟動預覽、設置布防以及處理車牌識別結果。

關鍵點包括:

  1. 使用NET_DVR_Init初始化SDK

  2. 使用NET_DVR_Login_V40登錄相機設備

  3. 使用NET_DVR_RealPlay_V40開啟實時預覽

  4. 使用NET_DVR_SetupAlarmChan_V41設置布防

  5. 通過回調函數處理車牌識別結果

在實際應用中,還需要考慮異常處理、性能優化和資源管理等問題。希望本文對您實現車牌識別功能有所幫助,如有疑問歡迎在評論區留言討論。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95949.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95949.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95949.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

智慧能源新范式:數字孿生平臺如何驅動風電場的精細化管理?

摘要你有沒有想過&#xff0c;一座風力發電場背后&#xff0c;藏著一個“看不見的孿生兄弟”&#xff1f;它能提前預知風機故障&#xff0c;實時模擬極端天氣的影響&#xff0c;甚至能“訓練”運維人員在虛擬場景中演練搶修。這就是數字孿生——一個讓風電場從“靠經驗管理”轉…

STM32-FreeRTOS操作系統-任務管理

引言 隨著嵌入式技術的飛速發展&#xff0c;STM32與FreeRTOS的融合愈發緊密。本文聚焦于STM32平臺下FreeRTOS操作系統的任務管理&#xff0c;旨在為開發者提供清晰的思路與實用的技巧&#xff0c;助力高效開發。 為什么要進行任務管理&#xff1f; 在嵌入式系統中&#xff0c;…

工業領域 ACP 協議全解析:從入門到實戰案例

工業領域 ACP 協議全解析&#xff1a;從入門到實戰案例 文章目錄工業領域 ACP 協議全解析&#xff1a;從入門到實戰案例一、前言二、ACP 協議是什么&#xff1f;1. 基本定義2. 與數據傳輸協議的區別三、ACP 協議的核心功能1. 身份認證&#xff08;Authentication&#xff09;2.…

計算機組成原理:計算機硬件的基本組成

&#x1f4cc;目錄&#x1f5a5;? 計算機硬件的基本組成&#xff1a;從經典到現代的架構演進&#x1f9e9; 一、計算機硬件的五大部分&#xff1a;功能與協同&#x1f4e5; &#xff08;一&#xff09;輸入設備&#xff1a;人機交互的“入口”&#x1f4e4; &#xff08;二&am…

AI歌手功能終于上線!Suno AI 帶你保存歌曲的靈魂

當我們談論一首歌時&#xff0c;究竟是什么讓它“獨一無二”&#xff1f;是主唱的聲音質感&#xff1f;是旋律里的氛圍&#xff1f;還是那種無法復制的風格氣息&#xff1f; 如今&#xff0c;Suno AI 給出了答案—— AI歌手功能正式上線&#xff01; &#x1f31f;什么是「AI…

Dubbo3.3 Triple協議處理東西向流量

前言 Apache Dubbo 3.3 對 Triple 協議做了升級&#xff0c;現在 Dubbo 不僅可以處理東西向流量&#xff0c;也可以處理南北向流量。 **東西向流量&#xff08;East-West Traffic&#xff09; ** 指數據中心或網絡內部同級設備/服務之間的通信。例如&#xff0c;微服務之間的…

操作系統核心特點詳解:從并發到分布式,一文搞懂考研必備知識

操作系統核心特點詳解&#xff1a;從并發到分布式&#xff0c;一文搞懂考研必備知識 大家好&#xff0c;今天咱們來聊聊操作系統&#xff08;OS&#xff09;這個計算機世界的“大管家”。想象一下&#xff0c;你的電腦就像一個忙碌的廚房&#xff0c;操作系統就是那個廚師長&am…

2025精選5款AI視頻轉文字工具,高效轉錄秒變文字!

視頻轉文本的需求早已滲透到生活的方方面面&#xff1a;網課學習需要提取課件臺詞、會議記錄想快速整理要點、追劇時急需生肉轉字幕…… 手動記錄不僅費時&#xff0c;還容易遺漏關鍵信息。今天就分享5款實用工具&#xff0c;從免費到專業全覆蓋&#xff0c;幾步操作就能讓視頻…

MyBatis Example模式SQL注入風險

在使用MyBatis逆向工程生成的Example查詢模式時&#xff0c;很多開發者看到XML中存在${}占位符就會擔心SQL注入問題。但實際上&#xff0c;存在${}并不等同于存在SQL注入風險。本文將詳細分析何時會存在真正的注入風險。 存在SQL注入的兩個關鍵前提 前提一&#xff1a;Criteria…

寶塔PostgreSQL安裝pgvecto插件contrib包實現向量存儲

1. 寶塔安裝 首先確保你的寶塔已經安裝了 PostgreSQL。 安裝好后是能看到上面這個界面的。 我安裝的是 16.1 版本&#xff0c;下面的教程講的也是 16.1 版本的。 2.開放防火墻的端口號 5432 3.允許外部訪問所有數據庫 4.設置超級管理員用戶密碼 用戶名默認為&#xff1a;po…

麒麟系統 doc轉pdf

# 安裝LibreOffice&#xff08;如果尚未安裝&#xff09; sudo apt update sudo apt install libreoffice# 將DOC轉換為PDF libreoffice --headless --convert-to pdf 你的文檔.doc# 或者指定輸出目錄 libreoffice --headless --convert-to pdf --outdir /輸出目錄 你的文檔.do…

Python實現生成矩形框、三角形框、六邊形框和圓環點云

本節我們分享上節提到的不填充點云。在點云處理、計算機視覺與工業檢測中&#xff0c;幾何輪廓&#xff08;邊框/環&#xff09;點云比實心點云更能反映物體的邊緣特征、結構骨架與形貌突變區域。Python 借助 NumPy 即可快速生成矩形邊框、三角形邊框、六邊形邊框與圓環點云&am…

2025年本體論:公理與規則的挑戰與趨勢

摘要本文章旨在深入探討本體論&#xff08;Ontology&#xff09;中公理&#xff08;Axioms&#xff09;與規則&#xff08;Rules&#xff09;的核心概念、技術實現、驗證方法、性能評估及其在2025年的前沿趨勢與挑戰。公理與規則是構建嚴謹、一致知識模型的邏輯基石&#xff0c…

【51單片機】【protues仿真】基于51單片機PM2.5空氣質量檢測系統

目錄 一、主要功能 二、使用步驟 三、硬件資源 四、軟件設計 五、實驗現象 一、主要功能 1、LCD1602液晶顯示 2、按鍵?設置閾值 3、PM2.5大于閾值時啟動聲光警報 二、使用步驟 基于51單片機的PM2.5空氣質量檢測系統通常采用STC89C51/52作為核心控制器&#xff0c;結合…

【目錄-單選】鴻蒙HarmonyOS開發者基礎

用哪一種裝飾器修飾的組件可作為頁面入口組件&#xff1f;Look at the answer下面是ArkTS中類名、枚舉名推薦的代碼風格是 Look at the answer向服務器提交表單數據&#xff0c;以下哪種請求方式比較合適 Look at the answer使用http發起網絡請求&#xff0c;需要以下哪種權限&…

maven【maven】技術詳解

MavenMaven的本質是項目管理工具&#xff0c;將項目開發和管理過程抽象成一個項目對象模型&#xff08;POM&#xff09;Project Object Model&#xff1a;項目對象管理模型作用&#xff1a; 項目構建&#xff1a;提供標準的、跨平臺的自動化項目構建方式依賴管理&#xff1a;方…

【操作系統-Day 25】死鎖 (Deadlock):揭秘多線程編程的“終極殺手”

Langchain系列文章目錄 01-玩轉LangChain&#xff1a;從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊&#xff1a;四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain&#xff1a;從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

【嵌入式C語言】七

8.4函數的聲明和定義聲明一個函數意味著向編譯器描述函數名、返回值、參數個數和類型&#xff0c;但并不會為函數分配存儲空間定義一個函數意味著在聲明變量的同時還要有具體的實現&#xff0c;并且會為函數分配存儲空間8.5多源文件的函數聲明和定義8.6預處理指令#Include#incl…

hardhat3 源神 -- 啟動!

Hardhat 項目開發環境搭建完整指南 1. 從 GitHub 下載項目 # 使用 SSH 方式克隆&#xff08;需要配置 SSH key&#xff09; git clone gitgithub.com:NomicFoundation/hardhat.git# 或使用 HTTPS 方式 git clone https://github.com/NomicFoundation/hardhat.git# 進入項目目錄…

遇到 Git 提示大文件無法上傳確實讓人頭疼

遇到 Git 提示大文件無法上傳確實讓人頭疼&#xff0c;但別擔心&#xff0c;我們可以一步步來解決。為了讓你更清晰地了解整個流程&#xff0c;我先用一個表格來概括主要步驟&#xff1a;步驟核心操作關鍵命令/工具示例 (用于刪除歷史中的大文件)1. 定位大文件使用 Git 命令或工…