C#中如何連接??低?/h1>
更新時(shí)間:2023年02月26日 14:17:30 作者:Austin?Yang
這篇文章主要介紹了C#中如何連接??低晢栴},具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
C# 連接海康威視

/// <summary>
/// ??低昐DK
/// </summary>
public class SDK_Hikvision : SDK_Camera
{
/// <summary>
/// 相機(jī)名稱
/// </summary>
private string Cam_name;
/// <summary>
/// 相機(jī)實(shí)例
/// </summary>
private MyCamera m_MyCamera;
/// <summary>
/// 圖像回調(diào) 相機(jī)名稱圖源
/// </summary>
public override event ImageDelegate Image_Delegate;
IntPtr pBufForSaveImage = IntPtr.Zero;
//注冊(cè)圖像回調(diào)函數(shù)
MyCamera.cbOutputExdelegate ImageCallback;
/// <summary>
/// 是否已連接相機(jī)
/// </summary>
public override bool IsOpen {
get {
if (m_MyCamera!=null)
{
return m_MyCamera.MV_CC_IsDeviceConnected_NET();
}
return false;
}
}
/// <summary>
///
/// </summary>
~SDK_Hikvision()
{
}
/// <summary>
/// 實(shí)時(shí)采集
/// </summary>
public override void Acquisition()
{
if (m_MyCamera == null) return;
if (GetTriggerMode()==TriggerMode.On)
{
SetTriggerMode(TriggerMode.Off);
}
m_MyCamera.MV_CC_StartGrabbing_NET();
}
/// <summary>
/// 關(guān)閉采集
/// </summary>
public override void CloseConsecutive()
{
if (m_MyCamera == null) return;
m_MyCamera.MV_CC_StopGrabbing_NET();
}
/// <summary>
/// 關(guān)閉相機(jī)
/// </summary>
public override void Close_Camera()
{
if (m_MyCamera == null) return;
m_MyCamera.MV_CC_StopGrabbing_NET();
if (pBufForSaveImage != IntPtr.Zero)
{
Marshal.Release(pBufForSaveImage);
}
/* m_MyCamera.MV_CC_StopGrabbing_NET();
m_MyCamera.MV_CC_ClearImageBuffer_NET();
m_MyCamera.MV_CC_CloseDevice_NET();
//銷毀設(shè)備句柄
m_MyCamera.MV_CC_DestroyDevice_NET();*/
m_MyCamera.MV_CC_CloseDevice_NET();
m_MyCamera.MV_CC_DestroyDevice_NET();
}
/// <summary>
/// 獲取曝光
/// </summary>
/// <returns></returns>
public override double GetExposureTime()
{
if (m_MyCamera!=null)
{
MyCamera.MVCC_FLOATVALUE stParam = new MyCamera.MVCC_FLOATVALUE();
m_MyCamera.MV_CC_GetFloatValue_NET("ExposureTime", ref stParam);
return stParam.fCurValue;
}
return 0;
}
/// <summary>
/// 獲取增益
/// </summary>
/// <returns></returns>
public override double GetGainRaw()
{
if (m_MyCamera != null)
{
MyCamera.MVCC_FLOATVALUE stParam = new MyCamera.MVCC_FLOATVALUE();
m_MyCamera.MV_CC_GetFloatValue_NET("Gain", ref stParam);
return stParam.fCurValue;
}
return 0;
}
/// <summary>
/// 獲取觸發(fā)模式
/// </summary>
/// <returns></returns>
public override TriggerMode GetTriggerMode()
{
if (m_MyCamera != null)
{
MyCamera.MVCC_ENUMVALUE MVCC_SOURCE = new MyCamera.MVCC_ENUMVALUE();
m_MyCamera.MV_CC_GetEnumValue_NET("TriggerMode", ref MVCC_SOURCE);
MyCamera.MV_CAM_TRIGGER_MODE Value = (MyCamera.MV_CAM_TRIGGER_MODE)MVCC_SOURCE.nCurValue;
return (TriggerMode)MVCC_SOURCE.nCurValue;
}
return TriggerMode.On;
}
/// <summary>
/// 獲取觸發(fā)源
/// </summary>
/// <returns></returns>
public override TriggerSource GetTriggerSource()
{
if (m_MyCamera != null)
{
MyCamera.MVCC_ENUMVALUE MVCC_SOURCE = new MyCamera.MVCC_ENUMVALUE();
m_MyCamera.MV_CC_GetEnumValue_NET("TriggerSource", ref MVCC_SOURCE);
MyCamera.MV_CAM_TRIGGER_SOURCE Value = (MyCamera.MV_CAM_TRIGGER_SOURCE)MVCC_SOURCE.nCurValue;
return (TriggerSource)MVCC_SOURCE.nCurValue;
}
return TriggerSource.Software;
}
/// <summary>
/// 打開相機(jī)
/// </summary>
/// <param name="Cam_Name">相機(jī)名稱</param>
/// <returns></returns>
public override bool Open_Camera(string Cam_Name)
{
System.GC.Collect();
MyCamera.MV_CC_DEVICE_INFO_LIST m_stDeviceList = new MyCamera.MV_CC_DEVICE_INFO_LIST();
int nRet = MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE, ref m_stDeviceList);
if (0 != nRet)
{
return false;
}
for (int i = 0; i < m_stDeviceList.nDeviceNum; i++)
{
MyCamera.MV_CC_DEVICE_INFO device = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(m_stDeviceList.pDeviceInfo[i], typeof(MyCamera.MV_CC_DEVICE_INFO));
if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE)
{
IntPtr buffer = Marshal.UnsafeAddrOfPinnedArrayElement(device.SpecialInfo.stGigEInfo, 0);
//MyCamera.MV_GIGE_DEVICE_INFO gigeInfo = (MyCamera.MV_GIGE_DEVICE_INFO)MyCamera.ByteToStruct(device.SpecialInfo.stGigEInfo, typeof(MyCamera.MV_GIGE_DEVICE_INFO));
MyCamera.MV_GIGE_DEVICE_INFO gigeInfo = (MyCamera.MV_GIGE_DEVICE_INFO)Marshal.PtrToStructure(buffer, typeof(MyCamera.MV_GIGE_DEVICE_INFO));
this.Cam_name = gigeInfo.chUserDefinedName;
}
else if (device.nTLayerType == MyCamera.MV_USB_DEVICE)
{
IntPtr buffer = Marshal.UnsafeAddrOfPinnedArrayElement(device.SpecialInfo.stUsb3VInfo, 0);
MyCamera.MV_USB3_DEVICE_INFO usbInfo = (MyCamera.MV_USB3_DEVICE_INFO)Marshal.PtrToStructure(buffer, typeof(MyCamera.MV_USB3_DEVICE_INFO));
//MyCamera.MV_USB3_DEVICE_INFO usbInfo = (MyCamera.MV_USB3_DEVICE_INFO)MyCamera.ByteToStruct(device.SpecialInfo.stUsb3VInfo, typeof(MyCamera.MV_USB3_DEVICE_INFO));
this.Cam_name = usbInfo.chUserDefinedName;
}
if (Cam_Name == this.Cam_name)
{
//打開設(shè)備
if (null == m_MyCamera)
{
m_MyCamera = new MyCamera();
}
//創(chuàng)建設(shè)備
nRet = m_MyCamera.MV_CC_CreateDevice_NET(ref device);
if (MyCamera.MV_OK != nRet)
{
return false;
}
//打開設(shè)備
nRet = m_MyCamera.MV_CC_OpenDevice_NET();
if (MyCamera.MV_OK != nRet)
{
//打開設(shè)備失敗 銷毀設(shè)備句柄
m_MyCamera.MV_CC_DestroyDevice_NET();
return false;
}
// 探測(cè)網(wǎng)絡(luò)最佳包大小(只對(duì)GigE相機(jī)有效)
if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE)
{
int nPacketSize = m_MyCamera.MV_CC_GetOptimalPacketSize_NET();
if (nPacketSize > 0)
{
m_MyCamera.MV_CC_SetIntValue_NET("GevSCPSPacketSize", (uint)nPacketSize);
}
}
//設(shè)置相機(jī)模式
//連續(xù)采集
m_MyCamera.MV_CC_SetEnumValue_NET("AcquisitionMode", (uint)MyCamera.MV_CAM_ACQUISITION_MODE.MV_ACQ_MODE_CONTINUOUS);
//觸發(fā)模式
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerMode", (uint)MyCamera.MV_CAM_TRIGGER_MODE.MV_TRIGGER_MODE_ON);
//設(shè)置圖像緩存節(jié)點(diǎn)個(gè)數(shù)
m_MyCamera.MV_CC_SetImageNodeNum_NET(8);
//注冊(cè)圖像回調(diào)函數(shù)
ImageCallback = new MyCamera.cbOutputExdelegate(GrabImage);
//來設(shè)置數(shù)據(jù)回調(diào)函數(shù)。
nRet =m_MyCamera.MV_CC_RegisterImageCallBackEx_NET(ImageCallback, IntPtr.Zero);
if (MyCamera.MV_OK != nRet)
{
return false;
}
//開啟采集
m_MyCamera.MV_CC_StartGrabbing_NET();
return true;
}
}
return false;
}
/// <summary>
/// 圖像注冊(cè)事件
/// </summary>
/// <param name="pData"></param>
/// <param name="pFrameInfo"></param>
/// <param name="pUser"></param>
private void GrabImage(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo, IntPtr pUser)
{
byte[] SrcData = new byte[pFrameInfo.nHeight * pFrameInfo.nWidth];//圖像數(shù)據(jù)
// Marshal.Copy(pData, SrcData, 0, (int)pFrameInfo.nFrameLen);
HObject Hobj;
HOperatorSet.GenEmptyObj(out Hobj);
byte[] imageData = IntPtr2Bytes(pData, (int)(pFrameInfo.nFrameLen));
uint imageLen = pFrameInfo.nFrameLen;
uint imageWidth = pFrameInfo.nWidth;
uint imageHight = pFrameInfo.nHeight;
if (IsMonoPixelFormat(pFrameInfo.enPixelType))//黑白
{
Hobj.Dispose();
HOperatorSet.GenImage1(out Hobj, "byte", pFrameInfo.nWidth, pFrameInfo.nHeight, pData);
}
else
{
if (pFrameInfo.enPixelType == MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed)//RGB
{
Hobj.Dispose();
HOperatorSet.GenImageInterleaved(out Hobj, pData, "rgb", (int)pFrameInfo.nWidth, (int)pFrameInfo.nHeight, 0, "byte", (int)pFrameInfo.nWidth, (int)pFrameInfo.nHeight, 0, 0, -1, 0);
}
else
{
if (pBufForSaveImage == IntPtr.Zero)
{
pBufForSaveImage = Marshal.AllocHGlobal((int)(pFrameInfo.nWidth * pFrameInfo.nHeight * 3 + 2048));
}
MyCamera.MV_PIXEL_CONVERT_PARAM stConverPixelParam = new MyCamera.MV_PIXEL_CONVERT_PARAM();
stConverPixelParam.nWidth = pFrameInfo.nWidth;
stConverPixelParam.nHeight = pFrameInfo.nHeight;
stConverPixelParam.pSrcData = pData;
stConverPixelParam.nSrcDataLen = pFrameInfo.nFrameLen;
stConverPixelParam.enSrcPixelType = pFrameInfo.enPixelType;
stConverPixelParam.enDstPixelType = MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed;//在此處選擇需要轉(zhuǎn)換的目標(biāo)類型
stConverPixelParam.pDstBuffer = pBufForSaveImage;
stConverPixelParam.nDstBufferSize = (uint)(pFrameInfo.nWidth * pFrameInfo.nHeight * 3 + 2048);
m_MyCamera.MV_CC_ConvertPixelType_NET(ref stConverPixelParam);
Hobj.Dispose();
HOperatorSet.GenImageInterleaved(out Hobj, pBufForSaveImage, "rgb", (int)pFrameInfo.nWidth, (int)pFrameInfo.nHeight, 0, "byte", (int)pFrameInfo.nWidth, (int)pFrameInfo.nHeight, 0, 0, -1, 0);
}
}
if (Hobj.CountObj() > 0)
{
Image_Delegate?.Invoke(Cam_name, Hobj?.Clone());
}
Hobj?.Dispose();
System.GC.Collect();
}
public static byte[] IntPtr2Bytes(IntPtr ptr, int size)
{
if (ptr == IntPtr.Zero)
{
return null;
}
byte[] bytes = new byte[size];
Marshal.Copy(ptr, bytes, 0, size);
return bytes;
}
/// <summary>
/// 黑白圖像
/// </summary>
/// <param name="enType"></param>
/// <returns></returns>
private bool IsMonoPixelFormat(MyCamera.MvGvspPixelType enType)
{
switch (enType)
{
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono12_Packed:
return true;
default:
return false;
}
}
/// <summary>
/// 彩色圖像
/// </summary>
/// <param name="enType"></param>
/// <returns></returns>
private bool IsColorPixelFormat(MyCamera.MvGvspPixelType enType)
{
switch (enType)
{
case MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BGR8_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_RGBA8_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BGRA8_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_YUV422_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_YUV422_YUYV_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR12_Packed:
return true;
default:
return false;
}
}
/// <summary>
/// 設(shè)置曝光
/// </summary>
/// <param name="Value"></param>
/// <returns></returns>
public override double SetExposureTime(double Value)
{
m_MyCamera.MV_CC_SetEnumValue_NET("ExposureAuto", 0);
MyCamera.MVCC_FLOATVALUE stParam = new MyCamera.MVCC_FLOATVALUE();
m_MyCamera.MV_CC_GetFloatValue_NET("ExposureTime", ref stParam);
if (Value <= stParam.fMax && Value >= stParam.fMin)
{
m_MyCamera.MV_CC_SetFloatValue_NET("ExposureTime", (float)Value);
}
return stParam.fCurValue;
}
/// <summary>
/// 設(shè)置增益
/// </summary>
/// <param name="Value"></param>
/// <returns></returns>
public override double SetGainRaw(double Value)
{
m_MyCamera.MV_CC_SetEnumValue_NET("GainAuto", 0);
MyCamera.MVCC_FLOATVALUE stParam = new MyCamera.MVCC_FLOATVALUE();
m_MyCamera.MV_CC_GetFloatValue_NET("Gain", ref stParam);
if (Value <= stParam.fMax && Value >= stParam.fMin)
{
m_MyCamera.MV_CC_SetFloatValue_NET("Gain", (float)Value);
}
return stParam.fCurValue;
}
/// <summary>
/// 獲取觸發(fā)模式
/// </summary>
/// <param name="mode"></param>
public override void SetTriggerMode(TriggerMode mode)
{
if (mode == TriggerMode.Off)
{
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerMode", (uint)MyCamera.MV_CAM_TRIGGER_MODE.MV_TRIGGER_MODE_OFF);
}
else
{
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerMode", (uint)MyCamera.MV_CAM_TRIGGER_MODE.MV_TRIGGER_MODE_ON);
}
}
/// <summary>
/// 設(shè)置觸發(fā)源
/// </summary>
/// <param name="source"></param>
public override void SetTriggerSource(TriggerSource source)
{
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerMode", (uint)MyCamera.MV_CAM_TRIGGER_MODE.MV_TRIGGER_MODE_ON);
switch (source)
{
case TriggerSource.Line1:
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerSource", (uint)MyCamera.MV_CAM_TRIGGER_SOURCE.MV_TRIGGER_SOURCE_LINE0);
break;
case TriggerSource.Line2:
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerSource", (uint)MyCamera.MV_CAM_TRIGGER_SOURCE.MV_TRIGGER_SOURCE_LINE1);
break;
case TriggerSource.Software:
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerSource", (uint)MyCamera.MV_CAM_TRIGGER_SOURCE.MV_TRIGGER_SOURCE_SOFTWARE);
break;
default:
break;
}
}
/// <summary>
/// 軟觸發(fā)一次
/// </summary>
public override bool TriggerSoftware()
{
if (m_MyCamera == null) return false;
if (GetTriggerMode()==TriggerMode.Off)
{
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerMode", (uint)MyCamera.MV_CAM_TRIGGER_MODE.MV_TRIGGER_MODE_ON);
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerSource", (uint)MyCamera.MV_CAM_TRIGGER_SOURCE.MV_TRIGGER_SOURCE_SOFTWARE);
}
m_MyCamera.MV_CC_SetCommandValue_NET("TriggerSoftware");
return true;
}
}
C#海康威視無法加載DLL“..\bin\HCNetSDK.dll”
項(xiàng)目場(chǎng)景
c#??低暎篠ystem.DllNotFoundException:“無法加載 DLL“…\bin\HCNetSDK.dll”: 找不到指定的模塊。 (異常來自 HRESULT:0x8007007E)。”
問題描述
將??低暤腟DK直接復(fù)制到我的項(xiàng)目中時(shí),使用到SDK中的方法就出現(xiàn)這個(gè)異常。
將demo里的dll放在bin文件夾和bin\Debug文件夾里時(shí)也會(huì)出錯(cuò)。

原因分析
這個(gè)肯定是路徑出錯(cuò)了,不然不會(huì)報(bào)這個(gè)找不到指定模塊的異常。
解決方案
在代碼中選中方法函數(shù),右鍵轉(zhuǎn)到定義:

將\bin\HCNetSDK.dll改成\Debug\HCNetSDK,這樣就不會(huì)報(bào)錯(cuò)了。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
-
C#實(shí)現(xiàn)綁定DataGridView與TextBox之間關(guān)聯(lián)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)綁定DataGridView與TextBox之間關(guān)聯(lián)的方法,涉及C#綁定控件關(guān)聯(lián)性的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下 2015-08-08
-
C#實(shí)現(xiàn)開機(jī)自動(dòng)啟動(dòng)設(shè)置代碼分享
這篇文章主要介紹了C#實(shí)現(xiàn)開機(jī)自動(dòng)啟動(dòng)設(shè)置代碼分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下 2015-07-07
-
C# 使用相同權(quán)限調(diào)用 cmd 傳入命令的方法
本文告訴大家如何使用相同權(quán)限調(diào)用cmd并且傳入命令,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧 2018-07-07
-
C#利用Spire.Pdf包實(shí)現(xiàn)為PDF添加數(shù)字簽名
Spire.PDF for .NET 是一款專業(yè)的基于.NET平臺(tái)的PDF文檔控制組件。它能夠讓開發(fā)人員在不使用Adobe Acrobat和其他外部控件的情況下,運(yùn)用.NET 應(yīng)用程序創(chuàng)建,閱讀,編寫和操縱PDF 文檔。本文將利用其實(shí)現(xiàn)添加數(shù)字簽名,需要的可以參考一下 2022-08-08
-
C#實(shí)現(xiàn)可捕獲幾乎所有鍵盤鼠標(biāo)事件的鉤子類完整實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)可捕獲幾乎所有鍵盤鼠標(biāo)事件的鉤子類,以完整實(shí)例形式分析了C#捕獲鍵盤鼠標(biāo)事件的鉤子操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下 2016-06-06
最新評(píng)論
C# 連接海康威視
![]()
/// <summary>
/// ??低昐DK
/// </summary>
public class SDK_Hikvision : SDK_Camera
{
/// <summary>
/// 相機(jī)名稱
/// </summary>
private string Cam_name;
/// <summary>
/// 相機(jī)實(shí)例
/// </summary>
private MyCamera m_MyCamera;
/// <summary>
/// 圖像回調(diào) 相機(jī)名稱圖源
/// </summary>
public override event ImageDelegate Image_Delegate;
IntPtr pBufForSaveImage = IntPtr.Zero;
//注冊(cè)圖像回調(diào)函數(shù)
MyCamera.cbOutputExdelegate ImageCallback;
/// <summary>
/// 是否已連接相機(jī)
/// </summary>
public override bool IsOpen {
get {
if (m_MyCamera!=null)
{
return m_MyCamera.MV_CC_IsDeviceConnected_NET();
}
return false;
}
}
/// <summary>
///
/// </summary>
~SDK_Hikvision()
{
}
/// <summary>
/// 實(shí)時(shí)采集
/// </summary>
public override void Acquisition()
{
if (m_MyCamera == null) return;
if (GetTriggerMode()==TriggerMode.On)
{
SetTriggerMode(TriggerMode.Off);
}
m_MyCamera.MV_CC_StartGrabbing_NET();
}
/// <summary>
/// 關(guān)閉采集
/// </summary>
public override void CloseConsecutive()
{
if (m_MyCamera == null) return;
m_MyCamera.MV_CC_StopGrabbing_NET();
}
/// <summary>
/// 關(guān)閉相機(jī)
/// </summary>
public override void Close_Camera()
{
if (m_MyCamera == null) return;
m_MyCamera.MV_CC_StopGrabbing_NET();
if (pBufForSaveImage != IntPtr.Zero)
{
Marshal.Release(pBufForSaveImage);
}
/* m_MyCamera.MV_CC_StopGrabbing_NET();
m_MyCamera.MV_CC_ClearImageBuffer_NET();
m_MyCamera.MV_CC_CloseDevice_NET();
//銷毀設(shè)備句柄
m_MyCamera.MV_CC_DestroyDevice_NET();*/
m_MyCamera.MV_CC_CloseDevice_NET();
m_MyCamera.MV_CC_DestroyDevice_NET();
}
/// <summary>
/// 獲取曝光
/// </summary>
/// <returns></returns>
public override double GetExposureTime()
{
if (m_MyCamera!=null)
{
MyCamera.MVCC_FLOATVALUE stParam = new MyCamera.MVCC_FLOATVALUE();
m_MyCamera.MV_CC_GetFloatValue_NET("ExposureTime", ref stParam);
return stParam.fCurValue;
}
return 0;
}
/// <summary>
/// 獲取增益
/// </summary>
/// <returns></returns>
public override double GetGainRaw()
{
if (m_MyCamera != null)
{
MyCamera.MVCC_FLOATVALUE stParam = new MyCamera.MVCC_FLOATVALUE();
m_MyCamera.MV_CC_GetFloatValue_NET("Gain", ref stParam);
return stParam.fCurValue;
}
return 0;
}
/// <summary>
/// 獲取觸發(fā)模式
/// </summary>
/// <returns></returns>
public override TriggerMode GetTriggerMode()
{
if (m_MyCamera != null)
{
MyCamera.MVCC_ENUMVALUE MVCC_SOURCE = new MyCamera.MVCC_ENUMVALUE();
m_MyCamera.MV_CC_GetEnumValue_NET("TriggerMode", ref MVCC_SOURCE);
MyCamera.MV_CAM_TRIGGER_MODE Value = (MyCamera.MV_CAM_TRIGGER_MODE)MVCC_SOURCE.nCurValue;
return (TriggerMode)MVCC_SOURCE.nCurValue;
}
return TriggerMode.On;
}
/// <summary>
/// 獲取觸發(fā)源
/// </summary>
/// <returns></returns>
public override TriggerSource GetTriggerSource()
{
if (m_MyCamera != null)
{
MyCamera.MVCC_ENUMVALUE MVCC_SOURCE = new MyCamera.MVCC_ENUMVALUE();
m_MyCamera.MV_CC_GetEnumValue_NET("TriggerSource", ref MVCC_SOURCE);
MyCamera.MV_CAM_TRIGGER_SOURCE Value = (MyCamera.MV_CAM_TRIGGER_SOURCE)MVCC_SOURCE.nCurValue;
return (TriggerSource)MVCC_SOURCE.nCurValue;
}
return TriggerSource.Software;
}
/// <summary>
/// 打開相機(jī)
/// </summary>
/// <param name="Cam_Name">相機(jī)名稱</param>
/// <returns></returns>
public override bool Open_Camera(string Cam_Name)
{
System.GC.Collect();
MyCamera.MV_CC_DEVICE_INFO_LIST m_stDeviceList = new MyCamera.MV_CC_DEVICE_INFO_LIST();
int nRet = MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE, ref m_stDeviceList);
if (0 != nRet)
{
return false;
}
for (int i = 0; i < m_stDeviceList.nDeviceNum; i++)
{
MyCamera.MV_CC_DEVICE_INFO device = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(m_stDeviceList.pDeviceInfo[i], typeof(MyCamera.MV_CC_DEVICE_INFO));
if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE)
{
IntPtr buffer = Marshal.UnsafeAddrOfPinnedArrayElement(device.SpecialInfo.stGigEInfo, 0);
//MyCamera.MV_GIGE_DEVICE_INFO gigeInfo = (MyCamera.MV_GIGE_DEVICE_INFO)MyCamera.ByteToStruct(device.SpecialInfo.stGigEInfo, typeof(MyCamera.MV_GIGE_DEVICE_INFO));
MyCamera.MV_GIGE_DEVICE_INFO gigeInfo = (MyCamera.MV_GIGE_DEVICE_INFO)Marshal.PtrToStructure(buffer, typeof(MyCamera.MV_GIGE_DEVICE_INFO));
this.Cam_name = gigeInfo.chUserDefinedName;
}
else if (device.nTLayerType == MyCamera.MV_USB_DEVICE)
{
IntPtr buffer = Marshal.UnsafeAddrOfPinnedArrayElement(device.SpecialInfo.stUsb3VInfo, 0);
MyCamera.MV_USB3_DEVICE_INFO usbInfo = (MyCamera.MV_USB3_DEVICE_INFO)Marshal.PtrToStructure(buffer, typeof(MyCamera.MV_USB3_DEVICE_INFO));
//MyCamera.MV_USB3_DEVICE_INFO usbInfo = (MyCamera.MV_USB3_DEVICE_INFO)MyCamera.ByteToStruct(device.SpecialInfo.stUsb3VInfo, typeof(MyCamera.MV_USB3_DEVICE_INFO));
this.Cam_name = usbInfo.chUserDefinedName;
}
if (Cam_Name == this.Cam_name)
{
//打開設(shè)備
if (null == m_MyCamera)
{
m_MyCamera = new MyCamera();
}
//創(chuàng)建設(shè)備
nRet = m_MyCamera.MV_CC_CreateDevice_NET(ref device);
if (MyCamera.MV_OK != nRet)
{
return false;
}
//打開設(shè)備
nRet = m_MyCamera.MV_CC_OpenDevice_NET();
if (MyCamera.MV_OK != nRet)
{
//打開設(shè)備失敗 銷毀設(shè)備句柄
m_MyCamera.MV_CC_DestroyDevice_NET();
return false;
}
// 探測(cè)網(wǎng)絡(luò)最佳包大小(只對(duì)GigE相機(jī)有效)
if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE)
{
int nPacketSize = m_MyCamera.MV_CC_GetOptimalPacketSize_NET();
if (nPacketSize > 0)
{
m_MyCamera.MV_CC_SetIntValue_NET("GevSCPSPacketSize", (uint)nPacketSize);
}
}
//設(shè)置相機(jī)模式
//連續(xù)采集
m_MyCamera.MV_CC_SetEnumValue_NET("AcquisitionMode", (uint)MyCamera.MV_CAM_ACQUISITION_MODE.MV_ACQ_MODE_CONTINUOUS);
//觸發(fā)模式
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerMode", (uint)MyCamera.MV_CAM_TRIGGER_MODE.MV_TRIGGER_MODE_ON);
//設(shè)置圖像緩存節(jié)點(diǎn)個(gè)數(shù)
m_MyCamera.MV_CC_SetImageNodeNum_NET(8);
//注冊(cè)圖像回調(diào)函數(shù)
ImageCallback = new MyCamera.cbOutputExdelegate(GrabImage);
//來設(shè)置數(shù)據(jù)回調(diào)函數(shù)。
nRet =m_MyCamera.MV_CC_RegisterImageCallBackEx_NET(ImageCallback, IntPtr.Zero);
if (MyCamera.MV_OK != nRet)
{
return false;
}
//開啟采集
m_MyCamera.MV_CC_StartGrabbing_NET();
return true;
}
}
return false;
}
/// <summary>
/// 圖像注冊(cè)事件
/// </summary>
/// <param name="pData"></param>
/// <param name="pFrameInfo"></param>
/// <param name="pUser"></param>
private void GrabImage(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo, IntPtr pUser)
{
byte[] SrcData = new byte[pFrameInfo.nHeight * pFrameInfo.nWidth];//圖像數(shù)據(jù)
// Marshal.Copy(pData, SrcData, 0, (int)pFrameInfo.nFrameLen);
HObject Hobj;
HOperatorSet.GenEmptyObj(out Hobj);
byte[] imageData = IntPtr2Bytes(pData, (int)(pFrameInfo.nFrameLen));
uint imageLen = pFrameInfo.nFrameLen;
uint imageWidth = pFrameInfo.nWidth;
uint imageHight = pFrameInfo.nHeight;
if (IsMonoPixelFormat(pFrameInfo.enPixelType))//黑白
{
Hobj.Dispose();
HOperatorSet.GenImage1(out Hobj, "byte", pFrameInfo.nWidth, pFrameInfo.nHeight, pData);
}
else
{
if (pFrameInfo.enPixelType == MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed)//RGB
{
Hobj.Dispose();
HOperatorSet.GenImageInterleaved(out Hobj, pData, "rgb", (int)pFrameInfo.nWidth, (int)pFrameInfo.nHeight, 0, "byte", (int)pFrameInfo.nWidth, (int)pFrameInfo.nHeight, 0, 0, -1, 0);
}
else
{
if (pBufForSaveImage == IntPtr.Zero)
{
pBufForSaveImage = Marshal.AllocHGlobal((int)(pFrameInfo.nWidth * pFrameInfo.nHeight * 3 + 2048));
}
MyCamera.MV_PIXEL_CONVERT_PARAM stConverPixelParam = new MyCamera.MV_PIXEL_CONVERT_PARAM();
stConverPixelParam.nWidth = pFrameInfo.nWidth;
stConverPixelParam.nHeight = pFrameInfo.nHeight;
stConverPixelParam.pSrcData = pData;
stConverPixelParam.nSrcDataLen = pFrameInfo.nFrameLen;
stConverPixelParam.enSrcPixelType = pFrameInfo.enPixelType;
stConverPixelParam.enDstPixelType = MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed;//在此處選擇需要轉(zhuǎn)換的目標(biāo)類型
stConverPixelParam.pDstBuffer = pBufForSaveImage;
stConverPixelParam.nDstBufferSize = (uint)(pFrameInfo.nWidth * pFrameInfo.nHeight * 3 + 2048);
m_MyCamera.MV_CC_ConvertPixelType_NET(ref stConverPixelParam);
Hobj.Dispose();
HOperatorSet.GenImageInterleaved(out Hobj, pBufForSaveImage, "rgb", (int)pFrameInfo.nWidth, (int)pFrameInfo.nHeight, 0, "byte", (int)pFrameInfo.nWidth, (int)pFrameInfo.nHeight, 0, 0, -1, 0);
}
}
if (Hobj.CountObj() > 0)
{
Image_Delegate?.Invoke(Cam_name, Hobj?.Clone());
}
Hobj?.Dispose();
System.GC.Collect();
}
public static byte[] IntPtr2Bytes(IntPtr ptr, int size)
{
if (ptr == IntPtr.Zero)
{
return null;
}
byte[] bytes = new byte[size];
Marshal.Copy(ptr, bytes, 0, size);
return bytes;
}
/// <summary>
/// 黑白圖像
/// </summary>
/// <param name="enType"></param>
/// <returns></returns>
private bool IsMonoPixelFormat(MyCamera.MvGvspPixelType enType)
{
switch (enType)
{
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono12_Packed:
return true;
default:
return false;
}
}
/// <summary>
/// 彩色圖像
/// </summary>
/// <param name="enType"></param>
/// <returns></returns>
private bool IsColorPixelFormat(MyCamera.MvGvspPixelType enType)
{
switch (enType)
{
case MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BGR8_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_RGBA8_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BGRA8_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_YUV422_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_YUV422_YUYV_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR12_Packed:
return true;
default:
return false;
}
}
/// <summary>
/// 設(shè)置曝光
/// </summary>
/// <param name="Value"></param>
/// <returns></returns>
public override double SetExposureTime(double Value)
{
m_MyCamera.MV_CC_SetEnumValue_NET("ExposureAuto", 0);
MyCamera.MVCC_FLOATVALUE stParam = new MyCamera.MVCC_FLOATVALUE();
m_MyCamera.MV_CC_GetFloatValue_NET("ExposureTime", ref stParam);
if (Value <= stParam.fMax && Value >= stParam.fMin)
{
m_MyCamera.MV_CC_SetFloatValue_NET("ExposureTime", (float)Value);
}
return stParam.fCurValue;
}
/// <summary>
/// 設(shè)置增益
/// </summary>
/// <param name="Value"></param>
/// <returns></returns>
public override double SetGainRaw(double Value)
{
m_MyCamera.MV_CC_SetEnumValue_NET("GainAuto", 0);
MyCamera.MVCC_FLOATVALUE stParam = new MyCamera.MVCC_FLOATVALUE();
m_MyCamera.MV_CC_GetFloatValue_NET("Gain", ref stParam);
if (Value <= stParam.fMax && Value >= stParam.fMin)
{
m_MyCamera.MV_CC_SetFloatValue_NET("Gain", (float)Value);
}
return stParam.fCurValue;
}
/// <summary>
/// 獲取觸發(fā)模式
/// </summary>
/// <param name="mode"></param>
public override void SetTriggerMode(TriggerMode mode)
{
if (mode == TriggerMode.Off)
{
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerMode", (uint)MyCamera.MV_CAM_TRIGGER_MODE.MV_TRIGGER_MODE_OFF);
}
else
{
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerMode", (uint)MyCamera.MV_CAM_TRIGGER_MODE.MV_TRIGGER_MODE_ON);
}
}
/// <summary>
/// 設(shè)置觸發(fā)源
/// </summary>
/// <param name="source"></param>
public override void SetTriggerSource(TriggerSource source)
{
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerMode", (uint)MyCamera.MV_CAM_TRIGGER_MODE.MV_TRIGGER_MODE_ON);
switch (source)
{
case TriggerSource.Line1:
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerSource", (uint)MyCamera.MV_CAM_TRIGGER_SOURCE.MV_TRIGGER_SOURCE_LINE0);
break;
case TriggerSource.Line2:
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerSource", (uint)MyCamera.MV_CAM_TRIGGER_SOURCE.MV_TRIGGER_SOURCE_LINE1);
break;
case TriggerSource.Software:
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerSource", (uint)MyCamera.MV_CAM_TRIGGER_SOURCE.MV_TRIGGER_SOURCE_SOFTWARE);
break;
default:
break;
}
}
/// <summary>
/// 軟觸發(fā)一次
/// </summary>
public override bool TriggerSoftware()
{
if (m_MyCamera == null) return false;
if (GetTriggerMode()==TriggerMode.Off)
{
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerMode", (uint)MyCamera.MV_CAM_TRIGGER_MODE.MV_TRIGGER_MODE_ON);
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerSource", (uint)MyCamera.MV_CAM_TRIGGER_SOURCE.MV_TRIGGER_SOURCE_SOFTWARE);
}
m_MyCamera.MV_CC_SetCommandValue_NET("TriggerSoftware");
return true;
}
}C#海康威視無法加載DLL“..\bin\HCNetSDK.dll”
項(xiàng)目場(chǎng)景
c#??低暎篠ystem.DllNotFoundException:“無法加載 DLL“…\bin\HCNetSDK.dll”: 找不到指定的模塊。 (異常來自 HRESULT:0x8007007E)。”
問題描述
將??低暤腟DK直接復(fù)制到我的項(xiàng)目中時(shí),使用到SDK中的方法就出現(xiàn)這個(gè)異常。
將demo里的dll放在bin文件夾和bin\Debug文件夾里時(shí)也會(huì)出錯(cuò)。

