利用OpenCvSharp进行图像相关操作

前言

程序设计过程,有时也需要对图像进行一些简单操作,C#没有现成的图像处理库,但有人对OpenCV进行了包装,我们可以很方便的使用OpenCvSharp对图像进行操作。当然了,这也需要使用的人员进行一些研究,但相对于C++版本,它已经非常友好了。

1、显示图像

代码:

private void button1_Click(object sender, EventArgs e)
        {
            //读取图像为灰度图
            panda = new Mat("1.jpg", ImreadModes.Color);

            //把Mat格式的图片转换成Bitmap
            Bitmap bitmap = BitmapConverter.ToBitmap(panda);

            //显示图片
            pictureBox2.Image = bitmap;
        }

效果:

2、绘制元素

代码:

 private void DrawObject()
        {
            //画圆方法
            Cv2.Circle(panda, new OpenCvSharp.Point(100, 100), 100, new Scalar(0, 69, 255), 5);  //以宽度画圆 不填充
            Cv2.Circle(panda, new OpenCvSharp.Point(300, 100), 100, new Scalar(0, 69, 255), -1); //当为负数的时候,进行画整圆 填充,C++用FILLED进行代替

            //画矩形
            Cv2.Rectangle(panda, new OpenCvSharp.Point(100, 260), new OpenCvSharp.Point(400, 400), new Scalar(141, 218, 86), 3);

            //画线
            Cv2.Line(panda, new OpenCvSharp.Point(200, 300), new OpenCvSharp.Point(350, 400), new Scalar(87, 176, 174), 3);

            //绘制文字
            Cv2.PutText(panda, "Please advise!", new OpenCvSharp.Point(200, 500), HersheyFonts.HersheyDuplex, 0.75, new Scalar(193, 242, 75));

            Random random = new Random();
            Vec3b vec = new Vec3b(255, 255, 255);
            for (int i = 0; i < 3000; i++)//30000个点
            {
                int row = random.Next(panda.Rows);
                int col = random.Next(panda.Cols);
                //char white = (char)255;
                panda.Set(row, col, vec);
            }
            //把Mat格式的图片转换成Bitmap
            Bitmap bitmap = BitmapConverter.ToBitmap(panda);

            //显示图片
            pictureBox2.Image = bitmap;
        }

效果:

3、图像数据操作

代码:

private void Test()
        {
            Console.WriteLine("开始生成图片:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff"));
            int imageWidth = 1024;
            int imageHeight = 128;
            ushort[] orginImgData = new ushort[imageHeight * imageWidth];
            string filename = "123.bmp";
            Random random = new Random();
            for (int i = 0; i < imageWidth; i++)
            {
                for (int j = 0; j < imageHeight; j++)
                {
                    orginImgData[i * imageHeight + j] = (ushort)random.Next(0, 65535);
                }
            }
            GenImage(imageWidth, imageHeight, orginImgData, filename);
        }

        private void GenImage(int imageWidth, int imageHeight, ushort[] orginImgData, string filename)
        {
            int row = (int)imageWidth;
            int col = (int)imageHeight;
            Mat picMat = new Mat(row, col, MatType.CV_16UC1);
            int r = 0;
            int c = 0;

            unsafe
            {
                for (r = 0; r < row; r++)
                {
                    IntPtr p = picMat.Ptr(r);
                    ushort* pp = (ushort*)p.ToPointer();
                    for (c = 0; c < col; c++)
                    {
                        // picMat.Set<ushort>(r,c, orginImgData[r * col + c]);
                        pp[c] = orginImgData[r * col + c];
                    }
                }

                Cv2.ImWrite(filename, picMat);
            }
            picMat.Dispose();
            Console.WriteLine("结束生成图片:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff"));
        }

效果:

4、操作摄像头

代码:

 Task.Run(() =>
            {
                //VideoCapture cap = new VideoCapture(1, VideoCaptureAPIs.DSHOW);
                VideoCapture cap = new VideoCapture(0, VideoCaptureAPIs.ANY);
              //  VideoCapture cap = new VideoCapture(path, VideoCaptureAPIs.ANY);
                Mat img = new Mat();

                while (true)
                {
                    cap.Read(img);
                    if (!img.Empty())
                    {
                        //把Mat格式的图片转换成Bitmap
                        Bitmap bitmap = BitmapConverter.ToBitmap(img);

                        //显示图片
                        pictureBox1.Image = bitmap;
                    }
                    else
                    {
                        Console.WriteLine("ERROR|NO IMG");
                        break;
                    }

                    Thread.Sleep(1);
                }
            });

效果:

5、播放电影

代码:

 Task.Run(() =>
            {
                string path = @"D:\狄仁杰之亢龙有悔.mkv";
                //VideoCapture cap = new VideoCapture(1, VideoCaptureAPIs.DSHOW);
                // VideoCapture cap = new VideoCapture(0, VideoCaptureAPIs.ANY);
                VideoCapture cap = new VideoCapture(path, VideoCaptureAPIs.ANY);
                Mat img = new Mat();

                while (true)
                {
                    cap.Read(img);
                    if (!img.Empty())
                    {
                        //Cv2.ImShow("Video", img);

                        //把Mat格式的图片转换成Bitmap
                        Bitmap bitmap = BitmapConverter.ToBitmap(img);

                        //显示图片
                        pictureBox1.Image = bitmap;
                    }
                    else
                    {
                        Console.WriteLine("ERROR|NO IMG");
                        break;
                    }

                    Thread.Sleep(1);
                }
            });

效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值