
Baumer相机SDK开发_下载_封装
- [🎯 一、Baumer相机SDK开发一:相机图像显示软件](#🎯 一、Baumer相机SDK开发一:相机图像显示软件)
-
- [🎯 Baumer相机软件CameraExplorer官网下载](#🎯 Baumer相机软件CameraExplorer官网下载)
- [🎯 如何安装CameraExplorer软件](#🎯 如何安装CameraExplorer软件)
- [🎯 使用CameraExplorer软件](#🎯 使用CameraExplorer软件)
- [🎯 二、Baumer相机SDK开发二:SDK下载和Demo使用](#🎯 二、Baumer相机SDK开发二:SDK下载和Demo使用)
-
- [🎯 官方SDK代码中相机连接](#🎯 官方SDK代码中相机连接)
- [🎯 自己封装SDK中的相机连接代码](#🎯 自己封装SDK中的相机连接代码)
- [🎯 基于封装集成SDK的简单demo下载](#🎯 基于封装集成SDK的简单demo下载)

🎯 一、Baumer相机SDK开发一:相机图像显示软件
使用Baumer相机进行开发,首先需要下载Baumer工业相机的软件 ,它和basler相机的pylon软件基本相同,是用于相机评估和设置的图形用户界面(GUI)工具。
我们可以通过[堡盟软件下载Baumer-工业相机进行下载,也可以通过我们上传在CSDN或者百度网盘上的SDK包进行下载。
这里我们已经下载好Camera Explorer软件包放到CSDN里和百度网盘里
用户可以根据自己的情况进行下载,一般下载最新的版本即可。
✅CSDN下载:Baumer堡盟工业相机软件CameraExplorer-Windows-x64版本
✅百度网盘下载:Baumer堡盟工业相机软件CameraExplorer-Windows-x64版本
🎯 Baumer相机软件CameraExplorer官网下载
这里展示的是官方的下载方式
先来到Baumer官网,点击这个链接Baumer-工业相机
✅CSDN下载:Baumer堡盟工业相机软件CameraExplorer-Windows-x64版本
✅百度网盘下载:Baumer堡盟工业相机软件CameraExplorer-Windows-x64版本
第一步 :找到下面的堡盟Camera Explorer软件,点击"堡盟Camera Explorer"下载

第二步: 根据电脑系统,选择对应的软件包,在这里我们选择如下图所示版本。

.exe后缀为安装版本(尽量使用安装版本)
.zip后缀为免安装版本
X86适用于32位系统
X86-64适用于64位系
第三步: 选择软件版本后,会跳转到下载界面,需要录入信息,录入后会将下载链接发送到录入的邮箱中。

🎯 如何安装CameraExplorer软件



这里安装完软件,把手上的Baumer相机接到电脑上。
首先要做的肯定是配置一下相机的IP和网卡的IP等等之类的东西,不然你是连不上相机的
具体怎么设置IP见这里的博客:
Baumer堡盟工业相机GigE网口相机如何设置静态或者临时IP地址(使用CameraExplorer相机软件)
若是对相机的电源线如何连接和供电,可以参照下面的内容:

🎯 使用CameraExplorer软件

1、 进入相机/图像视图界面
在打开 Camera Explorer(64 bit)后,会出现如下图界面,首先点击"+"号按钮(左图箭头标记),弹出窗口后点击"Yes",配置成功后,相机图标左上角的状态图标会变为" √"



2、 打开相机界面

3、 打开相机相关参数菜单

选择左上角的Widgets选型,可以开启相机相关的参数设置功能界面,比如曝光增益、触发模式等等。

🎯 二、Baumer相机SDK开发二:SDK下载和Demo使用

我们可以通过堡盟软件下载进行下载,也可以通过我们上传在CSDN或者百度网盘上的SDK包进行下载。
✅CSDN下载:Baumer_neoAPI_SDK C++版本
✅CSDN下载:Baumer_neoAPI_SDK C# CSharp版本
✅百度网盘:Baumer_neoAPI_SDK全版本下载(下载最新版本)
🎯 官方SDK代码中相机连接
下载了SDK后,打开SDK文件夹,然后我们检查文件夹的官方的例子:
选到Baumer_neoAPI_1.5.0_win_x86_64_csharp\examples,
双击打开"neoapi_examples.sln"

这里我们只看其中的两个官方例子,一个是getting_started ,一个是opencv_cap,这能满足我们基本的图像采集需求。
下面是getting_started项目代码分析
csharp
// This example describes the FIRST STEPS of handling NeoAPI Python SDK.
// The given source code applies to handle one camera and image aquisition.
using System;
using NeoAPI;
namespace ConsoleApp
{
class Program
{
static int Main(string[] args)
{
int result = 0;
try
{
Cam camera = new Cam();
camera.Connect();
camera.f.ExposureTime.Value = 10000;
Image image = camera.GetImage();
image.Save("getting_started.bmp");
}
catch (System.Exception exc)
{
System.Console.WriteLine("error: {0}", exc.Message);
result = 1;
}
return result;
}
}
}
以上代码运行将设置相机曝光为10000,然后采集一张图像,并在原路径保存为getting_started.bmp的图片。
下面是opencv_cap项目代码分析,
这个例子描述了使用NeoAPI CSharp SDK的基本步骤;
csharp
/*
This example describes the FIRST STEPS of handling NeoAPI C# SDK.
The given source code applies to handle one camera and image acquisition
*/
using System;
using System.Collections.Generic;
using NeoAPI;
using OpenCvSharp;
namespace ConsoleApp
{
class Program
{
struct PFStruct
{
public int type;
public string target;
public double scale;
public PFStruct(int type, string target, double scale)
{
this.type = type;
this.target = target;
this.scale = scale;
}
};
static PFStruct GetMapping(string pf)
{
var map = new Dictionary<string, PFStruct>();
map.Add("Mono8", new PFStruct(MatType.CV_8UC1, "", 1.0 ));
map.Add("Mono8s", new PFStruct(MatType.CV_8SC1, "", 1.0 ));
map.Add("Mono10", new PFStruct(MatType.CV_16UC1, "", 64.0));
map.Add("Mono10Packed", new PFStruct(MatType.CV_16UC1, "Mono10", 64.0));
map.Add("Mono12", new PFStruct(MatType.CV_16UC1, "", 16.0));
map.Add("Mono12Packed", new PFStruct(MatType.CV_16UC1, "Mono12", 16.0));
map.Add("Mono16", new PFStruct(MatType.CV_16UC1, "", 1.0 ));
map.Add("BayerGR8", new PFStruct(MatType.CV_8UC1, "", 1.0 )); // "BGR8"
map.Add("BayerRG8", new PFStruct(MatType.CV_8UC1, "", 1.0 )); // "BGR8"
map.Add("BayerGB8", new PFStruct(MatType.CV_8UC1, "", 1.0 )); // "BGR8",
map.Add("BayerBG8", new PFStruct(MatType.CV_8UC1, "", 1.0 )); // "BGR8",
map.Add("BayerGR10", new PFStruct(MatType.CV_16UC1, "", 64.0)); // "BGR10"
map.Add("BayerRG10", new PFStruct(MatType.CV_16UC1, "", 64.0)); // "BGR10"
map.Add("BayerGB10", new PFStruct(MatType.CV_16UC1, "", 64.0)); // "BGR10"
map.Add("BayerBG10", new PFStruct(MatType.CV_16UC1, "", 64.0)); // "BGR10"
map.Add("BayerGR12", new PFStruct(MatType.CV_16UC1, "", 16.0)); // "BGR12"
map.Add("BayerRG12", new PFStruct(MatType.CV_16UC1, "", 16.0)); // "BGR12"
map.Add("BayerGB12", new PFStruct(MatType.CV_16UC1, "", 16.0)); // "BGR12"
map.Add("BayerBG12", new PFStruct(MatType.CV_16UC1, "", 16.0)); // "BGR12"
map.Add("RGB8", new PFStruct(MatType.CV_8UC3, "", 1.0 )); // "BGR8"
map.Add("BGR8", new PFStruct(MatType.CV_8UC3, "", 1.0 ));
map.Add("RGBa8", new PFStruct(MatType.CV_8UC4, "", 1.0 )); // "BGR8"
map.Add("BGRa8", new PFStruct(MatType.CV_8UC4, "", 1.0 )); // "BGR8"
map.Add("RGB10", new PFStruct(MatType.CV_16UC3, "", 64.0)); // "BGR10"
map.Add("BGR10", new PFStruct(MatType.CV_16UC3, "", 64.0));
map.Add("RGB12", new PFStruct(MatType.CV_16UC3, "", 16.0)); // "BGR12"
map.Add("BGR12", new PFStruct(MatType.CV_16UC3, "", 16.0));
map.Add("YUV411_8_UYYVYY", new PFStruct(MatType.CV_8UC3, "BGR8", 1.0 ));
map.Add("YUV422_8_UYVY", new PFStruct(MatType.CV_8UC3, "BGR8", 1.0 ));
map.Add("YUV8_UYV", new PFStruct(MatType.CV_8UC3, "BGR8", 1.0 ));
map.Add("RGB8_Planar", new PFStruct(MatType.CV_8UC3, "", 1.0 )); // "BGR8"
map.Add("RGB10_Planar", new PFStruct(MatType.CV_16UC3, "", 64.0)); // "BGR10"
map.Add("RGB12_Planar", new PFStruct(MatType.CV_16UC3, "", 16.0)); // "BGR10"
map.Add("RGB16_Planar", new PFStruct(MatType.CV_16UC3, "", 1.0 )); // "BGR10"
map.Add("Mono14", new PFStruct(MatType.CV_16UC1, "", 4.0 ));
map.Add("BayerGR10Packed", new PFStruct(MatType.CV_16UC1, "BayerGR10", 64.0));
map.Add("BayerRG10Packed", new PFStruct(MatType.CV_16UC1, "BayerRG10", 64.0));
map.Add("BayerGB10Packed", new PFStruct(MatType.CV_16UC1, "BayerGB10", 64.0));
map.Add("BayerBG10Packed", new PFStruct(MatType.CV_16UC1, "BayerBG10", 64.0));
map.Add("BayerGR12Packed", new PFStruct(MatType.CV_16UC1, "BayerGR12", 16.0));
map.Add("BayerRG12Packed", new PFStruct(MatType.CV_16UC1, "BayerRG12", 16.0));
map.Add("BayerGB12Packed", new PFStruct(MatType.CV_16UC1, "BayerGB12", 16.0));
map.Add("BayerBG12Packed", new PFStruct(MatType.CV_16UC1, "BayerBG12", 16.0));
map.Add("BayerGR16", new PFStruct(MatType.CV_16UC1, "", 1.0 ));
map.Add("BayerRG16", new PFStruct(MatType.CV_16UC1, "", 1.0 ));
map.Add("BayerGB16", new PFStruct(MatType.CV_16UC1, "", 1.0 ));
map.Add("BayerBG16", new PFStruct(MatType.CV_16UC1, "", 1.0 ));
map.Add("RGB16", new PFStruct(MatType.CV_16UC3, "", 1.0 )); // "BGR16"
map.Add("Mono10p", new PFStruct(MatType.CV_16UC1, "Mono10", 64.0));
map.Add("Mono12p", new PFStruct(MatType.CV_16UC1, "Mono12", 16.0));
map.Add("BGR12p", new PFStruct(MatType.CV_16UC3, "BGR16", 16.0));
map.Add("BGR14", new PFStruct(MatType.CV_16UC3, "BGR16", 4.0 ));
map.Add("BGR16", new PFStruct(MatType.CV_16UC3, "BGR16", 1.0 ));
map.Add("BayerBG10p", new PFStruct(MatType.CV_16UC1, "BayerBG10", 64.0));
map.Add("BayerBG12p", new PFStruct(MatType.CV_16UC1, "BayerBG12", 16.0));
map.Add("BayerGB10p", new PFStruct(MatType.CV_16UC1, "BayerGB10", 64.0));
map.Add("BayerGB12p", new PFStruct(MatType.CV_16UC1, "BayerGB12", 11.0));
map.Add("BayerGR10p", new PFStruct(MatType.CV_16UC1, "BayerGR10", 64.0));
map.Add("BayerGR12p", new PFStruct(MatType.CV_16UC1, "BayerGR12", 16.0));
map.Add("BayerRG10p", new PFStruct(MatType.CV_16UC1, "BayerRG10", 64.0));
map.Add("BayerRG12p", new PFStruct(MatType.CV_16UC1, "BayerRG12", 16.0));
map.Add("RGB12p", new PFStruct(MatType.CV_16UC3, "BGR12", 16.0));
map.Add("RGB14", new PFStruct(MatType.CV_16UC3, "", 4.0 ));
map.Add("R8", new PFStruct(MatType.CV_8UC1, "", 1.0 ));
map.Add("G8", new PFStruct(MatType.CV_8UC1, "", 1.0 ));
map.Add("B8", new PFStruct(MatType.CV_8UC1, "", 1.0 ));
map.Add("R10", new PFStruct(MatType.CV_16UC1, "", 64.0));
map.Add("R12", new PFStruct(MatType.CV_16UC1, "", 16.0));
map.Add("G10", new PFStruct(MatType.CV_16UC1, "", 64.0));
map.Add("G12", new PFStruct(MatType.CV_16UC1, "", 16.0));
map.Add("B10", new PFStruct(MatType.CV_16UC1, "", 64.0));
map.Add("B12", new PFStruct(MatType.CV_16UC1, "", 16.0));
map.Add("R12p", new PFStruct(MatType.CV_16UC1, "R12", 16.0));
map.Add("B12p", new PFStruct(MatType.CV_16UC1, "B12", 16.0));
map.Add("G12p", new PFStruct(MatType.CV_16UC1, "G12", 16.0));
map.Add("BaumerPolarized8", new PFStruct(MatType.CV_8UC1, "Mono8", 1.0 ));
map.Add("BaumerPolarized10", new PFStruct(MatType.CV_8UC1, "Mono8", 1.0 ));
map.Add("BaumerPolarized12", new PFStruct(MatType.CV_8UC1, "Mono8", 1.0 ));
map.Add("BaumerPolarized12p", new PFStruct(MatType.CV_8UC1, "Mono8", 1.0 ));
// aliases
map.Add("RGB8Packed", new PFStruct(MatType.CV_8UC3, "", 1.0 )); // "RGB8"
map.Add("BGR8Packed", new PFStruct(MatType.CV_8UC3, "", 1.0 )); // "BGR8"
map.Add("RGB10Packed", new PFStruct(MatType.CV_16UC3, "", 64.0)); // "RGB10"
map.Add("BGR10Packed", new PFStruct(MatType.CV_16UC3, "", 64.0)); // "BGR10"
map.Add("RGB12Packed", new PFStruct(MatType.CV_16UC3, "", 16.0)); // "RGB12"
map.Add("BGR12Packed", new PFStruct(MatType.CV_16UC3, "", 16.0)); // "BGR12"
map.Add("RGBA8Packed", new PFStruct(MatType.CV_8UC4, "", 1.0 )); // "RGBa8"
map.Add("BGRA8Packed", new PFStruct(MatType.CV_8UC4, "", 1.0 )); // "BGRa8"
map.Add("YUV411Packed", new PFStruct(MatType.CV_8UC3, "BGR8", 1.0 )); // "YUV411_8_UYYVYY"
map.Add("YUV422Packed", new PFStruct(MatType.CV_8UC3, "BGR8", 1.0 )); // "YUV422_8_UYVY"
map.Add("YUV444Packed", new PFStruct(MatType.CV_8UC3, "BGR8", 1.0 )); // "YUV8_UYV"
map.Add("YUV8", new PFStruct(MatType.CV_8UC3, "BGR8", 1.0 )); // "YUV8_UYV"
map.Add("Mono8Signed", new PFStruct(MatType.CV_8SC1, "", 1.0 )); // "Mono8s"
map.Add("RGB16Packed", new PFStruct(MatType.CV_16UC3, "", 1.0 )); // "RGB16"
map.Add("BGR16Packed", new PFStruct(MatType.CV_16UC3, "BGR16", 1.0 )); // "BGR16"
if (map.ContainsKey(pf) == true) {
return map[pf];
} else {
return new PFStruct(MatType.CV_8UC1, "", 1.0);
}
}
static int Main(string[] args)
{
int result = 0;
try
{
Cam camera = new Cam();
camera.Connect();
camera.f.ExposureTime.Value = 10000;
string pf = camera.f.PixelFormat.ValueString;
PFStruct data = GetMapping(pf);
bool save_image = true;
const string windowName = "Press [Esc] to quit.";
for (int count = 0; count < 200; ++count)
{
using (Image image = camera.GetImage())
{
Image image2;
IntPtr buf = image.ImageData;
if (data.target != "")
{
if (image.IsPixelFormatAvailable(data.target))
{
image2 = image.Convert(data.target);
buf = image2.ImageData;
} else
{
var ex = new System.Exception("unknown pixel format.");
throw ex;
}
}
var img = new Mat((int)image.Height, (int)image.Width, data.type, buf);
if (data.scale != 1.0)
{
img.ConvertTo(img, data.type, data.scale);
}
Cv2.NamedWindow(windowName, WindowMode.Normal);
Cv2.ImShow(windowName, img);
if (save_image)
{
save_image = false;
Cv2.ImWrite("opencv_csharp.bmp", img);
}
}
if (Cv2.WaitKey(1) == 27)
{
break;
}
}
Cv2.DestroyWindow(windowName);
}
catch (System.Exception exc)
{
System.Console.WriteLine("error: {0}", exc.Message);
result = 1;
}
return result;
}
}
}
以上代码运行将neoAPI sdk和opencv进行联合,实现相机连接,图像采集,并将图像转换为opencv的格式,然后连接采集200张图像,并使用opencv的窗口将采集的图像显示出来。

🎯 自己封装SDK中的相机连接代码
以上是官方的例程,仅仅是展示了相机的使用方式。下面是我封装的相机SDK类,内部已把图像装换成Halcon的图像格式HImage。添加到自己的项目中可以直接使用,其原理与以上介绍的第一个例程是完全一样的。
基于 Baumer 官方NeoAPI相机库,封装了相机所有基础操作功能:
包含相机枚举、按序列号连接相机、开启 / 停止采集、软触发指令发送、关闭相机、释放资源,以及曝光时间 / 图像分辨率 / 偏移量 / 触发模式 / 像素格式等相机参数配置。
同时实现了相机采集图像数据到 Halcon 的HImage格式的转换适配,供上层调用。
csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using NeoAPI;
using HalconDotNet;
namespace Baumer
{
class BaumerClass
{
List<CamInfo> allCameras = null;
// Baumer的Cam
Cam myCamera = null;
HImage image = null;
//构造函数
public BaumerClass()
{
}
/// <summary>
/// 连接相机,通过相机ID找到对应的相机并打开。返回-1为失败,0为成功
/// </summary>
public int connectCamera(string id)
{
// Baumer NeoAPI获取相机列表
allCameras = CamInfoList.Get();
allCameras.Refresh();
for (int i = 0; i < allCameras.Count; i++)
{
try
{
// 序列号
string camid = allCameras[i].SerialNumber;
if (camid == id)
{
//实例化Baumer相机类 并连接打开
myCamera = new Cam(allCameras[i]);
myCamera.Connect();
return 0;
}
continue;
}
catch
{
return -1;
}
}
return -1;
}
/// <summary>
/// 相机开始采集,返回-1为失败,0为成功
/// </summary>
public int startCamera()
{
try
{
// Baumer 开始采集图像流
myCamera.f.AcquisitionStart.Execute();
}
catch
{
return -1;
}
return 0;
}
/// <summary>
/// 停止相机采集,返回-1为失败,0为成功
/// </summary>
public int stopCamera()
{
try
{
// Baumer 停止采集图像流
myCamera.f.AcquisitionStop.Execute();
}
catch
{
return -1;
}
return 0;
}
/// <summary>
/// 关闭相机,返回-1为失败,0为成功
/// </summary>
public int closeCamera()
{
try
{
// Baumer 断开相机连接
myCamera.Disconnect();
}
catch
{
return -1;
}
return 0;
}
/// <summary>
/// 发送软触发命令
/// </summary>
public int softTrigger()
{
try
{
// Baumer 执行软触发,和你示例代码一致
myCamera.f.TriggerSoftware.Execute();
}
catch
{
return -1;
}
return 0;
}
/// <summary>
/// 读取相机buffer并转换成Halcon HImage格式的图像
/// </summary>
public HImage ReadBuffer()
{
if (myCamera == null)
{
return null;
}
try
{
// 替换:Baumer 获取图像帧,超时4000ms
Image baumerImage = myCamera.GetImage(4000);
image = new HImage();
using (baumerImage)
{
if (baumerImage.IsValid)
{
if (IsMonoData(baumerImage.PixelFormat))
{
//黑白图像-生成Halcon单通道图像
byte[] buffer = baumerImage.Data as byte[];
IntPtr p = Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0);
image.GenImage1("byte", baumerImage.Width, baumerImage.Height, p);
}
else
{
//彩色图像-转换为RGB8并生成Halcon彩色图像
byte[] buffer_rgb = new byte[baumerImage.Width * baumerImage.Height * 3];
baumerImage.CopyPixelData(buffer_rgb, PixelFormat.RGB8);
IntPtr p = Marshal.UnsafeAddrOfPinnedArrayElement(buffer_rgb, 0);
image.GenImageInterleaved(p, "rgb", baumerImage.Width, baumerImage.Height, 0, "byte", baumerImage.Width, baumerImage.Height, 0, 0, -1, 0);
}
return image;
}
else
{
return null;
}
}
}
catch
{
return null;
}
}
/// <summary>
/// 设置曝光时间us
/// </summary>
public int setExposureTime(long ExposureTimeNum)
{
try
{
// Baumer 设置曝光时间,和你示例代码一致的赋值方式
myCamera.f.ExposureTime.Value = ExposureTimeNum;
}
catch
{
return -1;
}
return 0;
}
/// <summary>
/// 设置图像格式,黑白相机的只能设置成黑白图像
/// 1:Mono8 2:彩色RGB8
/// </summary>
public int pixelFormat(uint pixelType)
{
try
{
if (pixelType == 1)
{
myCamera.f.PixelFormat.Value = PixelFormat.Mono8;
}
else if (pixelType == 2)
{
myCamera.f.PixelFormat.Value = PixelFormat.RGB8;
}
}
catch
{
return -1;
}
return 0;
}
/// <summary>
/// 设置图像高度,数值不要超过相机的分辨率
/// </summary>
public int setHeight(long height)
{
try
{
if (height > 0)
{
myCamera.f.Height.Value = height;
return 0;
}
else
return -1;
}
catch
{
return -1;
}
}
/// <summary>
/// 设置图像宽度,数值不要超过相机的分辨率
/// </summary>
public int setWidth(long width)
{
try
{
if (width > 0)
{
myCamera.f.Width.Value = width;
return 0;
}
else
return -1;
}
catch
{
return -1;
}
}
/// <summary>
/// 设置图像水平偏移
/// </summary>
public int setOffsetX(long offsetX)
{
try
{
myCamera.f.OffsetX.Value = offsetX;
return 0;
}
catch
{
return -1;
}
}
/// <summary>
/// 设置图像竖直偏移
/// </summary>
public int setOffsetY(long offsetY)
{
try
{
myCamera.f.OffsetY.Value = offsetY;
return 0;
}
catch
{
return -1;
}
}
/// <summary>
/// 设置触发模式开关
/// 1:为On 触发模式 0:Off 连续模式
/// </summary>
public int setTriggerMode(uint TriggerModeNum)
{
try
{
// Baumer 设置触发模式,和你示例代码一致
myCamera.f.TriggerMode.Value = TriggerModeNum == 1 ? TriggerMode.On : TriggerMode.Off;
return 0;
}
catch
{
return -1;
}
}
/// <summary>
/// 设置软触发源
/// </summary>
public int setSoftTrigger()
{
try
{
// Baumer 设置触发源为软件触发
myCamera.f.TriggerSource.Value = TriggerSource.Software;
return 0;
}
catch
{
return -1;
}
}
/// <summary>
/// 判断图像是否为黑白格式
/// </summary>
private Boolean IsMonoData(PixelFormat pixelFormat)
{
switch (pixelFormat)
{
case PixelFormat.Mono8:
case PixelFormat.Mono10:
case PixelFormat.Mono12:
case PixelFormat.Mono16:
return true;
default:
return false;
}
}
/// <summary>
/// 释放相机资源
/// </summary>
public void DestroyCamera()
{
if (myCamera != null)
{
try
{
myCamera.Disconnect();
myCamera.Dispose();
}
catch { }
myCamera = null;
}
}
}
}
下面的代码是调用的上面自己封装的类采集并处理图像的例子;
实现相机可视化操作的全部界面逻辑:
程序启动时自动枚举所有已连接的 Baumer 相机,
将相机序列号加载到下拉框,并默认连接第一个相机;
提供「采集图像」「图像处理」「保存图像」三个功能按钮,
点击采集按钮可调用底层封装类完成相机取流、图像获取并在 Halcon 控件窗口显示图像;
点击处理按钮可对采集到的图像执行阈值分割的视觉处理并显示处理结果;
窗体关闭时自动释放相机资源,防止相机占用异常。
csharp
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using HalconDotNet;
using NeoAPI;
namespace Baumer
{
public partial class BaumerSdk : Form
{
HWindow hWin;
HImage hImage;
// BaumerClass
BaumerClass camera;
public BaumerSdk()
{
InitializeComponent();
hWin = hWindowControl1.HalconWindow;//窗口句柄,使用窗口显示图像
hImage = new HImage();
// Baumer NeoAPI获取相机列表+刷新
List<CamInfo> allCameras = CamInfoList.Get();
allCameras.Refresh();
if (allCameras.Count == 0)
{
return;
}
// 遍历相机序列号添加到下拉框,和原逻辑一致
for (int i = 0; i < allCameras.Count; i++)
{
this.comboBox1.Items.Add(allCameras[i].SerialNumber);
}
// 实例化Baumer相机类 + 默认连接第一个相机
camera = new BaumerClass();
camera.connectCamera(allCameras[0].SerialNumber.ToString());
}
///采集图像
private void CaptureImage_Click(object sender, EventArgs e)
{
camera.startCamera();
hImage = camera.ReadBuffer();
hWin.DispImage(hImage);
camera.stopCamera();
}
///对图像处理
private void ProcessImage_Click(object sender, EventArgs e)
{
HOperatorSet.Threshold(hImage, out HObject ThreshRegion, 0, 50);
hWin.DispObj(ThreshRegion);
}
///保存图像
private void SaveImage_Click(object sender, EventArgs e)
{
if (hImage != null && !hImage.IsInitialized()) return;
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "BMP图像|*.bmp|PNG图像|*.png|JPG图像|*.jpg";
sfd.Title = "保存采集图像";
if (sfd.ShowDialog() == DialogResult.OK)
{
hImage.WriteImage(sfd.FilterIndex switch
{
1 => "bmp",
2 => "png",
3 => "jpeg",
_ => "bmp"
}, 0, sfd.FileName);
MessageBox.Show("图像保存成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
///程序关闭时释放相机,让其他程序能正常使用相机
private void BaumerSdk_FormClosing(object sender, FormClosingEventArgs e)
{
if (camera == null)
{
return;
}
camera.DestroyCamera();
}
}
}
🎯 基于封装集成SDK的简单demo下载
这里是直接整合集成了Baumer neoAPI sdk的C++版本和C#版本的Demo,有需要的可以直接下载参考使用。
✅CSDN下载:Baumer_neoAPI1_SDK C++版本 Demo
✅CSDN下载:Baumer_neoAPI_SDK C# CSharp版本Demo
✅百度网盘:Baumer_neoAPI_SDK全版本Demo下载
界面如下图所示:

