首页 > 编程语言 >C# +Basler

C# +Basler

时间:2023-06-05 18:12:09浏览次数:23  
标签:C# Basler void grabResult 相机 camera StreamGrabber public

using Basler.Pylon;
using System;
using System.Drawing;
using System.Drawing.Imaging;
namespace CameraForms
{
public class baslerCamcs
{
//相机连接的个数
public int CameraNumber = CameraFinder.Enumerate().Count;

//委托+事件 = 回调函数,用于传递相机抓取的图像
public delegate void CameraImage(Bitmap bmp);
public event CameraImage CameraImageEvent;

//放出一个Camera
Camera camera;

//basler里用于将相机采集的图像转换成位图
PixelDataConverter pxConvert = new PixelDataConverter();

//控制相机采集图像的过程
bool GrabOver = false;


//相机初始化
public void CameraInit()
{
camera = new Camera();
//自由运行模式
camera.CameraOpened += Configuration.AcquireContinuous;

//断开连接事件
camera.ConnectionLost += Camera_ConnectionLost;

//抓取开始事件
camera.StreamGrabber.GrabStarted += StreamGrabber_GrabStarted;

//抓取图片事件
camera.StreamGrabber.ImageGrabbed += StreamGrabber_ImageGrabbed;

//结束抓取事件
camera.StreamGrabber.GrabStopped += StreamGrabber_GrabStopped;

//打开相机
camera.Open();
}
private void StreamGrabber_GrabStarted(object sender, EventArgs e)
{
GrabOver = true;
}
private void StreamGrabber_ImageGrabbed(object sender, ImageGrabbedEventArgs e)
{
IGrabResult grabResult = e.GrabResult;
if(grabResult.IsValid)
{
if (GrabOver)
CameraImageEvent(GrabResult2Bmp(grabResult));
}
}

private void StreamGrabber_GrabStopped(object sender, GrabStopEventArgs e)
{
GrabOver = false;
}

private void Camera_ConnectionLost(object sender, EventArgs e)
{
camera.StreamGrabber.Stop();
DestroyCamera();
}

public void OneShot()
{
if(camera != null)
{
camera.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.SingleFrame);
camera.StreamGrabber.Start(1,GrabStrategy.OneByOne, GrabLoop.ProvidedByStreamGrabber);
}
}

public void KeepShot()
{
if (camera != null)
{
camera.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.Continuous);
camera.StreamGrabber.Start(GrabStrategy.OneByOne, GrabLoop.ProvidedByStreamGrabber);
}
}

public void Stop()
{
if (camera != null)
{
camera.StreamGrabber.Stop();
}
}

//将相机抓取到的图像转换成Bitmap位图
Bitmap GrabResult2Bmp(IGrabResult grabResult)
{
Bitmap b = new Bitmap(grabResult.Width, grabResult.Height, PixelFormat.Format32bppRgb);
BitmapData bmpData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, b.PixelFormat);
pxConvert.OutputPixelFormat = PixelType.BGRA8packed;
IntPtr bmpIntpr = bmpData.Scan0;
pxConvert.Convert(bmpIntpr, bmpData.Stride * b.Height, grabResult);
b.UnlockBits(bmpData);
return b;
}

//释放相机
public void DestroyCamera()
{
if(camera !=null)
{
camera.Close();
camera.Dispose();
camera = null;
}
}
}
}

标签:C#,Basler,void,grabResult,相机,camera,StreamGrabber,public
From: https://www.cnblogs.com/xiedaxian/p/17458624.html

相关文章

  • 在DevExpress的GridView的列中,使用RepositoryItemSearchLookUpEdit控件实现产品列表信
    有时候,我们为了方便,我们往往使用扩展函数的代码方式创建很多GridView的操作功能,如在随笔《在DevExpress中使用BandedGridView表格实现多行表头的处理》中介绍过多行表头的创建及绑定处理,在《基于DevExpress的GridControl实现的一些界面处理功能》也介绍了一些特殊的展示效果,本篇随......
  • CF1838E - Count Supersequences
    先考虑正着做,我们只考虑整个\(b\)序列中出现的第一个子序列\(a\)。这样,我们就是要往\(a\)中插入\(m-n\)个数,其中\(a_{i-1}\)和\(a_i\)之间不能有\(a_i\)(否则就会有更靠前的子序列)。\(a_1\)前面不能有\(a_1\),\(a_n\)后面什么都可以有。我们发现,我们可以先枚举\(a......
  • C#异步编程2
                                  ......
  • asp.net MVC 数据的验证
                     join操作  ......
  • C#数据结构-红黑树实现
    参考网址: https://zhuanlan.zhihu.com/p/353948322二叉查找树,他对于大多数情况下的查找和插入在效率上来说是没有问题的,但是他在最差的情况下效率比较低。红黑树保证在最坏的情况下插入和查找效率都能保证在对数的时间复杂度内完成。红黑树的性质:性质1.节点是红色或黑色性质2.根是......
  • C#读写锁ReaderWriterLockSlim的使用
    读写锁的概念很简单,允许多个线程同时获取读锁,但同一时间只允许一个线程获得写锁,因此也称作共享-独占锁。在C#中,推荐使用ReaderWriterLockSlim类来完成读写锁的功能。某些场合下,对一个对象的读取次数远远大于修改次数,如果只是简单的用lock方式加锁,则会影响读取的效率。而如果采用读......
  • C++11中的std::function
    看看这段代码先来看看下面这两行代码:std::function<void(EventKeyboard::KeyCode,Event*)>onKeyPressed;std::function<void(EventKeyboard::KeyCode,Event*)>onKeyReleased;这两行代码是从Cocos2d-x中摘出来的,重点是这两行代码的定义啊。std::function这是什么东西?如果你对上......
  • ChatJPT:开创人机交互新纪元的技术突破
      人工智能技术的快速发展正在深刻改变着我们与机器之间的交互方式。ChatJPT作为一项创新的技术,为人机交互带来了全新的可能性。本文将探讨ChatJPT的技术原理、应用场景以及对未来社会的影响。ChatJPT的技术原理ChatJPT是基于GPT-3.5架构开发的大型语言模型,它具备深度学习和自......
  • 使用 TypeScript 探索面向对象编程
    在软件开发领域,面向对象编程(OOP)已成为创建复杂且可扩展应用程序的基本范例。支持OOP概念的最流行的编程语言之一是TypeScript。TypeScript是JavaScript的超集,它增加了静态类型和其他功能以增强代码的可维护性和可读性。在这篇博客中,我们将探讨TypeScript中面向对象编程......
  • Q370qC化学成分、Q370qC钢板力学性能、Q370qC钢板期货订轧
    一、Q370qC钢板简介:Q370qC属于桥梁用钢板,Q370qC钢板不仅有非常高的强度钢还有足够的韧性,多数应用在铆接及栓焊结构的公路桥及铁路桥梁结构等应用非常之广泛也是搭建桥梁的不可缺失的材料之一。Q370qC桥梁板执行标准为;GB/T714-2014.Q370qC钢板牌号表示:“Q”:表示钢的屈服强度的“屈”......