最近做項目過程中,使用到了海康相機,官方只提供了C/C++的SDK,沒有搜尋到一個合適的封裝了的C#庫,故自己動手,簡單的封裝了一下,方便大家也方便自己使用和二次開發 ...
前言
最近做項目過程中,使用到了海康相機,官方只提供了C/C++的SDK,沒有搜尋到一個合適的封裝了的C#庫,故自己動手,簡單的封裝了一下,方便大家也方便自己使用和二次開發
項目地址:https://github.com/martixjohn/HikvisionNetworkCameraSdkForCsharp
項目結構
├─Dlls/
│
├─Native/
│ HCNetSDK.cs
│
├─ CameraDevice.cs
│
...
項目很簡單,主要就提供了兩個類:
-
一個是CameraDevice.cs:相機API使用
主要介面和成員如圖
-
HCNetSDK.cs:對C++的頭文件的封裝,包含常用的類型的聲明等
(由官方提供的Demo進行修改,並小修小補,修複了部分Bug)
使用
拷貝動態鏈接庫DLL
拷貝動態鏈接庫到程式目錄,或者程式能訪問到的地方,內部運行時自動鏈接
這裡有個巧妙地辦法:使用環境變數
string originalPath = Environment.GetEnvironmentVariable("Path") ?? string.Empty;
originalPath = Regex.Replace(originalPath, "^" + Path.PathSeparator, string.Empty);
// 加入當前目錄的bin
Environment.SetEnvironmentVariable("PATH", "bin" + Path.PathSeparator + originalPath);
重點在Environment.SetEnvironmentVariable("PATH", ...)
,因為程式一般運行都會訪問PATH環境變數
示例
// 初始化相機SDK,涉及非托管記憶體分配
CameraDevice.InitializeSdk();
string userName = "admin";
string password = "password";
string iP = "192.168.18.1";
ushort port = 8000;
// CameraDevice實現了IDisposable
using(CameraDevice camera = new(userName, password, iP, port)){
try{
// 需要登錄才能使用, 阻塞
camera.Login();
Console.WriteLine("登錄成功! {0}", camera.UserName);
} catch (Exception e) {
Console.WriteLine("exception: {0}", e);
return;
}
try{
// 直接從流中獲取圖片
byte[] image = camera.DirectlyCaptureJpegImage();
// ImageSharp
Image<Rgb24> rgb24 = Image.Load<Rgb24>(image);
// ...
} catch(Exception e){
Console.WriteLine("exception: {0}", e);
return;
}
// 自己處理流數據 (使用回調,非阻塞)
camera.StartFetchVideoStream((streamType, data) => {
if(streamType == StreamType.Header) {
// ...
} else if(streamType == StreamType.Body) {
// ...
}
});
// 模擬進行其他任務
Stopwatch stopwatch = Stopwatch.StartNew();
while (stopwatch.ElapsedMilliseconds < 3000)
{
// ...
}
}
// 程式運行結束,銷毀SDK資源(非托管)
CameraDevice.CleanUpSdk();
結束語
項目很簡單,依然有不足,大家可能還是需要根據具體業務進行二次開發來。
總之歡迎大家使用,若感興趣歡迎參與貢獻!
感謝你的閱讀,覺得不錯麻煩幫忙點個小小的推薦吧