每周一赞

C#:用鼠标获取图片上某一点的颜色HSV值

2023-12-11  本文已影响0人  大龙10

一、像素

二、程序

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private Image image = null;
        private Mat dst = new Mat();
        private Mat src_img;
        string filePath = "";
        bool mouseDown = false;
        public OpenCvSharp.Point p1 = new OpenCvSharp.Point(-1, -1);

        #region  定义一个发送接收图像数据的全局变量SendPicData
        public Mat SendPicData
        {
            get { return BitmapConverter.ToMat((Bitmap)pictureBox1.Image); }
            set { pictureBox1.Image = value.ToBitmap(); }
        }
        #endregion

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Title = "选择操作的图片";
            openFileDialog.Filter = "图片 *.jpg|*.jpg|*.bmp|*.bmp|图像*.png|*.png";
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                filePath = openFileDialog.FileName;
                image = Image.FromFile(filePath);
                src_img = Cv2.ImRead(filePath);
            }
            if (filePath != "")
            {
                pictureBox1.Image = image;
                textBox1.Text = src_img.Rows.ToString();
                textBox2.Text = src_img.Cols.ToString();
             }
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            mouseDown = true;
            if (mouseDown)
            {
                p1.X = e.X;
                p1.Y = e.Y;
                textBox3.Text =  "(" + e.X.ToString() + " , " + e.Y.ToString() + ")";
             }
        }

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            mouseDown = false;
            Mat hsv_image = new Mat(); ;
            Cv2.CvtColor(src_img, hsv_image, ColorConversionCodes.BGR2HSV);

            Mat[] channel = Cv2.Split(hsv_image);//分割通道
            int hv = channel[0].At<byte>(p1.Y, p1.X);
            int sv = channel[1].At<byte>(p1.Y, p1.X);
            int vv = channel[2].At<byte>(p1.Y, p1.X);

            textBox4.Text = "(" + hv.ToString() + " , " + sv.ToString() + " , " + vv.ToString() + ")";

            int blue = src_img.At<Vec3b>(p1.Y, p1.X)[0];         //#坐标(x,y)上的像素的B通道的值
            int green = src_img.At<Vec3b>(p1.Y, p1.X)[1];     // #坐标(x,y)上的像素的G通道的值
            int red = src_img.At< Vec3b > (p1.Y, p1.X)[2];    // #坐标(x,y)上的像素的R通道的值
            textBox5.Text = "(" + blue.ToString() + " , " + green.ToString() + " , " + red.ToString() + ")";
        }
    }
}

三、结果

四、资料

c1learning的博客
https://blog.csdn.net/c1learning/article/details/100130805
上一篇 下一篇

猜你喜欢

热点阅读