/// <summary> /// 车牌 /// </summary> /// <param name="matPlate"></param> /// <returns></returns> public static PlateCar TestCar(Mat matPlate) { float[] hogcar = GetHogCar(matPlate); Mat matTest = new Mat(1, hogcar.Length, MatType.CV_32FC1); for (int i = 0; i < hogcar.Length; i++) { matTest.Set <float>(0, i, hogcar[i]); } PlateCar result = (PlateCar)((int)svm.Predict(matTest)); return(result); }
/// <summary> /// 颜色法 筛选 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void tbtnlFilter_Click(object sender, EventArgs e) { if (this.srcImg == null) { return; } if (this.srcImg.Empty()) { return; } rectList.Clear(); PicMatrois.Clear(); tsColorChangeText_TextChanged(sender, e); int minWidth = int.Parse(this.txtMinWidth.Text); int minHeight = int.Parse(this.txtMinHeight.Text); int maxWidth = int.Parse(this.txtMaxWidth.Text); int maxHeight = int.Parse(this.txtMaxHeight.Text); float WhScale = float.Parse(this.txtWHScale.Text); this.panSegmentList.Controls.Clear(); this.panChars.Controls.Clear(); // rects 集合 foreach (var item in this.rectList) { if ( item.Width >= minWidth && item.Width <= maxWidth && item.Height >= minHeight && item.Height <= maxHeight && item.Width / item.Height > 0.8 && item.Width / item.Height < WhScale ) { //SubMat 对矩形区域进行截取 Mat matRoi = this.srcImg.SubMat(item); PlateCar plateCar = Plate_Car_SVM.TestCar(matRoi); if (PlateCar.车牌 == plateCar) { PicMatrois.Add(matRoi); } this.GenerateROI(matRoi, this.panSegmentList); } } }
//车牌训练 private void Car_svm_Click(object sender, EventArgs e) { if (this.samplePath == "") { return; } List <PlateCarInfo> plateSamples = new List <PlateCarInfo>(); string[] subDirectories = Directory.GetDirectories(this.samplePath); for (int index = 0; index < subDirectories.Length; index++) { string subDirectory = subDirectories[index]; string shortDirectory = subDirectory.Substring(subDirectory.LastIndexOf(@"\") + 1); PlateCar categorycar = (PlateCar)Enum.Parse(typeof(PlateCar), shortDirectory); string[] fileNames = Directory.GetFiles(subDirectory, "*.jpg"); for (int i = 0; i < fileNames.Length; i++) { string fileName = fileNames[i]; this.txtinfo.AppendText(string.Format("{0} 类型:{1}\r\n", fileName, categorycar)); Mat matPlate = Cv2.ImRead(fileName); PlateCarInfo plateCarInfo = new PlateCarInfo(); plateCarInfo.PlateMatCar = matPlate; plateCarInfo.CategoryCar = categorycar; plateSamples.Add(plateCarInfo); } } //将样本的元数据转化为SVM的样品数据和标签数据 Mat trainData = new Mat(); Mat trainLabel = new Mat(plateSamples.Count, 1, MatType.CV_32SC1); for (int index = 0; index < plateSamples.Count; index++) { PlateCarInfo plateCarInfo = plateSamples[index]; float[] hog = Plate_Car_SVM.GetHogCar(plateCarInfo.PlateMatCar); if (index == 0) { trainData = Mat.Zeros(plateSamples.Count, hog.Length, MatType.CV_32FC1); } for (int colIndex = 0; colIndex < hog.Length; colIndex++) { trainData.Set <float>(index, colIndex, hog[colIndex]); } trainLabel.Set <int>(index, 0, (int)plateCarInfo.CategoryCar); this.txtinfo.AppendText(hog.Length.ToString() + "\r\n"); } Plate_Car_SVM.Train(trainData, trainLabel); this.txtinfo.AppendText("训练已完成\r\n"); }
//图片处理 private void ProImg() { int FsIndex = 0; string imagePath = @"C:\test-imgs"; if (!Directory.Exists(imagePath)) { MessageBox.Show("图片测试文件夹路径需为:C: test-imgs"); return; } string[] subDirecotries = Directory.GetDirectories(imagePath); DirectoryInfo di = new DirectoryInfo(imagePath); if (subDirecotries.Length == 0) { FileInfo[] FileList = di.GetFiles(); ArrayList FAL = new ArrayList(); //筛选图片 foreach (FileInfo Files in FileList) { String FilesName = (Files.Name).ToUpper(); if (FilesName.EndsWith(".JPG") || FilesName.EndsWith(".PNG") || FilesName.EndsWith(".BMP")) { FAL.Add(Files); } } //清空数组 Array.Clear(FileList, 0, FileList.Length); //重新赋值 FileList = (FileInfo[])(FAL.ToArray(typeof(FileInfo))); //根据文件名排序 Array.Sort(FileList, new FileNameSort()); //把文件名存进数组 for (int i = 0; i < FileList.Length; i++) { fileNames.Add(FileList[i].FullName); } //--------------获取图片处理所需的参数和阈值---------------------- //加载Datatable数据表 LoadDT(); //模糊 int blurSize = int.Parse(this.blurSize.Text); // 边缘 int cannyThreshold1 = int.Parse(this.canny1.Text); int cannyThreshold2 = int.Parse(this.canny2.Text); // 膨胀的 element int ksizex = int.Parse(this.txDaliteX.Text); int ksizey = int.Parse(this.txDaliteY.Text); int minWidth = int.Parse(this.txtMinWidth.Text); int minHeight = int.Parse(this.txtMinHeight.Text); int maxWidth = int.Parse(this.txtMaxWidth.Text); int maxHeight = int.Parse(this.txtMaxHeight.Text); float WhScale = float.Parse(this.txtWHScale.Text); for (int index = 0; index < fileNames.Count; index++) { dtMatANDRect.Clear(); //清空PicMatrois图片结果集 PicMatrois = new List <Mat>(); //rectList.Clear(); int MatIndex = 0; FileNameAndMat.Clear(); string fileName = fileNames[index]; //调用识别方法 // 读取原图 this.srcImg = Cv2.ImRead(fileName); // 归一化 if (srcImg.Cols > 2000) { Cv2.Resize(srcImg, srcImg, new OpenCvSharp.Size(srcImg.Cols * 0.3, srcImg.Rows * 0.3)); } //原图变化 this.picSrc.Image = this.srcImg.ToBitmap(); //获取HSV均衡图 this.HSVEvenimg = my_Method.ColorMethod(this.srcImg, blurSize, cannyThreshold1, cannyThreshold2, this.HSVEvenimg); // 膨胀的 element Mat element = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(ksizex, ksizey)); // 定义点的二维数组,颜色法筛选开始 if (this.srcImg == null) { return; } if (this.srcImg.Empty()) { return; } Point[][] contours = null; HierarchyIndex[] hierarchies = null; contours = my_Method.ColorRange(element, contours, hierarchies, this.srcImg, this.HSVEvenimg, 3); for (int i = 0; i < contours.Length; i++) { // 轮廓的最小矩形 Rect rect = Cv2.BoundingRect(contours[i]); if (rect.Width >= minWidth && rect.Width <= maxWidth && rect.Height >= minHeight && rect.Height <= maxHeight && rect.Width / rect.Height > 0.8 && rect.Width / rect.Height < WhScale ) { Mat matRoi = this.srcImg.SubMat(rect); PlateCar plateCar = Plate_Car_SVM.TestCar(matRoi); if (PlateCar.车牌 == plateCar) { MatIndex++; FileNameAndMat.Add(MatIndex, matRoi); Console.WriteLine(dtMatANDRect.Columns.Count); dtMatANDRect.Rows.Add(MatIndex, rect.X, rect.Y); } } } //判断颜色法是否筛选出符合要求的车牌,如果有添加进集合,结束筛选,开始下张图片 if (MatIndex != 0) { DataView dv = dtMatANDRect.DefaultView; dv.Sort = "X ASC"; //dtMatANDRect.Clear(); dtMatANDRect = dv.ToTable(); for (int i = 0; i < dtMatANDRect.Rows.Count; i++) { int Mindex = int.Parse(dtMatANDRect.Rows[i]["MatIndex"].ToString()); Console.WriteLine(dtMatANDRect.Rows[i]["X"]); if (FileNameAndMat.ContainsKey(Mindex)) { Mat resMat; FileNameAndMat.TryGetValue(Mindex, out resMat); PicMatrois.Add(resMat); } } } //如果没,调用Sobel法 else { //调用Sobel法 this.SobelMethod(); if (this.srcImg == null) { return; } if (this.srcImg.Empty()) { return; } //找轮廓 Point[][] contours_sobel = null; HierarchyIndex[] hierarchyIndex = null; Cv2.FindContours(threshold_Erode, out contours_sobel, out hierarchyIndex, RetrievalModes.External, ContourApproximationModes.ApproxSimple); // Sobel法筛选。对轮廓求最小外接矩形,然后验证,不满足条件的淘汰。 this.panSegment_Sobel.Controls.Clear(); int minWidth_sobel = int.Parse(this.txtMInWidth_sobel.Text); int minHeight_sobel = int.Parse(this.txtMInHeight_sobel.Text); int maxWidth_sobel = int.Parse(this.txtMaxWidth_sobel.Text); int maxHeight_sobel = int.Parse(this.txtMaxHeight_sobel.Text); float WhScale_sobel = float.Parse(this.txtWHScale_sobel.Text); //List<Mat> SobelMat = new List<Mat>(); for (int i = 0; i < contours_sobel.Length; i++) { Rect rect = Cv2.BoundingRect(contours_sobel[i]); if (rect.Width >= minWidth_sobel && rect.Width <= maxWidth_sobel && rect.Height >= minHeight_sobel && rect.Height <= maxHeight_sobel && rect.Width / rect.Height >= 0.8 && rect.Width / rect.Height <= WhScale_sobel) { Mat matROI = this.srcImg.SubMat(rect); PlateCar plateCar = Plate_Car_SVM.TestCar(matROI); if (PlateCar.车牌 == plateCar) { MatIndex++; FileNameAndMat.Add(MatIndex, matROI); dtMatANDRect.Rows.Add(MatIndex, rect.X, rect.Y); } } } if (MatIndex != 0) { DataView dv = dtMatANDRect.DefaultView; dv.Sort = "X ASC"; //dtMatANDRect.Clear(); dtMatANDRect = dv.ToTable(); for (int i = 0; i < dtMatANDRect.Rows.Count; i++) { int Mindex = int.Parse(dtMatANDRect.Rows[i]["MatIndex"].ToString()); if (FileNameAndMat.ContainsKey(Mindex)) { Mat resMat; FileNameAndMat.TryGetValue(Mindex, out resMat); PicMatrois.Add(resMat); } } } } // 图片名称 和 得到的矩形存在Map中 FileNameAndResult.Add(fileNames[index], PicMatrois); } //当一张图片有多张车牌时用于判断 String FileName = null; foreach (KeyValuePair <String, List <Mat> > fvr in FileNameAndResult) { string fileName = fvr.Key; List <Mat> listChar = fvr.Value; string shortFileName = fileName.Substring(fileName.LastIndexOf(@"\") + 1); foreach (Mat value in listChar) { String res = this.CharsSplit(value); //Console.WriteLine(this.CharsSplit(value)); ///////////////////////////////////////////////////// 效率 shortFileName 存的值 if (res != null && res != "" && res.Length > 4) { if (shortFileName == FileName) { file.Write("\r\n" + res); } else { FsIndex++; if (FsIndex == 1) { file.Write(shortFileName + "\r\n" + res); } else { file.Write("\r\n" + shortFileName + "\r\n" + res); } } Console.WriteLine("=========================" + res); FileName = shortFileName; } } } file.Close(); PicMatrois.Clear(); } }