让代码更简单

Basler SDK pylon6使用C#采集图像实例

重要:本文最后更新于2020-08-19 08:27:19,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗

有人问到如何使用相机的SDK采集图像,其实这个问题相机的生产厂家已经给了答案,只是使用者不看别人的说明而已。由于我这里只有康耐视与巴斯勒的相机,就以巴斯勒的相机为例,给大家写个简单的例子。

按照Basler官方文档说明,康耐视CAM-CIC-5000系列的相机也能使用Basler SDK取图,但是据我实测,无法识别相机,最后采用Basler acg-2500相机完成这次测试。

首先去Basler官网下载SDK,就是那个pylon程序,里面集成了相机调试工具及SDK,自行安装。

然后使用pylon IP Configurator程序配置相机信息,主要是修改ip,使相机与电脑在同一局域网下。

Basler SDK pylon6使用C#采集图像实例

Basler SDK pylon6使用C#采集图像实例

设置好后,打开pylon Viewer程序,这是basler提供的相机调试工具,测试下相机是否正常,然后就可以开始进入VS开发了。

Basler SDK pylon6使用C#采集图像实例

Basler SDK pylon6使用C#采集图像实例

代码很简单,pylon Viewer提供的开发文档中有详细说明。

实例代码

采集效果如下:

Basler SDK pylon6使用C#采集图像实例

Basler SDK pylon6使用C#采集图像实例

添加Basler引用,复制安装目录pylon 6\Development\Assemblies\Basler.Pylon\x64路径下的Basler.Pylon.dll文件到你的项目debug目录下,并使用using Basler.Pylon;引用。

声明全局变量

List<ICameraInfo> allCameras;//存储所有相机
Camera mCamera;//相机对象

获取所有相机信息

allCameras = CameraFinder.Enumerate();

实例化相机对象

 mCamera = new Camera(allCameras[0]);

打开相机连接

 mCamera.Open();

注意:一旦打开相机连接,必须有关闭,否则相机将会连接不上,这种情况下等待几分钟后,连接对象会被系统回收,再次连接即可。

关闭相机

mCamera.Close();

取图

mCamera.StreamGrabber.Start();
IGrabResult grabResult = mCamera.StreamGrabber.RetrieveResult(5000, TimeoutHandling.ThrowException);
if (grabResult.GrabSucceeded)
{
//将图像数据转换为位图
Bitmap bitmap = new Bitmap(grabResult.Width, grabResult.Height, PixelFormat.Format32bppRgb);
BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
PixelDataConverter converter = new PixelDataConverter();
converter.OutputPixelFormat = PixelType.BGRA8packed;
IntPtr ptrBmp = bmpData.Scan0;
converter.Convert(ptrBmp, bmpData.Stride * bitmap.Height, grabResult);
bitmap.UnlockBits(bmpData);
//使用visionpro显示控件显示出来
cogRecordDisplay1.Image = new CogImage8Grey(bitmap);
}
else
{
Console.WriteLine("Error: {0} {1}", grabResult.ErrorCode, grabResult.ErrorDescription);
}
mCamera.StreamGrabber.Stop();

使用事件采集图像(推荐)

注册采集图像事件

mCamera.StreamGrabber.ImageGrabbed += OnImageGrabbed;

图像处理方法

 public void OnImageGrabbed(Object sender, ImageGrabbedEventArgs e)
{
Console.WriteLine("采集图像处理");
IGrabResult grabResult = e.GrabResult;

if (grabResult.GrabSucceeded)
{
//转换图像数据
Bitmap bitmap = new Bitmap(grabResult.Width, grabResult.Height, PixelFormat.Format32bppRgb);
BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
PixelDataConverter converter = new PixelDataConverter();
converter.OutputPixelFormat = PixelType.BGRA8packed;
IntPtr ptrBmp = bmpData.Scan0;
converter.Convert(ptrBmp, bmpData.Stride * bitmap.Height, grabResult);
bitmap.UnlockBits(bmpData);
//visionpro控件显示图像
cogRecordDisplay1.Image = new CogImage8Grey(bitmap);
}
else
{
Console.WriteLine("Error: {0} {1}", grabResult.ErrorCode, grabResult.ErrorDescription);
}
}

采集图像方法

mCamera.StreamGrabber.Start();
IGrabResult grabResult = mCamera.StreamGrabber.RetrieveResult(5000, TimeoutHandling.ThrowException);
mCamera.StreamGrabber.Stop();

感觉很棒!可以赞赏支持我哟~

14 打赏

评论 (3)

登录后评论
你这种的实时会有延迟么?我这边用同样的代码会有延迟
这个pylon程序和康耐视的visionpro有什么不一样的地方吗?有什么优缺点
这个是相机自带的SDK,相对于外部软件(比如Halcon,visionpro)来调用取像会稳定一些
QQ咨询 邮件咨询