4 联合编程
4 联合编程
C#连接相机
-
添加相关的VisionPro控件
- 打开vs
- 在工具箱中右键 => 选择项 => 勾选
CogAcqFifoEditV2(配置相机)、CogRecordDisplay(图片展示工具)
-
将上面添加的两个控件都拖到窗体的合适位置
-
隐藏代码中配置如下代码
// 取相工具 CogAcqFifoTool acqFifoTool = new CogAcqFifoTool(); // 窗体加载事件 private void Form1_Load(object sender, EventArgs e) { // 设置相机配置工具的工作目标为取相工具 acqFifoTool.Subject = cogAcqFifoTool1; } // 拍照按钮点击事件 private void button1_Click(object sender, EventArgs e) { // 运行取相工具 acqFifoTool.Run(); // 获取取相工具的输出图像并赋值给图像展示工具 cogRecordDisplay1.Image = acqFifoTool.OutputImage; // 自适应 cogRecordDisplay1.Fit(); } // 窗体关闭事件 private void Form1_FormClosing(object sender, FormClosingEventArgs e) { // 如果取相工具有相机 if (acqFifoTool.Operator != null) { // 应该将相机释放 acqFifoTool.Operator?.FrameGrabber.Disconnect(false); } }
使用ICogFrameGrabber连接相机
-
CogFrameGrabbers fgs = new CogFrameGrabbers();
获取所有图像采集设备,可迭代,有索引器 -
ICogFrameGrabber.Disconnect(false)
释放相机,应该在窗体关闭的事件中释放所有相机的连接 -
ICogAcqFifo fifo = grabber.CreateAcqFifo("Generic GigEVision (Mono)", CogAcqFifoPixelFormatConstants.Format8Grey, 0, true)
创建图像采集对象,并配置相关信息- 参数1:视频格式
- 参数2:采集图像类型
- 参数3:是否自动准备
-
ICogAcqFifo.Complete
事件,图像采集完成将会触发该事件 -
ICogAcqFifo.GetFifoState(out int numPending, out int numReady, out bool busy)
获取FIFO状态,包括待处理和已准备图像数量以及是否繁忙 -
ICogAcqFifo.CompleteAcquireEx(CogAcqInfo)
获取当前采集的图像 -
ICogAcqFifo.StartAcquire()
开始进行图像采集,采集完成将会触发Complete事件 -
int ICogAcqFifo.OwnedExposureParams.Exposure
读取或这是图像采集对象的曝光度 -
double ICogAcqFifo.OwnedContrastParams.Contrast
读取或这是图像采集对象的对比度(范围0-1) -
CogRecordDisplay.StartLiveDisplay(ICogAcqFifo)
在该控件上进行实时图像采集 -
CogRecordDisplay.StopLiveDisplay()
停止实时采集
下面是一个连接相机、拍照、实时预览、设置曝光、设置对比度的示例
// 存储所有的采集设备信息
CogFrameGrabbers fgs;
// 存储当前选中的采集设备信息
ICogFrameGrabber grabber;
// 存储由采集设备创建的图像抓取对象
ICogAcqFifo fifo;
// 窗体加载时
private void Form1_Load(object sender, EventArgs e)
{
// 获取所有的可用设备
fgs = new CogFrameGrabbers();
// 循环添加到下拉菜单中
foreach (ICogFrameGrabber item in fgs)
{
comboBox1.Items.Add(item.Name);
}
}
// 下拉菜单选项变化时
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedIndex != -1 && fgs.Count != 0)
{
// 获取当前选中的采集设备信息
grabber = fgs[comboBox1.SelectedIndex];
// 创建图像采集对象,并配置
// 参数1:视频格式
// 参数2:采集图像类型
// 参数3:是否自动准备
fifo = grabber.CreateAcqFifo("Generic GigEVision (Mono)", CogAcqFifoPixelFormatConstants.Format8Grey, 0, true);
// 监听Complete事件,图像采集完成将会触发该事件
fifo.Complete += Fifo_Complete;
}
}
private void Fifo_Complete(object sender, CogCompleteEventArgs e)
{
// 获取FIFO状态,包括待处理和已准备图像数量以及是否繁忙
fifo.GetFifoState(out int numPending, out int numReady, out bool busy);
// 如果已准备图像数量大于0
if(numReady > 0)
{
// 停止实时显示
cogRecordDisplay1.StopLiveDisplay();
// 获取并显示已准备好的图像
cogRecordDisplay1.Image = fifo.CompleteAcquireEx(new CogAcqInfo());
}
}
private void button1_Click(object sender, EventArgs e)
{
if (fifo == null) return;
fifo.StartAcquire(); // 开始进行图像采集,采集完成将会触发Complete事件
}
private void button2_Click(object sender, EventArgs e)
{
// 开始实时预览
cogRecordDisplay1.StartLiveDisplay(fifo);
}
private void button3_Click(object sender, EventArgs e)
{
// 停止实时预览
cogRecordDisplay1.StopLiveDisplay();
}
private void button4_Click(object sender, EventArgs e)
{
int bg = int.Parse(textBox1.Text);
// 设置曝光
fifo.OwnedExposureParams.Exposure = bg;
}
private void button6_Click(object sender, EventArgs e)
{
double dbd = double.Parse(textBox3.Text);
// 设置对比度(范围0-1)
fifo.OwnedContrastParams.Contrast = dbd;
}