EmguCv3.4在实际工业应用----用于颜色检测,判定报警!
1.有很多需要颜色进行判定的,在普通灰图无法满足,在BGR或RGB中都不能很好判定。
2.HSV颜色空间(结构体)
由色调(Hue)、饱和度(Saturation)、亮度(Value)三个分量构成,HSV更接近于人眼的主观感受。我们可以通过下面的图来展示HSV颜色分布情况:
这个表很重要对我们常见颜色分析很重要。(借用网上图片)
实际要求及效果如下:(喇叭报警!!)
当显示红色或黄色时,开始报警提示需要测试炉温。,如变绿色停止报警!
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.Structure;
using System.IO;
using System.IO.Ports;
using Modbus_Poll_CS; //控制设备报警的类
using System.Threading;
namespace luwen1
{
public partial class luwen : Form
{
private SerialPort port;
private modbus bus1 = null;
private bool[] AMDY_OUT;
byte kp = 0;
public luwen()
{
InitializeComponent();
}
Emgu.CV.Image<Hsv, Byte> scr = null;//截图变成
private void timer1_Tick(object sender, EventArgs e)
{
Bitmap tu_jietu = new Bitmap(1600, 900);
Graphics g1 = Graphics.FromImage(tu_jietu);
g1.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(1600, 900)); //截图
// tu_jietu.Save("1.jpg");
scr = new Image<Hsv, byte>(tu_jietu);//生成HSV图片
int a = 0;
for (int i = 0; i < 100; i++)
{
Image<Hsv, byte> chu = scr.Copy(new Rectangle(830, 200 + i * 5, 20, 10));//不停抓取样空间
if ((chu.GetAverage().Hue == 0 || chu.GetAverage().Hue == 30) && chu.GetAverage().Satuation == 255) //满足颜色
{
a++;
}
}
if(a>0)
{
label1.Text = "当前状况:有线体需测炉温";
label1.BackColor = Color.Red;
bus1.write_shuzi((byte)1, 0, (byte)0, true);
}
if (a == 0)
{
label1.Text = "当前状况:正常";
label1.BackColor = Color.Green;
bus1.write_shuzi((byte)1, 0, (byte)0, false);
}
}
private void luwen_Load(object sender, EventArgs e) //串口初始化
{
AMDY_OUT = new bool[10] { false, false, false, false, false, false, false, false, false, false };
port = new SerialPort();
port.DataBits = 8;
port.Parity = Parity.None;
port.StopBits = StopBits.One;
port.PortName = "COM3";
port.BaudRate =9600;
if (port.IsOpen == false)
{
bus1 = new modbus();
bus1.sp = port;
port.Open();
}
timer1.Enabled = true;
}
private void luwen_FormClosing(object sender, FormClosingEventArgs e)
{
if (port.IsOpen == true)
{
port.Close();
}
}
}
}