对大华相机官方提供的SDK封装成类以便后期开发调用
首先引用大华相机的dll文件
- CLIDelegate.dll
- ThridLibray.dll
在类里面引入ThridLibray后,开始调用SDK提供的API实现需要的功能
我根据txt文本里面的相机个数(cameranum)来判断有多少个相机,也可把读取外部配置文件的代码段注释掉,通过内部传参来定义相机个数
话不多说,直接上代码(该代码在X64下面运行)。以下这段代码已多相机为例(上限6个)
包含的功能:
- 连续取像
- 软触发单帧取像
- 硬触发单帧取像
- 关闭开启相机时所开启的线程
编译环境是VS2019,亲测可用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using ThridLibray;
namespace BinocularVision
{
class Dahua
{
class Xiangji
{
List<IGrabbedRawData> m_frameList1 = new List<IGrabbedRawData>(); /* 图像缓存列表 */
List<IGrabbedRawData> m_frameList2 = new List<IGrabbedRawData>(); /* 图像缓存列表 */
List<IGrabbedRawData> m_frameList3 = new List<IGrabbedRawData>(); /* 图像缓存列表 */
List<IGrabbedRawData> m_frameList4 = new List<IGrabbedRawData>(); /* 图像缓存列表 */
List<IGrabbedRawData> m_frameList5 = new List<IGrabbedRawData>(); /* 图像缓存列表 */
List<IGrabbedRawData> m_frameList6 = new List<IGrabbedRawData>(); /* 图像缓存列表 */
Thread renderThread1 = null; /* 显示线程 */
Thread renderThread2 = null; /* 显示线程 */
Thread renderThread3 = null; /* 显示线程 */
Thread renderThread4 = null; /* 显示线程 */
Thread renderThread5 = null; /* 显示线程 */
Thread renderThread6 = null; /* 显示线程 */
bool m_bShowLoop1 = true; /* 线程控制变量 */
bool m_bShowLoop2 = true; /* 线程控制变量 */
bool m_bShowLoop3 = true; /* 线程控制变量 */
bool m_bShowLoop4 = true; /* 线程控制变量 */
bool m_bShowLoop5 = true; /* 线程控制变量 */
bool m_bShowLoop6 = true; /* 线程控制变量 */
Mutex m_mutex1 = new Mutex(); /* 锁,保证多线程安全 */
Mutex m_mutex2 = new Mutex(); /* 锁,保证多线程安全 */
Mutex m_mutex3 = new Mutex(); /* 锁,保证多线程安全 */
Mutex m_mutex4 = new Mutex(); /* 锁,保证多线程安全 */
Mutex m_mutex5 = new Mutex(); /* 锁,保证多线程安全 */
Mutex m_mutex6 = new Mutex(); /* 锁,保证多线程安全 */
//重载主窗体
public Xiangji(FormMain formMain)
{
FormMain = formMain;
}
public FormMain FormMain {
get; set; }
/// <summary>
/// 读取相机配置文件
/// </summary>
/// <param name="path"></param>
/// <param name="Rsutlttxt"></param>
public void cameratxtduqu(string path, ref string[] Rsutlttxt)
{
// MessageBox.Show(path);
string readline;
string[] readtxt = new string[100];
if (System.IO.File.Exists(path) == false)
{
MessageBox.Show("相机配置文件不存在");
return;
}
StreamReader reader = new StreamReader(path, System.Text.Encoding.UTF8);
int M = 0;
while (reader.Peek() >= 0)
{
readline = reader.ReadLine();
if (readline != "")
{
M++;
readtxt[M] = readline;
}
}
int Cameranum = Convert.ToInt32(readtxt[1].Substring(7, 1));
Rsutlttxt[1] = readtxt[1].Substring(7, 1);//返回相机个数
try
{
for (int i = 1; i < Cameranum + 1; i++)
{
Rsutlttxt[i + 1] = readtxt[i + 1].Substring(8, readtxt[i + 1].Length - 8); //触发模式
Rsutlttxt[1 + i + Cameranum] = readtxt[i + 1 + Cameranum].Substring(11, readtxt[i + 1 + Cameranum].Length - 11);//相机品牌
Rsutlttxt[1 + i + 2 * Cameranum] = readtxt[i + 1 + 2 * Cameranum].Substring(6, readtxt[i + 1 + 2 * Cameranum].Length - 6);// 相机Width
Rsutlttxt[1 + i + 3 * Cameranum] = readtxt[i + 1 + 3 * Cameranum].Substring(6, readtxt[i + 1 + 3 * Cameranum].Length - 6);//相机Height
}
}
catch
{
MessageBox.Show("配置文件错误!");
}
}//读取相机配置文件
private IDevice[] m_dev = new IDevice[6];
/* 相机打开回调 */
private void OnCameraOpen1(object sender, EventArgs e)
{
FormMain.Invoke(new Action(() =>
{
// FormMain.tsmSingleframeimaging
}));
}
/* 相机关闭回调 */
private void OnCameraClose1(object sender, EventArgs e)
{
}
/* 相机丢失回调 */
private void OnConnectLoss1(object sender, EventArgs e)
{
//m_dev[0].ShutdownGrab();
//m_dev[0].Dispose();
//m_dev[0] = null;
}
private void OnCameraOpen2(object sender, EventArgs e)
{
}
/* 相机关闭回调 */
private void OnCameraClose2(object sender, EventArgs e)
{
}
/* 相机丢失回调 */
private void OnConnectLoss2(object sender, EventArgs e)
{
// m_dev.ShutdownGrab();
// m_dev.Dispose();
// m_dev = null;//
}
private void OnCameraOpen3(object sender, EventArgs e)
{
}
/* 相机关闭回调 */
private void OnCameraClose3(object sender, EventArgs e)
{
}
/* 相机丢失回调 */
private void OnConnectLoss3(object sender, EventArgs e)
{
// m_dev.ShutdownGrab();
// m_dev.Dispose();
// m_dev = null;//
}
private void OnCameraOpen4(object sender, EventArgs e)
{
}
/* 相机关闭回调 */
private void OnCameraClose4(object sender, EventArgs e)