海康網路相機C#封裝庫分享

学习新知识的小白白發表於2024-08-13

前言

最近做專案過程中,使用到了海康相機,官方只提供了C/C++的SDK,沒有搜尋到一個合適的封裝了的庫,故自己動手,簡單的封裝了一下,方便大家也方便自己使用和二次開發

專案地址:https://github.com/martixjohn/HikvisionNetworkCameraSdkForCsharp

專案結構

├─Dlls/
│
├─Native/
│        	HCNetSDK.cs
│
├─ CameraDevice.cs
│
...

專案很簡單,主要就提供了兩個類:

  • 一個是CameraDevice.cs:相機API使用

    主要介面和成員如圖

    img

  • HCNetSDK.cs:對C++的標頭檔案的封裝,包含常用的型別的宣告等

    (由官方提供的Demo進行修改,並小修小補,修復了部分Bug)

    img

使用

複製動態連結庫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();

結束語

專案很簡單,依然有不足,大家可能還是需要根據具體業務進行二次開發來。

總之歡迎大家使用,若感興趣歡迎參與貢獻!

相關文章