当前位置: 首页 > news >正文

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模型实现动物分类

用户可以通过该界面执行以下操作:

  1. 转换相机图像为Mat图像:通过YoloV8模型实现人物识别

  2. 转换本地图像为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 同时识别动物和游客,生成热点区域热力图,用于场馆优化
http://www.lryc.cn/news/593343.html

相关文章:

  • Selenium 中 findElement 方法全解析:定位网页元素的 7 种方式
  • RPC(Remote Procedure Call,远程过程调用)介绍
  • 探秘边缘安全架构设计要点解析
  • 深入了解 find_element 方法:Web 自动化定位元素的核心​
  • Node.js特训专栏-实战进阶:17.会话管理与安全存储
  • 开发框架安全ThinkPHPLaravelSpringBootStruts2SpringCloud复现
  • SLAM中的非线性优化-2D图优化之激光SLAM基于优化的前端匹配(十八)
  • KVM中使用桥接模式.运维就业技术教程
  • 零基础学习性能测试-linux服务器监控:CPU监控
  • 【RK3576】【Android14】USB开发调试
  • 《Spring Boot 插件化架构实战:从 SPI 到热插拔的三级跳》
  • Android14 SystemUI 启动流程(2)
  • Verilog *2* SPI-立创逻辑派G1测试-1
  • 软件警告弹窗与兼容性问题
  • 当OT遇见IT:Apache IoTDB如何用“时序空间一体化“破解工业物联网数据孤岛困局
  • FMEA-CP-PFD三位一体数字化闭环:汽车部件质量管控的速效引擎
  • XSS漏洞----基于Dom的xss
  • 动态规划算法的欢乐密码(三):简单多状态DP问题(上)
  • GA-BP遗传算法优化BP神经网络数据生成,采用SVM分类模型评估
  • RabbitMQ面试精讲 Day 3:Exchange类型与路由策略详解
  • PostgreSQL常用命令与工具指南
  • 发明专利怎么写,与学术文章异同点与注意事项
  • 从0开始学习R语言--Day51--PH检验
  • HAMR硬盘高温写入的可靠性问题
  • 数字图像处理(三:图像如果当作矩阵,那加减乘除处理了矩阵,那图像咋变):从LED冬奥会、奥运会及春晚等等大屏,到手机小屏,快来挖一挖里面都有什么
  • 我用Cursor,1周上线了一个虚拟资料流量主小程序技术选型
  • 图解系统-小林coding笔记
  • view和pure的区别
  • 电脑windows系统深度维护指南
  • Validation - Spring Boot项目中参数检验的利器