前言
程序设计过程,有时也需要对图像进行一些简单操作,C#没有现成的图像处理库,但有人对OpenCV进行了包装,我们可以很方便的使用OpenCvSharp对图像进行操作。当然了,这也需要使用的人员进行一些研究,但相对于C++版本,它已经非常友好了。
1、显示图像
代码:
private void button1_Click(object sender, EventArgs e){//读取图像为灰度图panda = new Mat("1.jpg", ImreadModes.Color);//把Mat格式的图片转换成BitmapBitmap 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格式的图片转换成BitmapBitmap 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格式的图片转换成BitmapBitmap 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格式的图片转换成BitmapBitmap bitmap = BitmapConverter.ToBitmap(img);//显示图片pictureBox1.Image = bitmap;}else{Console.WriteLine("ERROR|NO IMG");break;}Thread.Sleep(1);}});
效果: