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

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.xdnf.cn/news/15743.html

相关文章:

  • 张 关于大语言模型(LLM)置信度研究的经典与前沿论文 :温度缩放;语义熵;自一致性;事实与反思;检索增强;黑盒引导;
  • 微服务学习(六)之分布式事务
  • 商业秘密的法律属性与保护路径探析
  • LeetCode 322. 零钱兑换 LeetCode 279.完全平方数 LeetCode 139.单词拆分 多重背包基础 56. 携带矿石资源
  • 【Docker基础】深入解析Docker-compose核心配置:Services服务配置详解
  • 【学习记录】智能客服小桃(进度更新ing)
  • Elastic Search 8.x 分片和常见性能优化
  • UniApp 自定义导航栏:解决安全区域适配问题的完整实践
  • 当OT遇见IT:Apache IoTDB如何用“时序空间一体化“破解工业物联网数据孤岛困局
  • 【黄山派-SF32LB52】—硬件原理图学习笔记
  • NLP中情感分析与观念分析、价值判断、意图识别的区别与联系,以及四者在实际应用中的协同
  • 疯狂星期四文案网第12天运营日报
  • 最少标记点问题:贪心算法解析
  • RabbitMQ面试精讲 Day 3:Exchange类型与路由策略详解
  • Astro:前端性能革命!从原生 HTML 到 Astro + React 的升级指南
  • Java机考题:815. 公交路线 图论BFS
  • 消息队列与信号量:System V 进程间通信的基础
  • P1816 忠诚 题解
  • Flutter基础(前端教程①④-data.map和assignAll和fromJson和toList)
  • 使用C#对象将WinRiver项目文件进行复杂的XML序列化和反序列化实例详解
  • 多模态交互视角下生成式人工智能在中小学探究式学习中的认知支架效能研究
  • 立创EDA中双层PCB叠层分析
  • 锂电池生产过程图解
  • 【OD机试】停车场收费
  • 暑假训练七
  • 【52】MFC入门到精通——(CComboBox)下拉框选项顺序与初始化不一致,默认显示项也不一致
  • Three.js与AIGC的化学反应:AI生成3D模型在实时渲染中的优化方案
  • Weavefox 图片 1 比 1 生成前端源代码
  • 基于Electron打包jar成Windows应用程序
  • LangGraph教程6:LangGraph工作流人机交互