Prise en main du logiciel Camera Explorer pour caméras Baumer
Pour développer avec les caméras industrielles Baumer, la première étape consiste à installer Camera Explorer, un outil d’interface graphique (GUI) dédié à l’évaluation, la configuration et le contrôle des caméras. Cet outil équivaut à pylon pour les caméras Basler.
Ce logiciel est disponible :
- Sur le site officiel de Baumer
- Via des liens tiers comme CSDN ou Baidu Wangpan, où des versions packagées sont mises à disposition
Téléchargement depuis le site officiel
- Accédez à la page Baumer - Industrial Cameras.
- Recherchez "Camera Explorer" dans la section logiciels.
- Sélectionnez la version adoptée à votre système :
.exe: version installable (recommandée).zip: version portable- x86 : système 32 bits
- x86-64 ou aarch64 : système 64 bits (Windows/Linux)
- Complétez le formulaire pour recevoir le lien de téléchargement par e-mail.
Installation et configuration initiale
Après installation, connectez physiquement la caméra à votre PC via Ethernet. Une configuration réseau préalable est nécessaire pour établir la communication.
Les caméras GigE nécessitent souvent un alignement d'adresses IP entre la caméra et la carte réseau. Camera Explorer intègre désormais un outil de configuration IP, mais pour les scénarios de gestion multiplexée, l’utilisation d’un outil dédié comme IPConfigTool reste plus efficace.
Cet utilitaire permet de modifier simultanément les adresses IP de plusieurs caméras. Il est disponible sur CSDN et Baidu Wangpan avec un manuel d'utilisation inclus.
Utilisation de Camera Explorer
- Découverte de la caméra : Lancez Camera Explorer, cliquez sur le bouton "+" pour détecter les caméras disponibles. Confirmez avec "Yes". Un symbole vert (√) indique une connexion réussie.
- Accès aux paramètres : Via l’onglet Widgets, activez les panneaux de contrôle pour ajuster l’exposition, le gain, le mode de déclenchement, etc.
- Visualisation en temps réel : L’interface affiche le flux vidéo dès que l’acquisition est lancée.
Intégration du SDK Baumer : neoAPI vs BGAPI
Baumer propose deux kits de développement principaux :
neoAPI SDK – Solution moderne et simplifiée
Conçu pour une intégration rapide, neoAPI offre une API claire et hautement abstraite, similaire à celle utilisée par Halcon. Il est idéal pour les projets nécessitant une mise en œuvre rapide.
Disponible en plusieurs langages :
- C++
- C# (.NET)
- Python
BGAPI SDK – Accès bas niveau conforme GenICam
Plus ancien mais toujours maintenu, BGAPI suit strictement la norme GenICam. Il convient aux applications exigeant un contrôle fin des paramètres ou pour la maintenance de systèmes existants.
Recommandation : Privilégiez neoAPI sauf besoin spécifique de manipulation GenICam ou compatibilité descendante.
Exemples de code avec neoAPI (C#)
Connexion de base et capture d'image
using System;
using NeoAPI;
class BasicCapture
{
static void Main()
{
try
{
var camera = new Cam();
camera.Connect();
camera.f.ExposureTime.Value = 10000; // 10 ms
using (var image = camera.GetImage())
{
image.Save("capture.bmp");
}
}
catch (Exception ex)
{
Console.WriteLine($"Erreur : {ex.Message}");
}
}
}
Intégration avec OpenCVSharp
L'exemple suivant montre comment convertir une image Baumer en format OpenCV (Mat) et l'affficher en continu :
using NeoAPI;
using OpenCvSharp;
static void DisplayStream()
{
var camera = new Cam();
camera.Connect();
camera.f.ExposureTime.Value = 10000;
string windowName = "Flux vidéo - Échap pour quitter";
Cv2.NamedWindow(windowName, WindowMode.AutoSize);
for (int i = 0; i < 200; i++)
{
using (var img = camera.GetImage())
{
var mat = ConvertToMat(img);
if (i == 0) Cv2.ImWrite("frame_initiale.bmp", mat); // Sauvegarde première image
Cv2.ImShow(windowName, mat);
if (Cv2.WaitKey(1) == 27) break; // Échap
}
}
Cv2.DestroyAllWindows();
}
static Mat ConvertToMat(Image baumerImg)
{
var pfMap = new Dictionary<string, (MatType type, string convertTo, double scale)>
{
["Mono8"] = (MatType.CV_8UC1, "", 1.0),
["RGB8"] = (MatType.CV_8UC3, "", 1.0),
["BayerRG8"] = (MatType.CV_8UC1, "", 1.0),
["Mono12Packed"] = (MatType.CV_16UC1, "Mono12", 16.0),
// ... autres formats
};
var (matType, targetFormat, scale) = pfMap.ContainsKey(baumerImg.PixelFormat)
? pfMap[baumerImg.PixelFormat]
: (MatType.CV_8UC1, "", 1.0);
Image processed = !string.IsNullOrEmpty(targetFormat) && baumerImg.IsPixelFormatAvailable(targetFormat)
? baumerImg.Convert(targetFormat)
: baumerImg;
var mat = new Mat((int)processed.Height, (int)processed.Width, matType, processed.ImageData);
if (Math.Abs(scale - 1.0) > 0.1)
mat.ConvertTo(mat, matType, scale);
return mat;
}
Encapsulation avancée : classe C# pour intégration Halcon
Pour faciliter l’intégration dans des pipelines de vision industrielle, voici une classe C# encapsulant les opérations courantes avec conversion vers HImage (HalconDotNet).
using NeoAPI;
using HalconDotNet;
using System.Runtime.InteropServices;
public class CameraBaumer
{
private Cam _camera;
private HImage _currentImage;
public bool ConnectBySerial(string serial)
{
var liste = CamInfoList.Get();
liste.Refresh();
var info = liste.FirstOrDefault(c => c.SerialNumber == serial);
if (info == null) return false;
_camera = new Cam(info);
_camera.Connect();
return true;
}
public HImage CaptureImage(int timeoutMs = 4000)
{
if (_camera == null) return null;
using (var img = _camera.GetImage(timeoutMs))
{
if (!img.IsValid) return null;
_currentImage?.Dispose();
_currentImage = new HImage();
if (EstMonochrome(img.PixelFormat))
{
var data = img.Data as byte[];
var ptr = Marshal.UnsafeAddrOfPinnedArrayElement(data, 0);
_currentImage.GenImage1("byte", img.Width, img.Height, ptr);
}
else
{
var rgbData = new byte[img.Width * img.Height * 3];
img.CopyPixelData(rgbData, PixelFormat.RGB8);
var ptr = Marshal.UnsafeAddrOfPinnedArrayElement(rgbData, 0);
_currentImage.GenImageInterleaved(ptr, "rgb", img.Width, img.Height, 0, "byte", 0, 0, -1, 0);
}
return _currentImage;
}
}
public void SetExposure(long microseconds) => _camera.f.ExposureTime.Value = microseconds;
public void SetTriggerMode(bool enable) => _camera.f.TriggerMode.Value = enable ? TriggerMode.On : TriggerMode.Off;
public void SetSoftwareTrigger() => _camera.f.TriggerSource.Value = TriggerSource.Software;
public void SendSoftwareTrigger() => _camera.f.TriggerSoftware.Execute();
public void StartAcquisition() => _camera.f.AcquisitionStart.Execute();
public void StopAcquisition() => _camera.f.AcquisitionStop.Execute();
public void Disconnect()
{
_camera?.Disconnect();
_camera?.Dispose();
_camera = null;
}
private bool EstMonochrome(string format)
{
return format.StartsWith("Mono") || format.Contains("Bayer");
}
}
Interface utilisateur Windows Forms avec Halcon
Voici un exemple de fenêtre WinForms qui :
- Détecte automatiquement les caméras Baumer au démarrage
- Permet de sélectionner une caméra par son numéro de série
- Propose des boutons pour capturer, traiter (seuillage) et sauvegarder l’image
- Libère proprement les ressources à la fermeture
public partial class MainForm : Form
{
private CameraBaumer _cam;
private HImage _image;
public MainForm()
{
InitializeComponent();
LoadCameras();
}
private void LoadCameras()
{
var cams = CamInfoList.Get();
cams.Refresh();
foreach (var c in cams)
comboBoxCameras.Items.Add(c.SerialNumber);
if (cams.Count > 0)
{
comboBoxCameras.SelectedIndex = 0;
_cam = new CameraBaumer();
_cam.ConnectBySerial(cams[0].SerialNumber);
}
}
private void btnCapture_Click(object sender, EventArgs e)
{
_image = _cam.CaptureImage();
if (_image != null)
hWindowControl1.HalconWindow.DispImage(_image);
}
private void btnProcess_Click(object sender, EventArgs e)
{
if (_image == null) return;
HOperatorSet.Threshold(_image, out HObject region, 0, 50);
hWindowControl1.HalconWindow.ClearWindow();
hWindowControl1.HalconWindow.DispObj(region);
}
private void btnSave_Click(object sender, EventArgs e)
{
if (_image == null) return;
using (var sfd = new SaveFileDialog { Filter = "BMP|*.bmp|PNG|*.png|JPG|*.jpg" })
{
if (sfd.ShowDialog() == DialogResult.OK)
{
string ext = System.IO.Path.GetExtension(sfd.FileName).ToLower();
string format = ext switch { ".png" => "png", ".jpg" => "jpeg", _ => "bmp" };
_image.WriteImage(format, 0, sfd.FileName);
MessageBox.Show("Image sauvegardée !");
}
}
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
_cam?.Disconnect();
}
}