Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现动物分类(C#源码,UI界面版)
Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现动物分类(C#源码,UI界面版))
- 工业相机使用YoloV8模型实现动物分类
- 工业相机实现YoloV8模型实现动物分类的技术背景
- 在相机SDK中获取图像转换图像的代码分析
- 工业相机图像转换Bitmap图像格式和Mat图像重要核心代码
- 本地文件图像转换Bitmap图像格式和Mat图像重要核心代码
- Mat图像导入YoloV8模型重要核心代码
- 代码实现演示(实现动物分类)
- 源码下载链接
- 工业相机通过YoloV8模型实现动物分类的行业应用
工业相机使用YoloV8模型实现动物分类
本项目集成了 YOLOv8 表情检测模型 与 C#图形界面工具,实现了包括图片、文件夹、视频与摄像头等多种输入方式的动物分类功能。
工业相机RAW文件是一种记录了工业相机传感器的原始信息,同时记录了由相机拍摄所产生的一些原数据(Metadata,如ISO的设置、快门速度、光圈值、白平衡等)的文件。RAW是未经处理、也未经压缩的格式,可以把RAW概念化为“原始图像编码数据”。
工业相机Bitmap图像是一种无损的图像格式,它将图像存储为像素阵列,并可包含调色板信息。这种格式通常用于工业应用中,因为它能够保留图像的细节和质量,并且易于处理和分析。
本文以Baumer工业相机作为案例进行演示,实现将工业相机的图像或者本地图像导入Yolo模型从而实现动物分类等功能。
工业相机实现YoloV8模型实现动物分类的技术背景
本文通过C#中实现一个简单的UI界面,用于将YoloV8模型实现动物分类
用户可以通过该界面执行以下操作:
-
转换相机图像为Mat图像:通过YoloV8模型实现人物识别
-
转换本地图像为mat图像:通过YoloV8模型实现人物识别
通过这个UI界面,用户能够在实时应用机器视觉数据处理时快速有效地进行操作,无需深入了解图像数据的底层处理过程。这个简单的介绍旨在为开发人员提供一个明确的方向,以便开始构建此类应用程序,并且该程序主要用于演示目的。
在相机SDK中获取图像转换图像的代码分析
本文介绍使用Baumer工业相机,实现将图像转换为Bitmap图像,再转换Mat图像,导入到Yolo模型进行推理,输出人物识别的结果。
工业相机图像转换Bitmap图像格式和Mat图像重要核心代码
//将相机内部图像内存数据转为bitmap数据
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap((int)mBufferFilled.Width, (int)mBufferFilled.Height,(int)mBufferFilled.Width,System.Drawing.Imaging.PixelFormat.Format8bppIndexed, (IntPtr)((ulong)mBufferFilled.MemPtr + mBufferFilled.ImageOffset));#region//Mono图像数据转换。彩色图像数据转换于此不同
System.Drawing.Imaging.ColorPalette palette = bitmap.Palette;
int nColors = 256;
for (int ix = 0; ix < nColors; ix++)
{uint Alpha = 0xFF;uint Intensity = (uint)(ix * 0xFF / (nColors - 1));palette.Entries[ix] = System.Drawing.Color.FromArgb((int)Alpha, (int)Intensity,(int)Intensity, (int)Intensity);
}
bitmap.Palette = palette;
#endregionstring strtime = DateTime.Now.ToString("yyyyMMddhhmmssfff");
string saveimagepath = pImgFileDir + "\\" + strtime + ".brw";//使用Bitmap格式保存
bitmap.Save(saveimagepath, System.Drawing.Imaging.ImageFormat.Bmp); //用bitmap转换为mat
OpenCvSharp.Mat Matgray1 = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);
本地文件图像转换Bitmap图像格式和Mat图像重要核心代码
C#环境下代码如下所示:
if (imagePaths.Count() == 0)
{LoadImagePaths("test_img");
}string currentImagePath = imagePaths[currentImageIndex];// 显示到pictureBoxA
pictureBoxA.Image.Dispose(); // 释放上一张图片资源,避免内存泄漏
pictureBoxA.Image = new Bitmap(currentImagePath);
image_path = currentImagePath;currentImageIndex = (currentImageIndex + 1) % imagePaths.Count;OnNotifyShowRecieveMsg("检测中,请稍等……");
//textBox1.Text = "检测中,请稍等……";
//pictureBox2.Image = null;
Application.DoEvents();image = new Mat(image_path);float ratio = Math.Min(1.0f * inpHeight / image.Rows, 1.0f * inpWidth / image.Cols);
int neww = (int)(image.Cols * ratio);
int newh = (int)(image.Rows * ratio);Mat dstimg = new Mat();
Cv2.Resize(image, dstimg, new OpenCvSharp.Size(neww, newh));Cv2.CopyMakeBorder(dstimg, dstimg, 0, inpHeight - newh, 0, inpWidth - neww, BorderTypes.Constant);
Mat图像导入YoloV8模型重要核心代码
C#环境下代码如下所示:
if(ym.names == null)ym.LoadWeights(Application.StartupPath + "\\model\\yolov8l-cls.onnx", Application.StartupPath + "\\model\\labels.txt");if (imagePaths.Count() == 0)
{LoadImagePaths("test_img");
}string currentImagePath = imagePaths[currentImageIndex];// src = Cv2.ImRead("./test_img/cls_3.jpg");
//pictureBoxA.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(src);// 显示到pictureBoxA
pictureBoxA.Image.Dispose(); // 释放上一张图片资源,避免内存泄漏
pictureBoxA.Image = new Bitmap(currentImagePath);
image_path = currentImagePath;if (pictureBoxA.Image == null)
{return;
}
currentImageIndex = (currentImageIndex + 1) % imagePaths.Count;OnNotifyShowRecieveMsg("检测中,请稍等……");image = new Mat(image_path);//// 获取当前时间开始计时
dt1 = DateTime.Now;
Stopwatch sw = new Stopwatch();
sw.Start();
var result = ym.Inference(image);
sw.Stop();
this.Text = "耗时" + sw.Elapsed.TotalSeconds + "秒";var resultMat = ym.DrawImage(image, result);
//// 获取计算结束时间
dt2 = DateTime.Now;OnNotifyShowRecieveMsg("推理结果:" + result.Key);// 显示推理耗时时间
OnNotifyShowRecieveMsg("推理耗时:" + (dt2 - dt1).TotalMilliseconds + "ms");
//pictureBoxA.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(resultMat); //Mat转Bitmap
pictureBoxA.Image = new Bitmap(resultMat.ToMemoryStream());
public KeyValuePair<string, float> Inference(Mat image)
{//缩放图片max_image_length = image.Cols > image.Rows ? image.Cols : image.Rows;max_image = Mat.Zeros(new OpenCvSharp.Size(max_image_length, max_image_length), MatType.CV_8UC3);roi = new Rect(0, 0, image.Cols, image.Rows);image.CopyTo(new Mat(max_image, roi));//数据归一化处理BN_image = CvDnn.BlobFromImage(max_image, 1 / 255.0, new OpenCvSharp.Size(640, 640), new Scalar(0, 0, 0), true, false);//配置图片输入数据opencv_net.SetInput(BN_image);//模型推理,读取推理结果result_mat = opencv_net.Forward();//将推理结果转为float数据类型result_mat_to_float = new Mat(1, 1000, MatType.CV_32F, result_mat.Data);//将数据读取到数组中result_mat_to_float.GetArray<float>(out result_array);result_cls = result_pro.process_result(result_array);return result_cls;}在这里插入代码片
代码实现演示(实现动物分类)
源码下载链接
C# WinForms工业相机+本地图像 通过YoloV8模型实现动物分类 源码
工业相机通过YoloV8模型实现动物分类的行业应用
# | 行业场景 | 主要识别对象 | 工业相机配置 | YOLOv8 部署形态 & 价值 |
---|---|---|---|---|
1 | 奶牛/肉牛智慧牧场 | 奶牛、犊牛、公牛、病牛 | 4K 全局快门相机 + 红外补光 | Jetson Orin Nano 边缘盒,YOLOv8n-cls 剪枝到 2.6 MB,实时 50 FPS;自动计数、发情监测、疾病预警 |
2 | 生猪养殖 | 仔猪、育肥猪、母猪、公猪 | 球机 30× 变焦 + 防氨气护罩 | 相机 → x86 IPC + RTX A2000,YOLOv8s 多类别分类,料肉比降低 8 % |
3 | 海洋牧场/网箱养殖 | 大黄鱼、鲈鱼、鲑鱼、杂鱼 | 水下 1080p 工业相机 + 环形 LED | 树莓派 CM4 + Coral TPU,YOLOv8n 量化模型 120 ms/帧;鱼群密度、生长曲线自动统计 |
4 | 家禽(鸡/鸭/鹅)笼养 | 成鸡、雏鸡、公鸡、母鸡 | 顶装 6 mm 镜头 120 fps 相机 | 每列笼顶 1 台相机,YOLOv8 分类 + DeepSort 跟踪,死淘率降低 30 % |
5 | 野生动物保护 | 老虎、豹、羚羊、野猪 | 野外 4G 球机 + 太阳能供电 | 边缘 AI 盒子(RK3588),YOLOv8m 夜间红外模式,识别率 92 %,数据回传云平台 |
6 | 赛马/竞技动物 | 马匹个体 ID、姿态 | 2 k 高速相机(500 fps) | 相机 → FPGA 预处理 → GPU 服务器,YOLOv8 + 关键点模型,步态分析、伤病预警 |
7 | 食品加工厂(活禽接收) | 活鸡、死鸡、残次鸡 | IP67 彩色线阵相机 | 传送带上方 1 台相机,YOLOv8-cls 在线分选,替代 3 名人工质检员 |
8 | 动物园/水族馆客流分析 | 企鹅、海豚、熊猫、游客 | 全景 8 K 相机 + 枪机联动 | 服务器级 GPU,YOLOv8 同时识别动物和游客,生成热点区域热力图,用于场馆优化 |