原因分析
這個(gè)肯定是路徑出錯(cuò)了,不然不會(huì)報(bào)這個(gè)找不到指定模塊的異常。
解決方案
在代碼中選中方法函數(shù),右鍵轉(zhuǎn)到定義:

將\bin\HCNetSDK.dll改成\Debug\HCNetSDK,這樣就不會(huì)報(bào)錯(cuò)了。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C#實(shí)現(xiàn)綁定DataGridView與TextBox之間關(guān)聯(lián)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)綁定DataGridView與TextBox之間關(guān)聯(lián)的方法,涉及C#綁定控件關(guān)聯(lián)性的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
C#實(shí)現(xiàn)開機(jī)自動(dòng)啟動(dòng)設(shè)置代碼分享
這篇文章主要介紹了C#實(shí)現(xiàn)開機(jī)自動(dòng)啟動(dòng)設(shè)置代碼分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-07-07
C# 使用相同權(quán)限調(diào)用 cmd 傳入命令的方法
本文告訴大家如何使用相同權(quán)限調(diào)用cmd并且傳入命令,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-07-07
C#利用Spire.Pdf包實(shí)現(xiàn)為PDF添加數(shù)字簽名
Spire.PDF for .NET 是一款專業(yè)的基于.NET平臺(tái)的PDF文檔控制組件。它能夠讓開發(fā)人員在不使用Adobe Acrobat和其他外部控件的情況下,運(yùn)用.NET 應(yīng)用程序創(chuàng)建,閱讀,編寫和操縱PDF 文檔。本文將利用其實(shí)現(xiàn)添加數(shù)字簽名,需要的可以參考一下2022-08-08
C#實(shí)現(xiàn)可捕獲幾乎所有鍵盤鼠標(biāo)事件的鉤子類完整實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)可捕獲幾乎所有鍵盤鼠標(biāo)事件的鉤子類,以完整實(shí)例形式分析了C#捕獲鍵盤鼠標(biāo)事件的鉤子操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06

