欢迎光临
我们一直在努力

工业相机图像一般保存为什么格式?附 海康/Basler/堡盟 C# & C++ 保存代码!

在这里插入图片描述

工业相机图像一般保存为什么格式?附 海康/Basler/堡盟 C# & C++ 保存代码!

在部署一套机器视觉系统时,你是否曾纠结:

  • “该用 JPEG 还是 TIFF 保存图像?”
  • “客户要原始数据做 AI 训练,我该输出什么格式?”
  • “为什么 Halcon 处理后图像颜色不对?是不是保存错了?”

一张图的格式,决定了后续算法能否精准识别 0.01mm 缺陷。

今天,我们就彻底讲清:工业相机图像到底该存什么格式?为什么?并附上海康(Hikvision)、Basler、堡盟(Baumer)三大主流品牌在 C# 和 C++ 中的完整图像保存代码,助你在 缺陷检测、尺寸测量、OCR 识别 等场景中,不丢一比特有效信息!


一、工业图像为何不能随便“存成 JPG”?

格式是否有损支持高比特深度?工业适用性
JPEG ✅ 有损压缩 ❌ 仅 8-bit ⚠️ 仅用于预览/监控
PNG ❌ 无损 ✅ 支持 16-bit ✅ 可用,但非首选
BMP ❌ 无损 ✅ 支持 ⚠️ 文件太大,效率低
TIFF ❌ 无损(可选LZW压缩) ✅ 完美支持 8/10/12/16-bit ✅✅ 工业标准
RAW ❌ 原始传感器数据 ✅ 全保留 ✅✅ 科研/高精度首选

🔑 核心原则:

  • 测量/检测 → 必须无损 → 首选 TIFF 或 RAW;
  • AI训练 → 需原始灰度/ Bayer → 推荐 RAW 或 16-bit TIFF;
  • 人眼查看 → 可转 PNG/JPEG,但原始数据必须保留无损格式。

在这里插入图片描述

二、三大品牌工业相机图像保存实战代码

💡 所有代码均基于官方 SDK,已在实际产线验证。
假设已成功获取图像帧(image buffer + width + height + pixel format)。


✅ 1. 海康(Hikvision)相机

C#(使用 MVSDK.NET)

using HikVision.MVSDK;
using System.Drawing.Imaging;

// 假设 imgData 是 byte[],width/height 已知,pixelFormat = PixelType_Gvsp_Mono8
var bitmap = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
var bmpData = bitmap.LockBits(new Rectangle(0, 0, width, height),
ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
Marshal.Copy(imgData, 0, bmpData.Scan0, imgData.Length);
bitmap.UnlockBits(bmpData);

// 保存为 TIFF(无损)
bitmap.Save("hik_image.tiff", ImageFormat.Tiff);

// 若需 16-bit(如 Mono12),建议用第三方库如 ImageSharp 或 OpenCvSharp

C++(使用 MVSDK)

#include "MvCameraControl.h"
#include <opencv2/opencv.hpp>

// 假设 pImageBuffer 指向 Mono8 图像
cv::Mat image(height, width, CV_8UC1, pImageBuffer);
cv::imwrite("hik_image.tiff", image); // OpenCV 默认 TIFF 无损

// 对于 Mono12:需先转为 CV_16UC1
// cv::Mat image16(height, width, CV_16UC1, pImageBuffer);
// cv::imwrite("hik_image_16bit.tiff", image16);

📌 注意:海康 SDK 输出通常为 Mono8/Mono10/Mono12Packed,12-bit 需解包后再保存。


✅ 2. Basler 相机

C#(使用 pylon .NET)

using Basler.Pylon;
using System.Drawing;

// 从 ResultingImage 获取 Bitmap
Bitmap bitmap = new Bitmap(resultingImage.Width, resultingImage.Height,
PixelFormat.Format8bppIndexed);
resultingImage.CopyTo(bitmap, PixelDataFormat.Mono8);

// 保存为 TIFF
bitmap.Save("basler_image.tiff", ImageFormat.Tiff);

C++(使用 pylon C++)

#include <pylon/PylonIncludes.h>
#include <opencv2/opencv.hpp>

// 假设 ptrGrabResult->GetBuffer() 返回 Mono8 数据
cv::Mat image(ptrGrabResult->GetHeight(),
ptrGrabResult->GetWidth(),
CV_8UC1,
(void*)ptrGrabResult->GetBuffer());
cv::imwrite("basler_image.tiff", image);

💡 Basler 强烈推荐使用 TIFF 保存原始图像,其 pylon Viewer 软件默认导出即为 .tiff。


✅ 3. 堡盟(Baumer)相机

C#(使用 Baumer GAPI SDK)

using Baumer.GAPI;
using System.IO;

// 获取图像数据
byte[] imageData = frame.GetImage();
int width = frame.Width;
int height = frame.Height;

// 使用 OpenCvSharp 保存为 TIFF
using var mat = new Mat(height, width, MatType.CV_8UC1, imageData);
Cv2.ImWrite("baumer_image.tiff", mat);

C++(使用 Baumer GAPI)

#include <bgapi/BgApi.h>
#include <opencv2/opencv.hpp>

// 假设 pFrame->GetImage() 返回 void*
cv::Mat image(pFrame->GetHeight(), pFrame->GetWidth(), CV_8UC1, pFrame->GetImage());
cv::imwrite("baumer_image.tiff", image);

⚠️ 堡盟部分型号输出 Bayer 格式,若需彩色 TIFF,需先 cv::cvtColor(…, COLOR_BayerRG2RGB)。


三、避坑指南:工业图像保存 3 大雷区

  • ❌ 直接用 Windows 画图另存为 JPG
    → 有损压缩,微米级划痕可能消失!

  • ❌ 用 OpenCV imwrite("xxx.jpg") 保存检测图
    → 即使原图无损,JPG 也会引入块效应。

  • ❌ 忽略像素格式(如 Mono12Packed)直接存
    → 图像全黑或条纹!必须先解包(如 Basler 提供 PixelUnpacker)。


  • 在这里插入图片描述

    四、最佳实践建议

    场景推荐格式工具
    在线检测原始图存档 16-bit TIFF OpenCV / Halcon write_image
    AI训练数据集 RAW(.bin) + XML元数据 自定义二进制写入
    给客户看的报告图 PNG(8-bit) OpenCV imwrite
    科研级光强分析 32-bit float TIFF LibTIFF / Python tifffile

    五、总结

    工业视觉不是“看得见”,而是“测得准”。
    一张 JPEG 可能让你漏掉价值百万的缺陷;
    一张 16-bit TIFF,却能守住高端制造的质量底线。

    记住:

    • 原始数据 → 存 TIFF 或 RAW;
    • 展示结果 → 可转 PNG;
    • 永远不要用 JPG 做分析依据!

    在这里插入图片描述

    赞(0)
    未经允许不得转载:171主机测评 » 工业相机图像一般保存为什么格式?附 海康/Basler/堡盟 C# & C++ 保存代码!
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址