Skip to content

OpenCV

约 616 字大约 2 分钟

opencv

2024-01-24

 private void Aa()
 {
     string[] files = Directory.GetFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "xue"));
     //string p = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "xue", "2.jpg");
     foreach (var item in files)
     {


         Mat src = new Mat(item, ImreadModes.AnyColor);
         //new Window("源", src, WindowFlags.KeepRatio);


         Mat Close = new Mat();
         Mat element = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(7, 7), new Point(-1, -1));
         Cv2.MorphologyEx(src, Close, MorphTypes.Close, element);
         //Window dstWin = new Window("开运算-去杂质", Close, WindowFlags.KeepRatio);


         Mat Gray = new Mat();
         Cv2.CvtColor(Close, Gray, ColorConversionCodes.RGB2GRAY);
         //new Window("灰度", Gray, WindowFlags.KeepRatio);



         //Mat Threthold = new Mat(src.Size(), MatType.CV_8UC3, Scalar.Red);
         //Cv2.Threshold(Gray, Threthold, 100, 255, ThresholdTypes.Binary);

         Mat Canny = new Mat();
         Cv2.Canny(Gray, Canny, 60, 200, 3, false);
         //Window ThretholdWin = new Window("二值", Canny, WindowFlags.KeepRatio);

         //圆形
         //CircleSegment[] circle;
         //circle = Cv2.HoughCircles(Gray, HoughModes.Gradient, 1, 30, 100, 30, 2, 200);
         //Scalar Colar = new Scalar(0, 255, 0);
         //Scalar Colar1 = new Scalar(0, 0, 255);
         //for (int i = 0; i < circle.Length; i++)
         //{

         //    int X = (int)circle[i].Center.X;
         //    int Y = (int)circle[i].Center.Y;
         //    int a = (int)circle[i].Radius;
         //    Cv2.Circle(src, X, Y, a, Colar, 2, LineTypes.Link8);//圆
         //    Cv2.Circle(src, X, Y, 2, Colar1, 2, LineTypes.Link8);//圆心
         //}
         //Window Win5 = new Window("圆", src, WindowFlags.KeepRatio);



         Mat edges = new Mat();
         Cv2.Canny(Close, edges, 50, 150);
         //new Window("边缘", edges, WindowFlags.KeepRatio);

         int count = 0;
         // 轮廓检测
         Point[][] contours;
         HierarchyIndex[] hierarchy;
         Cv2.FindContours(Canny, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);
         foreach (Point[] contour in contours)
         {
             Point2f[] contour2f = Array.ConvertAll<Point, Point2f>(contour, pt => new Point2f(pt.X, pt.Y));

             Point2f[] approx = Cv2.ApproxPolyDP(contour2f, Cv2.ArcLength(contour, true) * 0.05, true);  // 近似多边形
             if (approx.Length >= 1 && approx.Length <= 10)    // 判断近似多边形是否为几乎圆形
             {
                 count++;
                 Cv2.Polylines(Gray, new Point[][] { contour }, true, Scalar.Red, 2);
             }

         }
         Cv2.PutText(Gray, count.ToString(), new Point(100, 240), HersheyFonts.HersheyScriptSimplex, 5, Scalar.Red);
         // 显示结果
         new Window("Result", Gray, WindowFlags.Normal);
         //src.Dispose();
         //Close.Dispose();
         //Gray.Dispose();
         //edges.Dispose();
         Cv2.WaitKey(0);
     }
 }

去噪,找色块像素

 {

     //Aa();

     //return;


     //// RGB颜色值
     //int r = 93;
     //int g = 47;
     //int b = 139;
     //// 将RGB转换为HSV
     //Mat rgbImage = new Mat(1, 1, MatType.CV_8UC3, new Scalar(b, g, r));
     //Mat hsvImage1 = new Mat();
     //Cv2.CvtColor(rgbImage, hsvImage1, ColorConversionCodes.BGR2HSV);
     //// 获取HSV值
     //Scalar hsvColor = (Scalar)hsvImage1.Get<Vec3b>(0, 0);
     //Console.WriteLine(hsvColor[0] + "," + hsvColor[1] + "," + hsvColor[2]);


     string[] files = Directory.GetFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "2"));
     Stopwatch stopwatch = new Stopwatch();
     stopwatch.Start();
     int count = 0, nocount = 0;
     foreach (var item in files)
     {
         //string p = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tt.jpg");
         Stopwatch stopwatch1 = new Stopwatch();
         stopwatch1.Start();
         // 读取图片
         using (Mat srcImage = Cv2.ImRead(item))
         {
             var w1 = new Window("源", srcImage, WindowFlags.KeepRatio);

             // 紫色的HSV区间
             int hLow = 119; int hHigh = 190;
             int sLow = 87; int sHigh = 210;
             int vLow = 76; int vHigh = 254;


             using (Mat hsvImage = new Mat())
             {
                 Mat Close = new Mat();
                 Mat element = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(12, 12), new Point(-1, -1));
                 Cv2.MorphologyEx(srcImage, Close, MorphTypes.Close, element);
                 var w112 = new Window("去噪点", Close, WindowFlags.KeepRatio);

                 // 转换图片为HSV
                 Cv2.CvtColor(Close, hsvImage, ColorConversionCodes.BGR2HSV);

                 using (Mat targetImage = new Mat())
                 {
                     // 把在紫色区间的像素点全部转换为255,其他全部置为0
                     Cv2.InRange(hsvImage, new Scalar(hLow, sLow, vLow), new Scalar(hHigh, sHigh, vHigh), targetImage);
                     // 判断是否包含255的像素点
                     int countNonZeroPixels = Cv2.CountNonZero(targetImage);
                     Console.WriteLine(countNonZeroPixels);
                     var v2 = new Window("22", targetImage, WindowFlags.KeepRatio);
                     Cv2.WaitKey(0);
                     if (countNonZeroPixels != 0) count++;
                     else nocount++;
                 }
             }
         }
         stopwatch1.Stop();

     }
     stopwatch.Stop();

     //Console.WriteLine($"共{files.Length}张。{count}张有,{nocount}张无。 总耗时:" + stopwatch.ElapsedMilliseconds);
 }

![[Pasted image 20240125113801.png]]