在本部分开始前建议先了解一下:CogImageFileTool读图-CSDN博客和机器视觉技术与应用实战(Visionpro工具二次开发 01)_visionpro wpf-CSDN博客。
因为本次将利用到这些东西。
首先:实现功能:CogImageFileTool读图到CogRecordDisplay,并且显示出来。
你需要在工具箱导入CogRecordDisplay,并且拖到界面里面。同时还要导入一个按钮(button)。
布局大概这样:
为了后面阅读方便,可以修改一下按钮属性(右键布局上的按钮点击“属性”就可以修改):
1、按钮的名字:
2、按钮在你的代码里面的类名:
开始编写代码:
双击按钮其实就可以跳转到代码界面,当然你可以去找.cs后缀的文件打开。
要在解决方案里面引入Cognex.VisionPro.ImageFile。在“扩展”里面找Cognex.VisionPro.ImageFile
废话不多说(c#代码):
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Cognex.VisionPro;
using Cognex.VisionPro.ImageFile;//这个需要引用
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
private CogImageFileTool picture;//定义一个CogImageFileTool变量
public Form1()
{
InitializeComponent();
picture = new CogImageFileTool();//实例化
}
private void Form1_Load(object sender, EventArgs e)
{
}
//按钮点击后功能实现
private void DisplayImageButton_Click(object sender, EventArgs e)
{
picture.Operator.Open("C:\\Users\\12581\\Desktop\\1.jpg", CogImageFileModeConstants.Read);//读图
picture.Run();
cogRecordDisplay1.Image = picture.OutputImage;//显示出来
cogRecordDisplay1.Fit(true);
}
}
}
效果如下:
功能比较简单,可以在这个基础上把连续读图的功能实现。
如果我想调用调用实时视频呢?
这里需要用到线程,一帧一帧获取图像。
线程,它来了!
由于要调用不同类型相机的配置文件,这里就跳过了。
核心代码(不同相机配置不同,读帧大体一致):
private Thread ThreadObject; //声明线程变量
ThreadObject = new Thread(new ThreadStart(ThreadFunction));// //线程对象实例化
//线程启动
if (ThreadObject.ThreadState == System.Threading.ThreadState.Unstarted)
{
ThreadObject.Start();
}
//线程回调函数
public void ThreadFunction()
{
int ImageWidth = 1280;
int ImageHeight = 1024;
CogImage8Grey Image = new CogImage8Grey();
var cogRoot = new CogImage8Root();
IntPtr ImageBufferPtr = Marshal.AllocHGlobal(ImageWidth * ImageHeight);
byte[] ImageBuffer = new byte[ImageWidth * ImageHeight];
while (!ThreadStop)
{
//采集单张图像
SnapAcquisitionSoftTrigger(ref ImageBuffer);
//将图像数据从托管区拷贝到非托管区
Marshal.Copy(ImageBuffer, 0, ImageBufferPtr, ImageWidth * ImageHeight);
//初始化
cogRoot.Initialize(ImageWidth, ImageHeight, ImageBufferPtr, ImageWidth, null);
//指定Image图像数据为cogRoot
Image.SetRoot(cogRoot);
//将图像数据传给cogRecordDisplay1控件
cogRecordDisplay1.Image = Image as CogImage8Grey;
//显示图像
cogRecordDisplay1.Fit(true);
}