外观
OpenCV
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]]
