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();
            }
        }
    }
}

扫描二维码关注公众号,回复: 1070613 查看本文章





猜你喜欢

转载自blog.csdn.net/tuto7534/article/details/80187935
今日推荐