VisionPro二开之相机类设计 一 CameraService using Cognex. VisionPro ; using System ; using System. Collections. Generic ; using System. Linq ; using System. Text ; using System. Threading. Tasks ; using System. Windows. Forms ; namespace VP之相机调试2 { public class CameraService { //1. 私有静态变量(在第四步供外界使用),创建类的实例 //2. 私有构造函数,确保外部无法直接实例化(确保是单个实例) //3. 确定供外界调用的代码资源 //4. 公开静态属性,供外界使用(把第一步类的实例,开放出去) //5. 外界使用 //1. 创建类的实例,同时变成私有的静态变量(在第四步供外界使用), private static CameraService instance= new CameraService ( ) ; //2. 私有构造函数,确保外部无法直接实例化(确保是单个实例) private CameraService ( ) { } //4. 公开静态属性,供外界使用(把第一步类的实例,开放出去) public static CameraService Instance{ get { return instance; } } //3. 确定供外界调用的代码资源 VPCamera Camera1= new VPCamera ( ) ; /// <summary> /// 打开相机 /// </summary> /// <param name="SerialNum"></param> /// <returns></returns> public bool OpenDevice ( string SerialNum) { Camera1. grabGrayImage+= GrabImage; Camera1. SerialNumber= SerialNum; if ( Camera1. OpenDevice ( ) ) { return true ; } else { return false ; } } /// <summary> /// 关闭设备 /// </summary> public void CloseDevice ( ) { Camera1. CloseDevice ( ) ; } /// <summary> /// 开始采集 /// </summary> public void StartGrab ( ) { } /// <summary> /// 停止采集 /// </summary> public void StopGrab ( ) { } /// <summary> /// 软触发一次 /// </summary> public void SnapImage ( ) { Camera1. SnapImage ( ) ; } /// <summary> /// 设置参数 /// </summary> public void SetCameraParamters ( ) { } /// <summary> /// 获取参数 /// </summary> public void GetCametaParamters ( ) { } /// <summary> /// 获取图像(图像回调) /// </summary> /// <param name="hImg"></param> public void GrabImage ( CogImage8Grey img) { var mainForm= Application. OpenForms. OfType < Form1> ( ) . FirstOrDefault ( ) ; mainForm. cogRecordDisplay1. Image= img; mainForm. cogRecordDisplay1. Fit ( true ) ; } } } 二 VPCamera 一 打开相机 /// <summary> /// 打开相机 /// </summary> /// <returns></returns> public bool OpenDevice ( ) { if ( frameGrabbers. Count> 0 ) { try { foreach ( ICogFrameGrabber camerain frameGrabbers) { if ( camera. SerialNumber== SerialNumber) { frameGrabber= camera; m_AcFifo= frameGrabber. CreateAcqFifo ( frameGrabber. AvailableVideoFormats[ 0 ] , CogAcqFifoPixelFormatConstants. Format8Grey, 0 , true ) ; } } } catch ( Exception ex) { MessageBox. Show ( $"初始化相机失败,信息为: { ex. Message } " ) ; return false ; } } return true ; } public class VPCamera { public void CloseDevice ( ) { //释放相机 CogFrameGrabbers FrameGrabbers= new CogFrameGrabbers ( ) ; foreach ( ICogFrameGrabber fgin FrameGrabbers) { fg. Disconnect ( false ) ; } } } using Cognex. VisionPro ; using Cognex. VisionPro. Display ; using System ; using System. Collections. Generic ; using System. Linq ; using System. Runtime. InteropServices ; using System. Text ; using System. Threading ; using System. Threading. Tasks ; using System. Windows. Forms ; using System. Windows. Media. Media3D ; namespace VP之相机调试2 { /// <summary> /// 传图委托(灰度图) /// </summary> /// <param name="GrayImg"></param> public delegate void GrabGrayImage ( CogImage8Grey GrayImg) ; /// <summary> /// 传图委托(彩色图) /// </summary> /// <param name="RGBImg"></param> public delegate void GrabRGBImage ( CogImage24PlanarColor RGBImg) ; public class VPCamera { /// <summary> /// 传灰度图事件 /// </summary> public event GrabGrayImage grabGrayImage; /// <summary> /// 传彩图事件 /// </summary> public event GrabRGBImage grabRGBImage; /// <summary> /// 相机枚举类,获取所有的相机 /// </summary> private CogFrameGrabbers frameGrabbers; // 相机对象 private ICogFrameGrabber frameGrabber; /// <summary> /// 采集对象 /// </summary> public ICogAcqFifo m_AcFifo{ get ; set ; } /// <summary> /// 相机序列号 /// </summary> public string SerialNumber{ get ; set ; } /// <summary> /// 构造器 /// </summary> public VPCamera ( ) { frameGrabbers= new CogFrameGrabbers ( ) ; } /// <summary> /// 打开相机 /// </summary> /// <returns></returns> public bool OpenDevice ( ) { if ( frameGrabbers. Count> 0 ) { try { foreach ( ICogFrameGrabber camerain frameGrabbers) { if ( camera. SerialNumber== SerialNumber) { frameGrabber= camera; m_AcFifo= frameGrabber. CreateAcqFifo ( frameGrabber. AvailableVideoFormats[ 0 ] , CogAcqFifoPixelFormatConstants. Format8Grey, 0 , true ) ; } } } catch ( Exception ex) { MessageBox. Show ( $"初始化相机失败,信息为: { ex. Message } " ) ; return false ; } } return true ; } public void SnapImage ( ) { try { // 获取采集状态 // 如果值 > 0,表示有图像堆积,可能需调整采集速率或处理速度。 // 当前 FIFO 中可立即读取的图像数量(已就绪的图像)。 // 布尔值,表示 FIFO 是否正在处理采集请求 true 时需等待,避免重复触发 m_AcFifo. GetFifoState ( out var numPending, out var numReady, out var busy) ; if ( numPending== 0 && ! busy) { // 软触发:作用:向 FIFO 发送软触发信号,开始一次图像采集(相当于手动触发相机拍照)。 m_AcFifo. StartAcquire ( ) ; // 等待采集完成,并返回采集到的图像 ICogImage cogImage= m_AcFifo. CompleteAcquireEx ( new CogAcqInfo ( ) ) ; grabGrayImage ( ( CogImage8Grey) cogImage) ; // grabRGBImage((CogImage24PlanarColor)cogImage); } } catch ( Exception ex) { MessageBox. Show ( $"采集异常,信息为: { ex. Message } " ) ; } } /// <summary> /// 关闭所有相机 /// </summary> public void CloseDevice ( ) { //释放相机 CogFrameGrabbers FrameGrabbers= new CogFrameGrabbers ( ) ; foreach ( ICogFrameGrabber fgin FrameGrabbers) { fg. Disconnect ( false ) ; } } } }