|
@@ -0,0 +1,551 @@
|
|
|
+using OpenCvSharp;
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.ComponentModel;
|
|
|
+using System.Data;
|
|
|
+using System.Drawing;
|
|
|
+using System.Linq;
|
|
|
+using System.Text;
|
|
|
+using System.Threading.Tasks;
|
|
|
+using System.Windows.Forms;
|
|
|
+using Point = OpenCvSharp.Point;
|
|
|
+
|
|
|
+namespace OpenCVDemo
|
|
|
+{
|
|
|
+ public partial class Form1 : Form
|
|
|
+ {
|
|
|
+ public Form1()
|
|
|
+ {
|
|
|
+ InitializeComponent();
|
|
|
+ }
|
|
|
+ public string my_imagesource, my_imagesource2;
|
|
|
+ private Mat image1;
|
|
|
+ private Mat image2;
|
|
|
+ public int[,] myOPENCV_runlist = new int[20, 5];//运行步骤列表 与myOPENCV_value不同的是,运行步骤限定为20步,列的第一个元素存放运行函数下标
|
|
|
+ private void button1_Click(object sender, EventArgs e)
|
|
|
+ {
|
|
|
+
|
|
|
+ pictureBox1.Load(@"F:/20191204104138.jpg");
|
|
|
+ Mat image1 = new Mat(@"F:/20191204104138.jpg");
|
|
|
+ image2 = new Mat();
|
|
|
+ //// Mat src = new Mat(@"F:/rmb.png", ImreadModes.Color);
|
|
|
+ // Cv2.ImShow("src", src);
|
|
|
+ // #region
|
|
|
+ // //Mat rotateImage = new Mat(src.Rows, src.Cols, MatType.CV_8UC3);
|
|
|
+ // //rotateImage.SetTo(0);
|
|
|
+ // //Mat M= Cv2.GetRotationMatrix2D(new Point2f(300, 300), 30, 0.5);
|
|
|
+ // //Cv2.WarpAffine(src, rotateImage, M, src.Size(), InterpolationFlags.WarpInverseMap);//flags: 插值算法标识符,有默认值INTER_LINEAR
|
|
|
+ // //Cv2.ImShow("11", rotateImage);
|
|
|
+ // //Cv2.WaitKey();
|
|
|
+ // #endregion
|
|
|
+ // Mat gray = new Mat();
|
|
|
+ // Mat binary = new Mat();
|
|
|
+ // Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);
|
|
|
+ // Cv2.Threshold(gray, binary, 50, 255, ThresholdTypes.Binary);//转换为二值图像
|
|
|
+ // Cv2.ImShow("bin", binary);
|
|
|
+ // //Cv2.WaitKey();
|
|
|
+ // //建立轮廓接受数组
|
|
|
+ // Point[][] contours;
|
|
|
+ // HierarchyIndex[] hierarchy;
|
|
|
+ // Cv2.FindContours(binary, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxNone);
|
|
|
+ // //最小外接矩形接收数组
|
|
|
+ // RotatedRect[] rotateRect = new RotatedRect[contours.Length];
|
|
|
+ // Point[][] contours_poly = new Point[contours.Length][];
|
|
|
+ // for (int i = 0; i < contours.Length; i++)
|
|
|
+ // {
|
|
|
+ // contours_poly[i] = Cv2.ApproxPolyDP(contours[i], 30, true);//返回凸包,单线长大于30过滤
|
|
|
+
|
|
|
+ // rotateRect[i] = Cv2.MinAreaRect(contours_poly[i]);//最小外接矩形集合
|
|
|
+ // //}
|
|
|
+ // Console.WriteLine(rotateRect.Length);
|
|
|
+ // Point2f[] pot = new Point2f[4];//新建点集合接收点集合
|
|
|
+
|
|
|
+ // //for (int i = 0; i < rotateRect.Length; i++)
|
|
|
+ // //{
|
|
|
+ // float angle = rotateRect[i].Angle;//矩形角度
|
|
|
+ // pot = rotateRect[i].Points();//矩形的4个角
|
|
|
+ // double line1 = Math.Sqrt((pot[0].X - pot[1].X) * (pot[0].X - pot[1].X) + (pot[0].Y - pot[1].Y) * (pot[0].Y - pot[1].Y));
|
|
|
+ // double line2 = Math.Sqrt((pot[0].X - pot[3].X) * (pot[0].X - pot[3].X) + (pot[0].Y - pot[3].Y) * (pot[0].Y - pot[3].Y));
|
|
|
+ // if (line1 * line2 < 1000)//过滤,太小的矩形直接pass
|
|
|
+ // {
|
|
|
+ // continue;
|
|
|
+ // }
|
|
|
+ // if (line1 > line2)//依据实际情况进行判断
|
|
|
+ // {
|
|
|
+ // angle += 90;
|
|
|
+ // }
|
|
|
+
|
|
|
+ // Console.WriteLine(line1);
|
|
|
+ // Console.WriteLine(line2);
|
|
|
+ // Mat Roi = new Mat(src.Size(), MatType.CV_8UC3);
|
|
|
+ // Roi.SetTo(0);//全黑
|
|
|
+ // Cv2.DrawContours(binary, contours, -1, Scalar.White, -1);//在二值图像中圈出轮廓区域并染白
|
|
|
+ // Cv2.ImShow("bin", binary);
|
|
|
+ // src.CopyTo(Roi, binary);//将原图通过mask抠图到Roi
|
|
|
+ // Cv2.ImShow("Roi", Roi);
|
|
|
+ // Mat afterRotato = new Mat(src.Size(), MatType.CV_8UC3);
|
|
|
+ // afterRotato.SetTo(0);
|
|
|
+ // Point2f center = rotateRect[i].Center;
|
|
|
+ // Mat M = Cv2.GetRotationMatrix2D(center, angle, 1);//计算变换矩阵
|
|
|
+ // Cv2.WarpAffine(Roi, afterRotato, M, Roi.Size(), InterpolationFlags.Linear, BorderTypes.Constant);//得到变换后的图像,滤除其他信息
|
|
|
+ // Cv2.ImShow("旋转后", afterRotato);
|
|
|
+ // Mat bin2 = new Mat();
|
|
|
+ // Cv2.ImShow("after", afterRotato);
|
|
|
+ // Cv2.CvtColor(afterRotato, bin2, ColorConversionCodes.BGR2GRAY);
|
|
|
+ // Cv2.Threshold(bin2, bin2, 20, 255, ThresholdTypes.Binary);
|
|
|
+ // Point[][] con;
|
|
|
+ // HierarchyIndex[] temp;//接收矫正后的轮廓信息
|
|
|
+ // Cv2.FindContours(bin2, out con, out temp, RetrievalModes.External, ContourApproximationModes.ApproxNone);
|
|
|
+ // for (int j = 0; j < con.Length; j++)
|
|
|
+ // {
|
|
|
+ // Rect rect = Cv2.BoundingRect(con[j]);//直接使用矫正矩形,因为矫正后不需要再旋转
|
|
|
+ // if (rect.Height * rect.Width < 8000)//过滤干扰信息
|
|
|
+ // {
|
|
|
+ // continue;
|
|
|
+ // }
|
|
|
+ // Mat dstImg = new Mat(afterRotato, rect);
|
|
|
+ // //string name = "dst" + i;//主要看调试的时候有几个结果
|
|
|
+ // Cv2.ImShow("dst", dstImg);
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // Cv2.WaitKey();
|
|
|
+ }
|
|
|
+ private Mat myOPENCV_run(Mat image_in, Mat image_out)
|
|
|
+ {
|
|
|
+ image_out = image_in;
|
|
|
+ for (int i = 0; i < listBox2.Items.Count; i++)
|
|
|
+ {
|
|
|
+ switch ((myOPENCV)myOPENCV_runlist[i, 0])
|
|
|
+ {
|
|
|
+ case myOPENCV.cvt_color:
|
|
|
+ {
|
|
|
+ Cv2.CvtColor(image_out, image_out, (ColorConversionCodes)myOPENCV_runlist[i, 1], myOPENCV_runlist[i, 2]);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.boxfilter:
|
|
|
+ {
|
|
|
+ OpenCvSharp.Size size;
|
|
|
+ size.Width = myOPENCV_runlist[i, 2];
|
|
|
+ size.Height = myOPENCV_runlist[i, 3];
|
|
|
+ Cv2.BoxFilter(image_out, image_out, myOPENCV_runlist[i, 1], size);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.blur:
|
|
|
+ {
|
|
|
+ OpenCvSharp.Size size;
|
|
|
+ size.Width = myOPENCV_runlist[i, 1];
|
|
|
+ size.Height = myOPENCV_runlist[i, 2];
|
|
|
+ Cv2.Blur(image_out, image_out, size);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.gaussianblur:
|
|
|
+ {
|
|
|
+ OpenCvSharp.Size size;
|
|
|
+ double sigmaX, sigmaY;
|
|
|
+ size.Width = myOPENCV_runlist[i, 1];
|
|
|
+ size.Height = myOPENCV_runlist[i, 2];
|
|
|
+ sigmaX = (double)myOPENCV_runlist[i, 3];
|
|
|
+ sigmaY = (double)myOPENCV_runlist[i, 4];
|
|
|
+
|
|
|
+ Cv2.GaussianBlur(image_out, image_out, size, sigmaX, sigmaY);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.medianblur:
|
|
|
+ {
|
|
|
+ Cv2.MedianBlur(image_in, image_out, myOPENCV_runlist[i, 1]);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.bilateralfilter:
|
|
|
+ {
|
|
|
+ Mat image_out2 = new Mat();
|
|
|
+ double sigmaColor, sigmaSpace;
|
|
|
+ sigmaColor = (double)myOPENCV_runlist[i, 2] * 2;
|
|
|
+ sigmaSpace = (double)myOPENCV_runlist[i, 3] / 2;
|
|
|
+ Cv2.BilateralFilter(image_out, image_out2, myOPENCV_runlist[i, 1], sigmaColor, sigmaSpace);
|
|
|
+ image_out = image_out2;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.dilate:
|
|
|
+ {
|
|
|
+ Mat image_element = new Mat();
|
|
|
+ OpenCvSharp.Size size;
|
|
|
+ size.Width = myOPENCV_runlist[i, 2];
|
|
|
+ size.Height = myOPENCV_runlist[i, 3];
|
|
|
+ image_element = Cv2.GetStructuringElement((MorphShapes)myOPENCV_runlist[i, 1], size);
|
|
|
+ Cv2.Dilate(image_out, image_out, image_element);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.erode:
|
|
|
+ {
|
|
|
+ Mat image_element = new Mat();
|
|
|
+ OpenCvSharp.Size size;
|
|
|
+ size.Width = myOPENCV_runlist[i, 2];
|
|
|
+ size.Height = myOPENCV_runlist[i, 3];
|
|
|
+ image_element = Cv2.GetStructuringElement((MorphShapes)myOPENCV_runlist[i, 1], size);
|
|
|
+ Cv2.Erode(image_out, image_out, image_element);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.morphologyex:
|
|
|
+ {
|
|
|
+ Mat image_element = new Mat();
|
|
|
+ OpenCvSharp.Size size;
|
|
|
+ size.Width = myOPENCV_runlist[i, 3];
|
|
|
+ size.Height = myOPENCV_runlist[i, 4];
|
|
|
+ image_element = Cv2.GetStructuringElement((MorphShapes)myOPENCV_runlist[i, 2], size);
|
|
|
+ Cv2.MorphologyEx(image_out, image_out, (MorphTypes)myOPENCV_runlist[i, 1], image_element);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.floodfill:
|
|
|
+ {
|
|
|
+ OpenCvSharp.Point point;
|
|
|
+ point.X = myOPENCV_runlist[i, 1];
|
|
|
+ point.Y = myOPENCV_runlist[i, 2];
|
|
|
+ OpenCvSharp.Scalar scalar;
|
|
|
+ scalar = myOPENCV_runlist[i, 3];
|
|
|
+ Cv2.FloodFill(image_out, point, scalar);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.pyrup:
|
|
|
+ {
|
|
|
+ OpenCvSharp.Size size;
|
|
|
+ size.Width = image_out.Cols * 2;
|
|
|
+ size.Height = image_out.Rows * 2;
|
|
|
+ Cv2.PyrUp(image_out, image_out, size);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.pyrdown:
|
|
|
+ {
|
|
|
+ OpenCvSharp.Size size;
|
|
|
+ size.Width = image_out.Cols / 2;
|
|
|
+ size.Height = image_out.Rows / 2;
|
|
|
+ Cv2.PyrDown(image_out, image_out, size);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.resize:
|
|
|
+ {
|
|
|
+ OpenCvSharp.Size size;
|
|
|
+ InterpolationFlags interpolationFlags;
|
|
|
+ size.Width = image_out.Cols * myOPENCV_runlist[i, 1] / 10;
|
|
|
+ size.Height = image_out.Rows * myOPENCV_runlist[i, 2] / 10;
|
|
|
+ interpolationFlags = (InterpolationFlags)myOPENCV_runlist[i, 3];
|
|
|
+ Cv2.Resize(image_out, image_out, size, 0, 0, interpolationFlags);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.threshold:
|
|
|
+ {
|
|
|
+ Cv2.Threshold(image_out, image_out, myOPENCV_runlist[i, 1], myOPENCV_runlist[i, 2], (ThresholdTypes)myOPENCV_runlist[i, 3]);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.canny:
|
|
|
+ {
|
|
|
+ Mat image_out2 = new Mat();
|
|
|
+ Cv2.Canny(image_out, image_out2, myOPENCV_runlist[i, 1], myOPENCV_runlist[i, 2], myOPENCV_runlist[i, 3]);
|
|
|
+ image_out = image_out2;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.sobel:
|
|
|
+ {
|
|
|
+ Cv2.Sobel(image_out, image_out, -1, myOPENCV_runlist[i, 1], myOPENCV_runlist[i, 2], myOPENCV_runlist[i, 3]);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.laplacian:
|
|
|
+ {
|
|
|
+ myOPENCV_runlist[i, 1] = 0;
|
|
|
+ Cv2.Laplacian(image_out, image_out, 0, myOPENCV_runlist[i, 2], myOPENCV_runlist[i, 3]);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.scharr:
|
|
|
+ {
|
|
|
+ Cv2.Scharr(image_out, image_out, -1, myOPENCV_runlist[i, 1], myOPENCV_runlist[i, 2]);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.convertscaleabs:
|
|
|
+ {
|
|
|
+ double alpha, beta;
|
|
|
+ alpha = (double)myOPENCV_runlist[i, 1] / 10;
|
|
|
+ beta = (double)myOPENCV_runlist[i, 2] / 10;
|
|
|
+ Cv2.ConvertScaleAbs(image_out, image_out, alpha, beta);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.addweighted:
|
|
|
+ {
|
|
|
+ Mat image_in2 = new Mat(my_imagesource2);
|
|
|
+ double alpha, beta, gamma;
|
|
|
+ alpha = (double)myOPENCV_runlist[i, 1] / 10;
|
|
|
+ beta = (double)myOPENCV_runlist[i, 2] / 10;
|
|
|
+ gamma = (double)myOPENCV_runlist[i, 3] / 10;
|
|
|
+ Cv2.AddWeighted(image_out, alpha, image_in2, beta, gamma, image_out);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.houghlines:
|
|
|
+ {
|
|
|
+ Scalar scalar = new Scalar(0x00, 0xFF, 0x00);//绿色
|
|
|
+ LineSegmentPolar[] lines;
|
|
|
+ OpenCvSharp.Size size = new OpenCvSharp.Size(image_out.Width, image_out.Height);
|
|
|
+ Mat image_out3 = new Mat(size, MatType.CV_8UC3);
|
|
|
+ lines = Cv2.HoughLines(image_out, 1, Cv2.PI / 180, myOPENCV_runlist[i, 1]);
|
|
|
+ for (int ii = 0; ii < lines.Length; ii++)
|
|
|
+ {
|
|
|
+ //double rho, theta;
|
|
|
+ OpenCvSharp.Point pt1, pt2;
|
|
|
+ double a = Math.Cos(lines[ii].Theta), b = Math.Sin(lines[ii].Theta);
|
|
|
+ double x0 = a * lines[ii].Rho, y0 = b * lines[ii].Rho;
|
|
|
+ pt1.X = (int)Math.Round(x0 + 1000 * (-b));
|
|
|
+ pt1.Y = (int)Math.Round(y0 + 1000 * (a));
|
|
|
+ pt2.X = (int)Math.Round(x0 - 1000 * (-b));
|
|
|
+ pt2.Y = (int)Math.Round(y0 - 1000 * (a));
|
|
|
+ Cv2.Line(image_out3, pt1, pt2, scalar, 1, LineTypes.AntiAlias);
|
|
|
+ }
|
|
|
+ if (myOPENCV_runlist[i, 2] == 0)
|
|
|
+ {
|
|
|
+ Cv2.AddWeighted(image_out3, (double)myOPENCV_runlist[i, 3] / 10, image_in, (double)myOPENCV_runlist[i, 4] / 10, 0, image_out);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ image_out = image_out3;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.houghlinep:
|
|
|
+ {
|
|
|
+ Scalar scalar = new Scalar(0x00, 0xFF, 0x00);//绿色
|
|
|
+ LineSegmentPoint[] lines;
|
|
|
+ OpenCvSharp.Size size = new OpenCvSharp.Size(image_out.Width, image_out.Height);
|
|
|
+ Mat image_out3 = new Mat(size, MatType.CV_8UC3);
|
|
|
+ lines = Cv2.HoughLinesP(image_out, 1, Cv2.PI / 180, myOPENCV_runlist[i, 1], myOPENCV_runlist[i, 3], myOPENCV_runlist[i, 4]);
|
|
|
+ for (int ii = 0; ii < lines.Length; ii++)
|
|
|
+ {
|
|
|
+ OpenCvSharp.Point point1, point2;
|
|
|
+ point1.X = lines[i].P1.X;
|
|
|
+ point1.Y = lines[i].P1.Y;
|
|
|
+ point2.X = lines[i].P2.X;
|
|
|
+ point2.Y = lines[i].P2.Y;
|
|
|
+ Cv2.Line(image_out3, point1, point2, scalar, 1, LineTypes.AntiAlias);
|
|
|
+ }
|
|
|
+ if (myOPENCV_runlist[i, 2] == 0)
|
|
|
+ {
|
|
|
+ Cv2.AddWeighted(image_out3, 1, image_in, 0.8, 0, image_out);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ image_out = image_out3;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.houghcircles:
|
|
|
+ {
|
|
|
+ Scalar scalar = new Scalar(0x00, 0xFF, 0x00);//绿色
|
|
|
+ CircleSegment[] circles;
|
|
|
+ OpenCvSharp.Size size = new OpenCvSharp.Size(image_out.Width, image_out.Height);
|
|
|
+ Mat image_out3 = new Mat(size, MatType.CV_8UC3);
|
|
|
+ circles = Cv2.HoughCircles(image_out, HoughMethods.Gradient, 1, myOPENCV_runlist[i, 1], myOPENCV_runlist[i, 2], myOPENCV_runlist[i, 3], 0, myOPENCV_runlist[i, 4]);
|
|
|
+ for (int ii = 0; ii < circles.Length; ii++)
|
|
|
+ {
|
|
|
+ OpenCvSharp.Point center;
|
|
|
+ center.X = (int)Math.Round(circles[ii].Center.X);
|
|
|
+ center.Y = (int)Math.Round(circles[ii].Center.Y);
|
|
|
+ int radius = (int)Math.Round(circles[ii].Radius);
|
|
|
+ Cv2.Circle(image_out3, center.X, center.Y, radius, scalar);
|
|
|
+ Cv2.Circle(image_out3, center, radius, scalar);
|
|
|
+ }
|
|
|
+ Cv2.AddWeighted(image_out3, 1, image_in, 0.6, 0, image_out);
|
|
|
+
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.remap:
|
|
|
+ {
|
|
|
+ OpenCvSharp.Size size = new OpenCvSharp.Size(image_out.Width, image_out.Height);
|
|
|
+
|
|
|
+ Mat map_x = new Mat(size, MatType.CV_32FC1), map_y = new Mat(size, MatType.CV_32FC1);
|
|
|
+ for (int ii = 0; ii < image_out.Rows; ii++)
|
|
|
+ {
|
|
|
+ for (int jj = 0; jj < image_out.Cols; jj++)
|
|
|
+ {
|
|
|
+ if (myOPENCV_runlist[i, 1] == 0)
|
|
|
+ {
|
|
|
+ map_x.Set<float>(ii, jj, jj);//上下翻转
|
|
|
+ map_y.Set<float>(ii, jj, image_out.Rows - ii);//上下翻转
|
|
|
+ }
|
|
|
+ else if (myOPENCV_runlist[i, 1] == 1)
|
|
|
+ {
|
|
|
+ map_x.Set<float>(ii, jj, image_out.Cols - jj);//左右翻转
|
|
|
+ map_y.Set<float>(ii, jj, ii);//左右翻转
|
|
|
+ }
|
|
|
+ else if (myOPENCV_runlist[i, 1] == 2)
|
|
|
+ {
|
|
|
+ map_x.Set<float>(ii, jj, image_out.Cols - jj);//上下左右翻转
|
|
|
+ map_y.Set<float>(ii, jj, image_out.Rows - ii);//上下左右翻转
|
|
|
+ }
|
|
|
+ else if (myOPENCV_runlist[i, 1] == 3)
|
|
|
+ {
|
|
|
+ map_x.Set<float>(ii, jj, (float)myOPENCV_runlist[i, 2] / 10 * jj);//放大缩小
|
|
|
+ map_y.Set<float>(ii, jj, (float)myOPENCV_runlist[i, 2] / 10 * ii);//放大缩小
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Cv2.Remap(image_out, image_out, map_x, map_y);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.warpaffine:
|
|
|
+ {
|
|
|
+ if (0 == myOPENCV_runlist[i, 1])
|
|
|
+ {
|
|
|
+ Mat rot_mat = new Mat(2, 3, MatType.CV_32FC1);
|
|
|
+ OpenCvSharp.Point center = new OpenCvSharp.Point(image_out.Cols / 2, image_out.Rows / 2);
|
|
|
+ double angle = myOPENCV_runlist[i, 2];
|
|
|
+ double scale = (double)myOPENCV_runlist[i, 3] / 10;
|
|
|
+ ///// 通过上面的旋转细节信息求得旋转矩阵
|
|
|
+ rot_mat = Cv2.GetRotationMatrix2D(center, angle, scale);
|
|
|
+ ///// 旋转已扭曲图像
|
|
|
+ Cv2.WarpAffine(image_out, image_out, rot_mat, image_out.Size());
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Point2f[] srcTri = new Point2f[3];
|
|
|
+ Point2f[] dstTri = new Point2f[3];
|
|
|
+ Mat warp_mat = new Mat(2, 3, MatType.CV_32FC1);
|
|
|
+ Mat warp_dst;
|
|
|
+ warp_dst = Mat.Zeros(image_out.Rows, image_out.Cols, image_out.Type());
|
|
|
+ srcTri[0] = new Point2f(0, 0);
|
|
|
+ srcTri[1] = new Point2f(image_out.Cols, 0);
|
|
|
+ srcTri[2] = new Point2f(0, image_out.Rows);
|
|
|
+ dstTri[0] = new Point2f((float)(image_out.Cols * myOPENCV_runlist[i, 2] / 100), (float)(image_out.Rows * myOPENCV_runlist[i, 2] / 100));
|
|
|
+ dstTri[1] = new Point2f((float)(image_out.Cols * (1 - (float)myOPENCV_runlist[i, 3] / 100)), (float)(image_out.Rows * myOPENCV_runlist[i, 3] / 100));
|
|
|
+ dstTri[2] = new Point2f((float)(image_out.Cols * myOPENCV_runlist[i, 4] / 100), (float)(image_out.Rows * (1 - (float)myOPENCV_runlist[i, 4] / 100)));
|
|
|
+ warp_mat = Cv2.GetAffineTransform(srcTri, dstTri);
|
|
|
+ Cv2.WarpAffine(image_out, image_out, warp_mat, image_out.Size());
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.equalizehist:
|
|
|
+ {
|
|
|
+ Cv2.EqualizeHist(image_out, image_out);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case myOPENCV.facedetection:
|
|
|
+ {
|
|
|
+ if (0 == myOPENCV_runlist[i, 1])
|
|
|
+ {
|
|
|
+ var haarCascade = new CascadeClassifier(@"haarcascade_frontalface_alt.xml");
|
|
|
+ Mat haarResult = DetectFace(image_out, haarCascade);
|
|
|
+ image_out = haarResult;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ var lbpCascade = new CascadeClassifier(@"lbpcascade_frontalface.xml");
|
|
|
+ Mat lbpResult = DetectFace(image_out, lbpCascade);
|
|
|
+ image_out = lbpResult;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ default: break;
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ return image_out;
|
|
|
+ }
|
|
|
+ private void pictureBox1_Click(object sender, EventArgs e)
|
|
|
+ {
|
|
|
+
|
|
|
+ }/// <summary>
|
|
|
+ ///
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="cascade"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ private Mat DetectFace(Mat src, CascadeClassifier cascade)
|
|
|
+ {
|
|
|
+ Mat result;
|
|
|
+ using (var gray = new Mat())
|
|
|
+ {
|
|
|
+ result = src.Clone();
|
|
|
+ Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);
|
|
|
+
|
|
|
+ // Detect faces
|
|
|
+ Rect[] faces = cascade.DetectMultiScale(
|
|
|
+ gray, 1.08, 2, HaarDetectionType.ScaleImage, new OpenCvSharp.Size(30, 30));
|
|
|
+
|
|
|
+ // Render all detected faces
|
|
|
+ foreach (Rect face in faces)
|
|
|
+ {
|
|
|
+ var center = new OpenCvSharp.Point
|
|
|
+ {
|
|
|
+ X = (int)(face.X + face.Width * 0.5),
|
|
|
+ Y = (int)(face.Y + face.Height * 0.5)
|
|
|
+ };
|
|
|
+ var axes = new OpenCvSharp.Size
|
|
|
+ {
|
|
|
+ Width = (int)(face.Width * 0.5),
|
|
|
+ Height = (int)(face.Height * 0.5)
|
|
|
+ };
|
|
|
+ Cv2.Ellipse(result, center, axes, 0, 0, 360, new Scalar(255, 0, 255), 4);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ public enum myOPENCV //方法排排坐写这里面一一对应一个下标
|
|
|
+ {
|
|
|
+ cvt_color = 0,
|
|
|
+ boxfilter,
|
|
|
+ blur,
|
|
|
+ gaussianblur,
|
|
|
+ medianblur,
|
|
|
+ bilateralfilter,
|
|
|
+ dilate,
|
|
|
+ erode,
|
|
|
+ morphologyex,
|
|
|
+ floodfill,
|
|
|
+ pyrup,
|
|
|
+ pyrdown,
|
|
|
+ resize,
|
|
|
+ threshold,
|
|
|
+ canny,
|
|
|
+ sobel,
|
|
|
+ laplacian,
|
|
|
+ scharr,
|
|
|
+ convertscaleabs,
|
|
|
+ addweighted,
|
|
|
+ houghlines,
|
|
|
+ houghlinep,
|
|
|
+ houghcircles,
|
|
|
+ remap,
|
|
|
+ warpaffine,
|
|
|
+ equalizehist,
|
|
|
+ facedetection,
|
|
|
+ findcontours,
|
|
|
+ drawcontours,
|
|
|
+ convexhull,
|
|
|
+ boundingrect,
|
|
|
+ minarearect,
|
|
|
+ minenclosingcircle,
|
|
|
+ fillellipse,
|
|
|
+ approxpolydp,
|
|
|
+ moments,
|
|
|
+ contourarea,
|
|
|
+ arclength,
|
|
|
+ watershed,
|
|
|
+ inpaint,
|
|
|
+ calchist,
|
|
|
+ minmaxloc,
|
|
|
+ comparehist,
|
|
|
+ calcbackproject,
|
|
|
+ matchtemplate,
|
|
|
+ cornerharris,
|
|
|
+ goodfeaturestotrack,
|
|
|
+ cornersubpix,
|
|
|
+ drawkeypoints,
|
|
|
+ drawmatches,
|
|
|
+ ORB,
|
|
|
+
|
|
|
+
|
|
|
+ number //用于统计总数
|
|
|
+ };
|
|
|
+ }
|
|
|
+}
|