前言
最近领导在做库房工具管理这块的功能,希望能集成OpenCV 粗略的计算出工具的长度,以方便用户再归还工具的时候,提示用户该放在那种尺寸的盒子里面,这便是这篇文章的由来。
我们的系统是基于.net开发的,所以采用的是 Emgu.CV这个框架来开发相应的功能,首先我们来看看效果吧,如下图。在这里我们的高宽、面积、直径都是计算的像素值,实际情况中我们需要根据自己的相片尺寸和拍照背景板与摄像头的距离,得出比例尺,根据比例尺大概计算出物体的实际面积和长度。

实现思路
我们业务中不需要太高的精度,所以采用一些简单的调用OpenCV 函数就能实现,注意本文的背景采用的是A4纸白色背景,如果背景不同,二值化的过程中需要你自己调节对应的参数。
- 对照片进行灰度和二值处理
- 去除照片中的阴影
- 描绘物体的轮廓、和外接圆,就可以得出面积和物体长度
代码(主要逻辑代码,关于页面的代码需要自己采用 winform设计)
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string imagePath = string.Empty;
string result_path = string.Empty;
/// <summary>
/// 上传图片
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button_up_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
imagePath = openFileDialog.FileName; //得到文件全路径名
// 使用Image.FromFile方法加载图片
System.Drawing.Image image = System.Drawing.Image.FromFile(imagePath);
// 设置PictureBox的图片
src.Image = image;
// (可选)设置PictureBox的大小以适应图片
src.SizeMode = PictureBoxSizeMode.StretchImage;
// AreaCalculate(imagePath);
BinaryTreatment(imagePath);
}
}
private void button_calculate_Click(object sender, EventArgs e)
{
AreaCalculate(result_path);
}
/// <summary>
/// 去除图片阴影
/// </summary>
/// <param name="path"></param>
private string RemoveShadow(string path)
{
// 加载图像
Mat image = CvInvoke.Imread(path, ImreadModes.Color);
// 将图像转换为灰度图像
Mat grayImage = new Mat();
CvInvoke

本文介绍了如何在.NET系统中集成OpenCV,通过简单的图像处理技术,如灰度处理、二值化和轮廓分析,计算出工具的大致长度,以便于库房工具的归还管理。作者分享了关键代码段和实现思路,适用于初学者了解OpenCV在实际项目中的应用。
最低0.47元/天 解锁文章
9225

被折叠的 条评论
为什么被折叠?



