日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

opencv +数字识别

發布時間:2023/12/4 编程问答 77 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv +数字识别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

現在很多場景需要使用的數字識別,比如銀行卡識別,以及車牌識別等,在AI領域有很多圖像識別算法,大多是居于opencv 或者谷歌開源的tesseract 識別.

由于公司業務需要,需要開發一個客戶端程序,同時需要在xp這種老古董的機子上運行,故研究了如下幾個數字識別方案,如果大家有更好的方案可以留言告知我,大家一起學習借鑒,不過需要支持XP系統,萬分感謝!

ocr 識別的不同選擇方案

?tesseract

?放棄:谷歌的開源tesseract ocr識別目前最新版本不支持xp系統

? ? ??云端ocr 識別接口(不適用)

?費用比較貴:?場景不同,我們的需求是可能毫秒級別就需要調用一次ocr 識別

? ? ??opencv

?概念:OpenCV是一個基于BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS操作系統上。它輕量級而且高效——由一系列 C 函數和少量 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。

以上幾種ocr 識別比較,最后選擇了opencv 的方式進行ocr 數字識別,下面講解通過ocr識別的基本流程和算法.

opencv 數字識別流程及算法解析

要通過opencv 進行數字識別離不開訓練庫的支持,需要對目標圖片進行大量的訓練,才能做到精準的識別出目標數字;下面我會分別講解圖片訓練的過程及識別的過程.

opencv 識別算法原理

1.比如下面一張圖片,需要從中識別出正確的數字,需要對圖片進行灰度、二值化、腐蝕、膨脹、尋找數字輪廓、切割等一系列操作.

原圖

灰度化圖

二值化圖

尋找輪廓

識別后的結果圖

以上就是簡單的圖片進行灰度化、二值化、尋找數字輪廓得到的識別結果(==這是基于我之前訓練過的數字模型下得到的識別結果==) 有些圖片比較賦值,比如存在背景斜杠等的圖片則需要一定的腐蝕或者膨脹等處理,才能尋找到正確的數字輪廓.

上面的說到我這里使用的是opencv 圖像處理庫進行的ocr 識別,那我這里簡單介紹下C# 怎么使用opencv 圖像處理看;

為了在xp上能夠運行 我這里通過nuget 包引用了 OpenCvSharp-AnyCPU 第三方庫,它使用的是opencv 2410 版本,你們如果不考慮xp系統的情況下開源使用最新的版本,最新版本支持了更多的識別算法.

右擊你的個人項目,選擇“管理Nuget程序包”。在包管理器頁面中,點擊“瀏覽”選項,然后在搜索框中鍵入“OpenCvSharp-AnyCPU”。選擇最頂端的正確項目,并在右側詳情頁中點擊“安裝”,等待安裝完成即可。

以上的核心代碼如下:

private void runSimpleOCR(string pathName){//構造opcvOcr 庫,這里的是我單獨對opencv 庫進行的一次封裝,加載訓練庫模板var opencvOcr = new OpencvOcr($"{path}Template\\Traindata.xml", opencvOcrConfig: new OCR.Model.OpencvOcrConfig(){ErodeLevel = 2.5,ThresholdType = OpenCvSharp.ThresholdType.Binary,ZoomLevel = 2,});var img = new Bitmap(this.txbFilaName.Text);var mat = img.ToMat();//核心識別方法var str = opencvOcr.GetText(mat, isDebug: true);this.labContent.Content = str;}

opencvOcr 的核心代碼如下

#region?屬性const double Thresh = 80;const double ThresholdMaxVal = 255;const int _minHeight = 35;bool _isDebug = false;CvKNearest _cvKNearest = null;OpencvOcrConfig _config = new OpencvOcrConfig() { ZoomLevel = 2, ErodeLevel = 3 };#endregion/// <summary>/// 構造函數/// </summary>/// <param name="path">訓練庫完整路徑</param>/// <param name="opencvOcrConfig">OCR相關配置信息</param>public OpencvOcr(string path, OpencvOcrConfig opencvOcrConfig = null){if (string.IsNullOrEmpty(path))throw new ArgumentNullException("path is not null");if (opencvOcrConfig != null)_config = opencvOcrConfig;this.LoadKnearest(path);}/// <summary>/// 加載Knn 訓練庫模型/// </summary>/// <param name="dataPathFile"></param>/// <returns></returns>private CvKNearest LoadKnearest(string dataPathFile){if (_cvKNearest == null){using (var fs = new FileStorage(dataPathFile, FileStorageMode.Read)){var samples = fs["samples"].ReadMat();var responses = fs["responses"].ReadMat();this._cvKNearest = new CvKNearest();this._cvKNearest.Train(samples, responses);}}return _cvKNearest;}/// <summary>/// OCR 識別,僅僅只能識別單行數字 /// </summary>/// <param name="kNearest">訓練庫</param>/// <param name="path">要識別的圖片路徑</param>public override string GetText(Mat src, bool isDebug = false){this._isDebug = isDebug;#region 圖片處理var respMat = MatProcessing(src, isDebug);if (respMat == null)return "";#endregion#region 查找輪廓var sortRect = FindContours(respMat.FindContoursMat);#endregionreturn GetText(sortRect, respMat.ResourcMat, respMat.RoiResultMat);}/// <summary>/// 查找輪廓/// </summary>/// <param name="src"></param>/// <returns></returns>private List<Rect> FindContours(Mat src){try{#region 查找輪廓Point[][] contours;HierarchyIndex[] hierarchyIndexes;Cv2.FindContours(src,out contours,out hierarchyIndexes,mode: OpenCvSharp.ContourRetrieval.External,method: OpenCvSharp.ContourChain.ApproxSimple);if (contours.Length == 0)throw new NotSupportedException("Couldn't find any object in the image.");#endregion#region 單行排序(目前僅僅支持單行文字,多行文字順序可能不對,按照x坐標進行排序)var sortRect = GetSortRect(contours, hierarchyIndexes);sortRect = sortRect.OrderBy(item => item.X).ToList();#endregionreturn sortRect;}catch { }return null;}/// <summary>/// 獲得切割后的數量列表/// </summary>/// <param name="contours"></param>/// <param name="hierarchyIndex"></param>/// <returns></returns>private List<Rect> GetSortRect(Point[][] contours, HierarchyIndex[] hierarchyIndex){var sortRect = new List<Rect>();var _contourIndex = 0;while ((_contourIndex >= 0)){var contour = contours[_contourIndex];var boundingRect = Cv2.BoundingRect(contour); //Find bounding rect for each contoursortRect.Add(boundingRect);_contourIndex = hierarchyIndex[_contourIndex].Next;}return sortRect;}/// <summary>/// 是否放大/// </summary>/// <param name="src"></param>/// <returns></returns>private bool IsZoom(Mat src){if (src.Height <= _minHeight)return true;return false;}private List<EnumMatAlgorithmType> GetAlgoritmList(Mat src){var result = new List<EnumMatAlgorithmType>();var algorithm = this._config.Algorithm;#region 自定義的算法try{if (algorithm.Contains("|")){result = algorithm.Split('|').ToList().Select(item => (EnumMatAlgorithmType)Convert.ToInt32(item)).ToList();if (!IsZoom(src))result.Remove(EnumMatAlgorithmType.Zoom);return result;}}catch { }#endregion#region 默認算法if (IsZoom(src)){result.Add(EnumMatAlgorithmType.Zoom);}if (this._config.ThresholdType == ThresholdType.Binary){//result.Add(EnumMatAlgorithmType.Blur);result.Add(EnumMatAlgorithmType.Gray);result.Add(EnumMatAlgorithmType.Thresh);if (this._config.DilateLevel > 0)result.Add(EnumMatAlgorithmType.Dilate);result.Add(EnumMatAlgorithmType.Erode);return result;}//result.Add(EnumMatAlgorithmType.Blur);result.Add(EnumMatAlgorithmType.Gray);result.Add(EnumMatAlgorithmType.Thresh);if (this._config.DilateLevel > 0)result.Add(EnumMatAlgorithmType.Dilate);result.Add(EnumMatAlgorithmType.Erode);return result;#endregion}/// <summary>/// 對查找的輪廓數據進行訓練模型匹配,這里使用的是KNN 匹配算法/// </summary>private string GetText(List<Rect> sortRect, Mat source, Mat roiSource){var response = "";try{if ((sortRect?.Count ?? 0) <= 0)return response;var contourIndex = 0;using (var dst = new Mat(source.Rows, source.Cols, MatType.CV_8UC3, Scalar.All(0))){sortRect.ForEach(boundingRect =>{try{#region 繪制矩形if (this._isDebug){Cv2.Rectangle(source, new Point(boundingRect.X, boundingRect.Y),new Point(boundingRect.X + boundingRect.Width, boundingRect.Y + boundingRect.Height),new Scalar(0, 0, 255), 1);Cv2.Rectangle(roiSource, new Point(boundingRect.X, boundingRect.Y),new Point(boundingRect.X + boundingRect.Width, boundingRect.Y + boundingRect.Height),new Scalar(0, 0, 255), 1);}#endregion#region 單個ROIvar roi = roiSource.GetROI(boundingRect); //Crop the imageroi = roi.Compress();var result = roi.ConvertFloat();#endregion#region KNN 匹配var results = new Mat();var neighborResponses = new Mat();var dists = new Mat();var detectedClass = (int)this._cvKNearest.FindNearest(result, 1, results, neighborResponses, dists);var resultText = detectedClass.ToString(CultureInfo.InvariantCulture);#endregion#region 匹配var isDraw = false;if (detectedClass >= 0){response += detectedClass.ToString();isDraw = true;}if (detectedClass == -1 && !response.Contains(".")){response += ".";resultText = ".";isDraw = true;}#endregion#region 繪制及輸出切割信息庫try{//if (this._isDebug)//{Write(contourIndex, detectedClass, roi);//}}catch { }if (this._isDebug && isDraw){Cv2.PutText(dst, resultText, new Point(boundingRect.X, boundingRect.Y + boundingRect.Height), 0, 1, new Scalar(0, 255, 0), 2);}#endregionresult?.Dispose();results?.Dispose();neighborResponses?.Dispose();dists?.Dispose();contourIndex++;}catch (Exception ex){TextHelper.Error("GetText ex", ex);}});#region 調試模式顯示過程source.IsDebugShow("Segmented Source", this._isDebug);dst.IsDebugShow("Detected", this._isDebug);dst.IsDebugWaitKey(this._isDebug);dst.IsDebugImWrite("dest.jpg", this._isDebug);#endregion}}catch{throw;}finally{source?.Dispose();roiSource?.Dispose();}return response;}/// <summary>/// 圖片處理算法/// </summary>/// <param name="src"></param>/// <param name="isDebug"></param>/// <returns></returns>public ImageProcessModel MatProcessing(Mat src, bool isDebug = false){src.IsDebugShow("原圖", isDebug);var list = GetAlgoritmList(src);var resultMat = new Mat();src.CopyTo(resultMat);var isZoom = IsZoom(src);list?.ForEach(item =>{switch (item){case EnumMatAlgorithmType.Dilate:resultMat = resultMat.ToDilate(Convert.ToInt32(this._config.DilateLevel));resultMat.IsDebugShow(EnumMatAlgorithmType.Dilate.GetDescription(), isDebug);break;case EnumMatAlgorithmType.Erode:var eroderLevel = isZoom ? this._config.ErodeLevel * this._config.ZoomLevel : this._config.ErodeLevel;resultMat = resultMat.ToErode(eroderLevel);resultMat.IsDebugShow(EnumMatAlgorithmType.Erode.GetDescription(), isDebug);break;case EnumMatAlgorithmType.Gray:resultMat = resultMat.ToGrey();resultMat.IsDebugShow(EnumMatAlgorithmType.Gray.GetDescription(), isDebug);break;case EnumMatAlgorithmType.Thresh:var thresholdValue = this._config.ThresholdValue <= 0 ? resultMat.GetMeanThreshold() : this._config.ThresholdValue;resultMat = resultMat.ToThreshold(thresholdValue, thresholdType: this._config.ThresholdType);resultMat.IsDebugShow(EnumMatAlgorithmType.Thresh.GetDescription(), isDebug);break;case EnumMatAlgorithmType.Zoom:resultMat = resultMat.ToZoom(this._config.ZoomLevel);src = resultMat;resultMat.IsDebugShow(EnumMatAlgorithmType.Zoom.GetDescription(), isDebug);break;case EnumMatAlgorithmType.Blur:resultMat = resultMat.ToBlur();src = resultMat;resultMat.IsDebugShow(EnumMatAlgorithmType.Blur.GetDescription(), isDebug);break;}});var oldThreshImage = new Mat();resultMat.CopyTo(oldThreshImage);return new ImageProcessModel(){ResourcMat = src,FindContoursMat = oldThreshImage,RoiResultMat = resultMat};}

opencv 圖片處理開放出去的配置對象實體如下:

public class OpencvOcrConfig{/// <summary>/// 放大程度級別 默認2/// </summary>public double ZoomLevel { set; get; }/// <summary>/// 腐蝕級別 默認2.5/// </summary>public double ErodeLevel { set; get; }/// <summary>/// 膨脹/// </summary>public double DilateLevel { set; get; }/// <summary>/// 閥值/// </summary>public double ThresholdValue { set; get; }/// <summary>/// 圖片處理算法,用逗號隔開/// </summary>public string Algorithm { set; get; }/// <summary>/// 二值化方式/// </summary>public ThresholdType ThresholdType { set; get; } = ThresholdType.BinaryInv;/// <summary>/// 通道模式/// </summary>public OcrChannelTypeEnums ChannelType { set; get; } = OcrChannelTypeEnums.BlackBox;}

opencv 圖片處理算法擴展方法如下:

public static partial class OpenCvExtensions{private const int Thresh = 200;private const int ThresholdMaxVal = 255;/// <summary>/// Bitmap Convert Mat/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public static Mat ToMat(this System.Drawing.Bitmap bitmap){return OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);}/// <summary>/// Bitmap Convert Mat/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public static System.Drawing.Bitmap ToBitmap(this Mat mat){return OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat);}public static bool MatIsEqual(this Mat mat1, Mat mat2){try{if (mat1.Empty() && mat2.Empty()){return true;}if (mat1.Cols != mat2.Cols || mat1.Rows != mat2.Rows || mat1.Dims() != mat2.Dims() ||mat1.Channels() != mat2.Channels()){return false;}if (mat1.Size() != mat2.Size() || mat1.Type() != mat2.Type()){return false;}var nrOfElements1 = mat1.Total() * mat1.ElemSize();if (nrOfElements1 != mat2.Total() * mat2.ElemSize())return false;return MatPixelEqual(mat1, mat2);}catch (Exception ex){TextHelper.Error("MatIsEqual 異常", ex);return true;}}/// <summary>/// 灰度/// </summary>/// <param name="mat"></param>/// <returns></returns>public static Mat ToGrey(this Mat mat){try{Mat grey = new Mat();Cv2.CvtColor(mat, grey, OpenCvSharp.ColorConversion.BgraToGray);return grey;}catch{return mat;}}/// <summary>/// 二值化/// </summary>/// <param name="data"></param>/// <returns></returns>public static Mat ToThreshold(this Mat data, double threshValue = 0, ThresholdType thresholdType = ThresholdType.BinaryInv){Mat threshold = new Mat();if (threshValue == 0)threshValue = Thresh;Cv2.Threshold(data, threshold, threshValue, ThresholdMaxVal, thresholdType);if (threshold.IsBinaryInv()){Cv2.Threshold(threshold, threshold, threshValue, ThresholdMaxVal, ThresholdType.BinaryInv);}return threshold;}/// <summary>/// 是否調試顯示/// </summary>/// <param name="src"></param>/// <param name="name"></param>/// <param name="isDebug"></param>public static void IsDebugShow(this Mat src, string name, bool isDebug = false){if (!isDebug)return;Cv2.ImShow(name, src);}public static void IsDebugWaitKey(this Mat src, bool isDebug = false){if (!isDebug)return;Cv2.WaitKey();}public static void IsDebugImWrite(this Mat src, string path, bool isDebug = false){if (!isDebug)return;try{Cv2.ImWrite(path, src);}catch { }}/// <summary>/// Mat 轉成另外一種存儲矩陣方式/// </summary>/// <param name="roi"></param>/// <returns></returns>public static Mat ConvertFloat(this Mat roi){var resizedImage = new Mat();var resizedImageFloat = new Mat();Cv2.Resize(roi, resizedImage, new Size(10, 10)); //resize to 10X10resizedImage.ConvertTo(resizedImageFloat, MatType.CV_32FC1); //convert to floatvar result = resizedImageFloat.Reshape(1, 1);return result;}/// <summary>/// 腐蝕/// </summary>/// <param name="mat"></param>/// <returns></returns>public static Mat ToErode(this Mat mat, double level){#region?自動會判斷是否需要腐蝕if (level < 1){return mat;}#endregionvar erode = new Mat();var copyMat = new Mat();mat.CopyTo(copyMat);Cv2.Erode(mat, erode, Cv2.GetStructuringElement(StructuringElementShape.Ellipse, new Size(level, level)));return erode;}/// <summary>/// 膨脹/// </summary>/// <param name="mat"></param>/// <returns></returns>public static Mat ToDilate(this Mat mat, int level){if (level <= 0)return mat;var dilate = new Mat();Cv2.Dilate(mat, dilate, Cv2.GetStructuringElement(StructuringElementShape.Ellipse, new Size(level, level)));return dilate;}/// <summary>/// mat 轉Roi/// </summary>/// <param name="image"></param>/// <param name="boundingRect"></param>/// <returns></returns>public static Mat GetROI(this Mat image, Rect boundingRect){try{return new Mat(image, boundingRect); //Crop the image}catch{}return null;}/// <summary>/// 獲取平均閥值/// </summary>/// <param name="mat"></param>/// <returns></returns>public static int GetMeanThreshold(this Mat mat){var width = mat.Width;var height = mat.Height;var m = mat.Reshape(1, width * height);return (int)m.Sum() / (width * height);}/// <summary>/// 獲得二值化閥值/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public static int GetMeanThreshold(this System.Drawing.Bitmap bitmap){using (var mat = bitmap.ToMat())using (var grap = mat.ToGrey()){return grap.GetMeanThreshold();}}public static bool IsErode(this System.Drawing.Bitmap bitmap){using (var mat = bitmap.ToMat())using (var grap = mat.ToGrey()){var thresholdValue = grap.GetMeanThreshold();using (var threshold = grap.ToThreshold(thresholdValue, ThresholdType.BinaryInv)){return threshold.IsErode();}}}/// <summary>/// 放大/// </summary>/// <param name="img"></param>/// <param name="times"></param>/// <returns></returns>public static Mat ToZoom(this Mat img, double times){if (times <= 0)return img;var width = img.Width * times;var height = img.Height * times;img = img.Resize(new Size(width, height), 0, 0, Interpolation.NearestNeighbor);return img;}/// <summary>/// 均值濾波/// </summary>/// <param name="img"></param>/// <returns></returns>public static Mat ToBlur(this Mat img){return img.Blur(new Size(3, 3));}public static Mat Compress(this Mat img){var width = 28.0 * img.Width / img.Height;var fWidth = width / img.Width;var?fHeight?=?28.0?/?img.Height;img = img.Resize(new Size(width, 28), fWidth, fHeight, Interpolation.NearestNeighbor);return img;}public static bool MatPixelEqual(this Mat src, Mat are){var width = src.Width;var height = src.Height;var sum = width * height;for (int row = 0; row < height; row++){for (int col = 0; col < width; col++){byte p = src.At<byte>(row, col); //獲對應矩陣坐標的取像素byte pAre = are.At<byte>(row, col);if (p != pAre)return false;}}return true;}public static int GetSumPixelCount(this Mat threshold){var width = threshold.Width;var height = threshold.Height;var sum = width * height;var value = 0;for (int row = 0; row < height; row++){for (int col = 0; col < width; col++){byte p = threshold.At<byte>(row, col); //獲對應矩陣坐標的取像素value++;}}return value;}public static int GetPixelCount(this Mat threshold, System.Drawing.Color color){var width = threshold.Width;var height = threshold.Height;var sum = width * height;var value = 0;for (int row = 0; row < height; row++){for (int col = 0; col < width; col++){byte p = threshold.At<byte>(row, col); //獲對應矩陣坐標的取像素if (Convert.ToInt32(p) == color.R){value++;}}}return value;}/// <summary>/// 是否需要二值化反轉/// </summary>/// <param name="threshold"></param>/// <returns></returns>public static bool IsBinaryInv(this Mat threshold){var width = threshold.Width;var height = threshold.Height;var sum = Convert.ToDouble(width * height);var black = GetPixelCount(threshold, System.Drawing.Color.Black);return (Convert.ToDouble(black) / sum) < 0.5;}/// <summary>/// 是否需要腐蝕/// </summary>/// <param name="mat"></param>/// <returns></returns>public static bool IsErode(this Mat mat){var percent = mat.GetPercent();return percent >= 0.20;}/// <summary>/// 獲得白色像素占比/// </summary>/// <param name="threshold"></param>/// <returns></returns>public static double GetPercent(this Mat threshold){var width = threshold.Width;var height = threshold.Height;var sum = Convert.ToDouble(width * height);var white = GetPixelCount(threshold, System.Drawing.Color.White);return (Convert.ToDouble(white) / sum);}/// <summary>/// 根據模板查找目標圖片的在原圖標中的開始位置坐標/// </summary>/// <param name="source"></param>/// <param name="template"></param>/// <param name="matchTemplateMethod"></param>/// <returns></returns>public static Point FindTemplate(this Mat source, Mat template, MatchTemplateMethod matchTemplateMethod = MatchTemplateMethod.SqDiffNormed){if (source == null)return new OpenCvSharp.CPlusPlus.Point();var result = new Mat();Cv2.MatchTemplate(source, template, result, matchTemplateMethod);Cv2.MinMaxLoc(result, out OpenCvSharp.CPlusPlus.Point minVal, out OpenCvSharp.CPlusPlus.Point maxVal);var topLeft = new OpenCvSharp.CPlusPlus.Point();if (matchTemplateMethod == MatchTemplateMethod.SqDiff || matchTemplateMethod == MatchTemplateMethod.SqDiffNormed){topLeft = minVal;}else{topLeft = maxVal;}return topLeft;}}

以上代碼中開源對圖片進行輪廓切割,同時會生成切割后的圖片代碼如下

#region 繪制及輸出切割信息庫try{Write(contourIndex, detectedClass, roi);}catch { } #endregionprivate void Write(int contourIndex, int detectedClass, Mat roi) {Task.Factory.StartNew(() =>{try{var templatePath = $"{AppDomain.CurrentDomain.BaseDirectory}template";FileHelper.CreateDirectory(templatePath);var templatePathFile = $"{templatePath}/{contourIndex}_{detectedClass.ToString()}.png";Cv2.ImWrite(templatePathFile, roi);if (!roi.IsDisposed){roi.Dispose();}}catch {}}); }

切割后的圖片如下:

這里我已經對數字進行切割好了,接下來就是需要對0-9 這些數字進行分類(建立文件夾進行數字歸類),如下:

圖中的每一個分類都是我事先切割好的數字圖片,圖中有-1 和-2 這兩個特殊分類,-1 里面我是放的是“.”好的分類,用于訓練“.”的圖片,這樣就可以識別出小數點的數字支持. -2 這個分類主要是其他一些無關緊要的圖片,也就是不是數字和點的都歸為這一類中.

現在訓練庫分類已經建立好了,接下來我們需要對這些分類數字進行歸一化處理,生成訓練模型. 代碼如下:

private void Button_Click_1(object sender, RoutedEventArgs e){var opencvOcr = new OpencvOcr($"{path}Template\\Traindata.xml", opencvOcrConfig: null);opencvOcr.Save($"{path}Template\\NumberWrite", outputPath: $"{path}Template\\Traindata.xml");MessageBox.Show("生成訓練庫成功");//var img = new Bitmap(this.txbFilaName.Text);//var str = opencvOcr.GetText(img.ToMat(), isDebug: true);//this.labContent.Content = str;}/// <summary>/// 保存訓練模型/// </summary>/// <param name="dataPath"></param>/// <param name="trainExt"></param>/// <param name="dataPathFile"></param>public void Save(string dataPath, string trainExt = "*.png", string outputPath = ""){if (string.IsNullOrEmpty(outputPath))throw new ArgumentNullException("save dataPath is not null");var trainingImages = this.ReadTrainingImages(dataPath, trainExt);var samples = GetSamples(trainingImages);var response = GetResponse(trainingImages);//寫入到訓練庫中using (var fs = new FileStorage(outputPath, FileStorageMode.WriteText)){fs.Write("samples", samples);fs.Write("responses", response);}}/// <summary>/// 根據目錄加載文件/// </summary>/// <param name="path"></param>/// <param name="ext"></param>/// <returns></returns>private IList<ImageInfo> ReadTrainingImages(string path, string ext){var images = new List<ImageInfo>();var imageId = 1;foreach (var dir in new DirectoryInfo(path).GetDirectories()){var groupId = int.Parse(dir.Name);foreach (var imageFile in dir.GetFiles(ext)){var srcMat = new Mat(imageFile.FullName, OpenCvSharp.LoadMode.GrayScale);var image = srcMat.ConvertFloat();if (image == null){continue;}images.Add(new ImageInfo{Image = image,ImageId = imageId++,ImageGroupId = groupId});}}return images;}/// <summary>/// Mat 轉成另外一種存儲矩陣方式/// </summary>/// <param name="roi"></param>/// <returns></returns>public static Mat ConvertFloat(this Mat roi){var resizedImage = new Mat();var resizedImageFloat = new Mat();Cv2.Resize(roi, resizedImage, new Size(10, 10)); //resize to 10X10resizedImage.ConvertTo(resizedImageFloat, MatType.CV_32FC1); //convert to floatvar result = resizedImageFloat.Reshape(1, 1);return result;}/// <summary>/// 獲取Samples/// </summary>/// <param name="trainingImages"></param>/// <returns></returns>private Mat GetSamples(IList<ImageInfo> trainingImages){var samples = new Mat();foreach (var trainingImage in trainingImages){samples.PushBack(trainingImage.Image);}return samples;}private Mat GetResponse(IList<ImageInfo> trainingImages){var labels = trainingImages.Select(x => x.ImageGroupId).ToArray();var responses = new Mat(labels.Length, 1, MatType.CV_32SC1, labels);var tmp = responses.Reshape(1, 1); //make continuousvar responseFloat = new Mat();tmp.ConvertTo(responseFloat, MatType.CV_32FC1); // Convert to floatreturn responses;}

到這里ocr 訓練模型以及建立好了,會在目錄中生成一個Traindata.xml 的訓練模型庫,我們來打開這個訓練模型庫文件探索它的神秘的容顏.

如果大家有更好的數字識別方案可以留言告知我,這樣可以更好的應用到實際場景中需求場景:

  • 客戶端調用,不走api方式

  • 必須要xp這種老爺機的支持

  • 總結

    以上是生活随笔為你收集整理的opencv +数字识别的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    欧美一区成人 | 欧美日韩在线看 | 精品国产乱码久久久久久1区2匹 | 国产精品一区二区无线 | 91视频电影| 国产又粗又猛又色又黄网站 | 国产精品免费久久 | 精品一区二区三区电影 | 狠狠狠色丁香婷婷综合久久五月 | 久久久久国产精品视频 | 色综合久久88 | 精品在线视频一区 | 久久婷婷色 | 日韩av一区在线观看 | www.福利视频 | 国产免费观看久久 | 黄色a视频免费 | 亚洲乱亚洲乱妇 | 麻豆成人在线观看 | 美女视频黄频 | 欧美极品xxx | 欧美日韩免费网站 | 国内外激情视频 | 久久艹国产 | 久久精品综合网 | 99精品视频观看 | 深爱激情五月综合 | 草久久久久| 91九色在线视频 | 亚州精品在线视频 | 人人要人人澡人人爽人人dvd | 免费视频久久久久 | 日韩精品一区二区三区免费观看视频 | 国产a网站 | 丁香av| 免费看的黄色网 | 少妇视频在线播放 | 日韩网站免费观看 | 久久久久 免费视频 | 亚洲精品中文字幕在线观看 | 久久天天躁夜夜躁狠狠躁2022 | 99综合电影在线视频 | 中文字幕在线免费 | 国产对白av | 超碰97中文 | 日本精品视频在线观看 | 香蕉97视频观看在线观看 | 最新中文字幕视频 | 日日夜日日干 | 久久精品久久精品久久 | 久久成| 99色精品视频 | 国产蜜臀av | 中文字幕久久网 | 久久神马影院 | 国产淫片免费看 | 九九免费在线观看视频 | 亚洲精品h | 精品超碰| 婷婷色 亚洲| 婷婷中文字幕 | 国产99久久精品一区二区300 | 成人免费在线播放 | 日韩欧美视频免费观看 | 欧美日韩国产亚洲乱码字幕 | 丁香激情综合国产 | 日韩一级电影在线观看 | 成人一级片在线观看 | 亚洲精品乱码久久久久久 | 成人va视频 | 久久久91精品国产一区二区三区 | 欧美久草视频 | 麻豆视频免费看 | av高清不卡| 999国内精品永久免费视频 | 国产原创91 | 激情中文在线 | 国产精品va最新国产精品视频 | av综合 日韩 | 天天操狠狠干 | 亚洲一区动漫 | 国产不卡免费视频 | 在线欧美小视频 | h久久| 国产精品久久久久久久毛片 | 98久9在线 | 免费 | 超碰电影在线观看 | 亚洲天天综合网 | 婷婷深爱网 | 91一区二区在线 | 国产精品久久久久影院日本 | 亚洲成色 | 成人免费观看在线视频 | 免费特级黄毛片 | 五月婷婷色丁香 | 欧美日韩免费在线观看视频 | 国产不卡网站 | 久久综合一本 | 日韩精品视频久久 | 国产裸体视频网站 | 久久国产香蕉视频 | av在线收看 | 国产一级不卡视频 | 成人在线你懂得 | 欧洲黄色片 | 色在线高清 | 婷婷久草 | 久久96国产精品久久99漫画 | 91社区国产高清 | 欧美日韩视频在线观看一区二区 | 五月天天色 | 久久精品国产亚洲精品2020 | 国产精品18毛片一区二区 | 国产又粗又猛又爽又黄的视频先 | 欧美精品久久久久久久久久丰满 | 成人午夜网 | 在线导航av | 亚洲天天草 | 综合网伊人 | 91九色在线视频 | 91一区啪爱嗯打偷拍欧美 | 热九九精品 | 亚洲黄色av | 不卡的一区二区三区 | 91精品视频免费在线观看 | 嫩小bbbb摸bbb摸bbb | 日韩中文字幕在线 | 天天插夜夜操 | 国产二区精品 | 国语对白少妇爽91 | 国产精品久久久久久久久婷婷 | 久久综合久久鬼 | 国产一区在线播放 | 日韩精品无码一区二区三区 | 国产成人av在线 | 久精品视频免费观看2 | 黄色片网站av | 国产色视频网站 | 日韩色综合 | 亚洲人成影院在线 | 国产亚洲观看 | 日韩国产在线观看 | 99视频在线看| 超碰公开在线观看 | 欧美精品久久久久 | 日韩小视频网站 | 国产美女精品视频免费观看 | 色丁香久久 | 久操操 | 国产成人精品亚洲a | 91成人免费观看视频 | 国产在线欧美日韩 | 欧美日韩伦理一区 | 丝袜美腿亚洲 | 精品国内 | 美女网站视频色 | 手机成人av | 九九99| 国产黄色免费在线观看 | 6080yy午夜一二三区久久 | 国产日韩欧美中文 | 天天干天天射天天插 | 丁香六月国产 | 日韩区在线观看 | 在线视频免费观看 | 亚州激情视频 | 97超碰中文字幕 | 天天操天天添天天吹 | 国产91aaa| 丁香 婷婷 激情 | 99re中文字幕 | 欧美日bb | 精品一二三四在线 | 欧美日韩久久一区 | 色999五月色 | 欧美日韩亚洲精品在线 | 丝袜+亚洲+另类+欧美+变态 | 久久久久国产精品厨房 | 亚洲成人第一区 | 人人爽人人香蕉 | 人人爱在线视频 | 成人国产精品av | 日本久久久久久久久久久 | 国产福利精品在线观看 | 国产精品爽爽久久久久久蜜臀 | 国产精品18久久久久vr手机版特色 | 国产xxxxx在线观看 | 亚洲视频在线观看免费 | 精品国产成人 | 亚洲精品在线电影 | www天天干 | 成人国产在线 | 欧美在线视频二区 | 久久精品中文字幕一区二区三区 | 国产高清视频在线观看 | 国产三级午夜理伦三级 | 亚洲精品黄 | 欧美成人xxx | 一区二区视频播放 | av免费看网站 | 国产一区二区三区网站 | 亚洲春色综合另类校园电影 | 91在线免费观看网站 | 国产99久久久欧美黑人 | 成人免费亚洲 | 91日韩精品一区 | 国产尤物在线视频 | 成x99人av在线www | 草免费视频 | 99人成在线观看视频 | 天天操天天干天天摸 | jizz欧美性9| 色网站在线免费 | 日韩电影一区二区在线 | 狠狠色综合欧美激情 | www.狠狠色.com | 亚洲一二三区精品 | 欧美va天堂va视频va在线 | 久久激情五月丁香伊人 | 91视频高清完整版 | 色多多在线观看 | 在线日韩| 在线观看亚洲专区 | 国产精品二区在线 | 国产精品乱码高清在线看 | 婷婷久久综合九色综合 | 国产成人综合在线观看 | av网站免费在线 | 91视频3p | 狠狠干天天操 | 青春草视频在线播放 | 亚洲免费永久精品国产 | 日韩欧美视频免费观看 | 国产超碰在线 | 国产一区二区精品久久 | 国产精品2区| 在线免费成人 | 久久亚洲国产精品 | 国产成人av网址 | 久久精品99北条麻妃 | 97超碰总站 | 美女av免费看 | 国产成人在线综合 | 亚州av免费 | 成人在线播放av | 日韩久久片 | 日韩美在线观看 | 在线免费高清一区二区三区 | 美女网站色免费 | 亚洲精品国偷自产在线99热 | 欧美视频18 | 亚洲欧美日本一区二区三区 | 天天操天天摸天天爽 | 色吊丝在线永久观看最新版本 | 91精品国自产在线观看 | 1024手机基地在线观看 | 亚洲区精品 | 亚洲精品乱码久久久久久写真 | 天天久久夜夜 | 日韩免费电影一区二区三区 | 黄色毛片在线 | 亚欧洲精品视频在线观看 | 成人黄色一级视频 | 欧美精品乱码久久久久 | 好看的国产精品视频 | 欧美一二三专区 | 日韩电影中文 | 国产精品美乳一区二区免费 | 激情久久一区二区三区 | 欧美国产一区二区 | 日韩中文字幕在线看 | 国产精品免费在线视频 | 国产精品夜夜夜一区二区三区尤 | 一区二区三区在线视频111 | 中文字幕av电影下载 | 中文在线最新版天堂 | 国产精品淫片 | 久草网视频在线观看 | 欧美视频日韩视频 | 综合网色 | 国产高清日韩欧美 | 特级西西www44高清大胆图片 | 色综合久久66 | 在线免费视频你懂的 | 超碰人人99 | 午夜在线免费观看视频 | 中文字幕高清免费日韩视频在线 | 久久精品日本啪啪涩涩 | 伊人中文字幕在线 | 欧美一二三在线 | 国产直播av | 国产精品久久久久影院日本 | 黄污网 | 91精品国产自产在线观看永久 | 亚洲综合狠狠干 | 精品特级毛片 | 99爱视频在线观看 | av免费在线观看网站 | 欧美地下肉体性派对 | 久久永久免费视频 | 久久久麻豆精品一区二区 | 国产精品一区二区美女视频免费看 | 婷婷丁香色综合狠狠色 | 国产精品一区二 | a色视频| 久久精品久久综合 | 成人三级网址 | 91精品国自产在线偷拍蜜桃 | 中文字幕一区三区 | 国产69精品久久久久99尤 | 精品视频在线播放 | 国产福利专区 | 亚洲最新av | 在线a人v观看视频 | 国产亚洲精品久久 | 一级欧美一级日韩 | 免费h精品视频在线播放 | 中文字幕第一页在线视频 | 亚洲国产精品女人久久久 | 亚洲精品在线观看免费 | 黄色三级久久 | 日本中文字幕免费观看 | 日韩免费在线看 | 日韩大片免费在线观看 | 99热只有精品在线观看 | 国内精品亚洲 | 天天干天天玩天天操 | 日韩一级片观看 | 香蕉视频在线免费看 | 免费观看完整版无人区 | 国产黄色免费在线观看 | 免费在线观看国产精品 | 久久精品一区 | 黄色精品久久 | 在线免费观看黄色大片 | 久久免费视频一区 | www.久艹| 国产精品爽爽久久久久久蜜臀 | 久久国产一区二区三区 | 美女黄视频免费 | 三级视频片 | 精品欧美一区二区三区久久久 | 免费av大全 | 亚洲一区二区视频 | 麻豆视频免费网站 | 国产亚洲精品久久久久久 | 天天操月月操 | 欧美99精品 | 日本精品久久久一区二区三区 | 欧美日韩中文另类 | 国产福利一区二区三区在线观看 | 中文字幕久久久精品 | 色综合天天狠天天透天天伊人 | 午夜色婷婷 | 日韩一区二区三区不卡 | 久久成人国产精品 | 最近中文字幕免费视频 | 亚洲国产成人精品在线观看 | 国产美女免费观看 | 久操中文字幕在线观看 | 天天曰天天曰 | 国产在线理论片 | 91av蜜桃| 国产精品毛片久久久久久 | 久久久国内精品 | 日日婷婷夜日日天干 | 黄色精品国产 | 国产第一二区 | 最近中文字幕高清字幕在线视频 | 亚洲电影久久久 | 国产一级电影在线 | 免费看国产精品 | 夜夜嗨av色一区二区不卡 | 欧美一二三区播放 | 最新免费中文字幕 | 国产五月色婷婷六月丁香视频 | 少妇bbb | 婷五月激情 | 中文字幕黄色网 | 国产精国产精品 | 一级特黄aaa大片在线观看 | 国产午夜在线观看视频 | 激情五月婷婷丁香 | 国产在线视频导航 | 97国产在线观看 | 黄色在线成人 | 九九精品视频在线观看 | 在线观看mv的中文字幕网站 | 亚洲伦理精品 | 欧美日韩高清国产 | 日韩动漫免费观看高清完整版在线观看 | 久久av免费 | 久操视频在线播放 | 91最新在线 | 久久一区二 | 天堂黄色片 | 欧美日韩一级久久久久久免费看 | 久久尤物电影视频在线观看 | 黄色毛片观看 | 国产一区二区在线播放 | 天天干.com | 日韩精品久久久久久久电影99爱 | 在线观看视频国产一区 | 国产又粗又猛又黄又爽的视频 | 亚洲国产三级 | 欧美一级小视频 | 97精品国产97久久久久久 | 亚洲视频在线免费观看 | 欧洲精品久久久久毛片完整版 | 国产 字幕 制服 中文 在线 | 精品视频免费 | 2019免费中文字幕 | 九九日九九操 | 最新日韩视频 | 日韩免费看片 | 香蕉视频网址 | 天天操天天操天天干 | 日本精品视频免费观看 | 久久手机精品视频 | 中文字幕永久免费 | 亚洲精品视频免费在线 | 人人干人人搞 | 欧洲精品一区二区 | 人人插超碰| 深夜免费福利网站 | 中文字幕资源在线观看 | 欧美专区日韩专区 | 久久综合免费 | 在线亚洲观看 | 国产精品亚洲精品 | 在线 国产 日韩 | 久久草在线视频国产 | 国产精品久久久视频 | 9i看片成人免费看片 | 中文字幕区| 久久网站最新地址 | 久久亚洲二区 | 毛片久久久 | 天天色天天色天天色 | 国产视频在线播放 | 免费看在线看www777 | 婷婷色社区| 国产成人无码AⅤ片在线观 日韩av不卡在线 | 97精品国产91久久久久久久 | 91秒拍国产福利一区 | 91中文字幕网 | 久久这里只有精品久久 | 91精品国产三级a在线观看 | 一级性视频| 亚洲经典中文字幕 | 黄色91免费观看 | 日韩视频中文字幕 | 国产精品视频地址 | avove黑丝 | 99精品视频免费全部在线 | 九九免费观看视频 | 国内精品一区二区 | 日韩av福利在线 | 91爱爱视频| 久久在线免费观看视频 | 91看片淫黄大片在线播放 | 国产一区二区三区高清播放 | 一级黄色网址 | 天天操天天色天天射 | 99久久婷婷国产一区二区三区 | 国产91影院| 精品亚洲视频在线观看 | 国产在线观 | 国产高清无线码2021 | 久久免费看| 久久免费视频国产 | 91在线影院| 成人免费观看视频大全 | 国产精品电影一区二区 | 狠狠操狠狠干2017 | 国产91粉嫩白浆在线观看 | 97视频在线看| 五月婷婷网站 | 久久综合狠狠综合久久狠狠色综合 | 操操综合网 | 亚洲国产经典视频 | 人人爱爱 | 国产 日韩 欧美 在线 | 久久久蜜桃一区二区 | h视频日本 | 日韩欧美在线免费观看 | 国产成人久久av免费高清密臂 | 91在线播放视频 | 美女黄色网在线播放 | 超碰人人草 | 亚洲天天看 | 一区二区三区在线观看免费视频 | 国产一区二区在线免费 | 亚洲视频免费在线看 | 日韩久久久久久久久 | www.超碰97.com| 一区二区观看 | 六月丁香六月婷婷 | 在线观看视频你懂 | 国产欧美在线一区二区三区 | 亚洲影院一区 | 国产高清在线免费观看 | 欧美中文字幕久久 | 亚洲综合五月 | 日韩精品一区二区三区外面 | 又黄又爽又湿又无遮挡的在线视频 | 欧美福利网址 | 亚洲成人av一区 | 96精品高清视频在线观看软件特色 | 91免费高清观看 | 日韩中文字幕电影 | 天天插夜夜操 | 亚洲成a人片77777kkkk1在线观看 | 成年人在线播放视频 | 999视频精品 | 在线免费观看麻豆 | 国产在线免费观看 | 一级理论片在线观看 | 91女人18片女毛片60分钟 | 中文字幕av全部资源www中文字幕在线观看 | av在线播放免费 | 91x色| 超碰av在线免费观看 | a'aaa级片在线观看 | 啪啪免费试看 | 亚洲精品视频免费在线 | 亚洲国产欧美在线看片xxoo | 一区二区三区电影在线播 | 玖玖视频网| 色天堂在线视频 | 天天久久综合 | 国产高清成人在线 | 99热最新网址 | 精品亚洲一区二区三区 | 欧美黑吊大战白妞欧美 | 免费视频 三区 | 久草视频播放 | 国产一区二区高清 | 国产精品麻豆91 | 国产黄在线免费观看 | 精品国产乱码久久久久久1区2匹 | 综合久久2023 | 五月开心激情 | www.久久婷婷 | 国产精品激情 | 久久69av| 亚洲电影久久 | 97视频在线观看播放 | 亚洲国产精品电影在线观看 | 久久久久久久99精品免费观看 | 91精彩视频在线观看 | 国产aaa毛片 | 亚州欧美视频 | 亚洲精欧美一区二区精品 | 五月婷香蕉久色在线看 | 黄色片免费在线 | 亚洲欧美日韩中文在线 | 香蕉在线视频观看 | 成人午夜黄色影院 | 中文字幕中文字幕 | 日韩在线观看一区二区 | 亚洲欧美视频在线观看 | 1000部18岁以下禁看视频 | 国产一级片免费观看 | 日日操网 | 欧美午夜精品久久久久久浪潮 | 玖玖玖在线 | 天天操天天曰 | 91在线看片 | 色狠狠一区二区 | 蜜臀久久99精品久久久无需会员 | 亚洲免费a | 久久久91精品国产一区二区精品 | 91亚洲精品乱码久久久久久蜜桃 | 99热这里是精品 | 精品亚洲视频在线观看 | 亚洲成av人影片在线观看 | 综合天堂av久久久久久久 | 日韩精品一区二区三区第95 | 欧美日韩中文在线 | 91精品啪啪 | 久久99久久99免费视频 | 日日色综合 | 精品福利视频在线 | 九九免费在线观看视频 | 91精品国产成人www | 国产精品成人一区二区三区吃奶 | 91麻豆免费看 | 久久精品com | 国产精品成人久久久久久久 | 狠狠综合| 国产日韩欧美在线 | 99精品免费在线 | 综合色综合色 | 伊人狠狠操| 黄色毛片在线观看 | 中文字幕av专区 | 国产成人在线免费观看 | 免费网址在线播放 | 精品国产一区二区三区久久久久久 | 亚洲精品国产精品久久99 | 麻花传媒mv免费观看 | 国内综合精品午夜久久资源 | 国产v在线 | 四虎在线视频免费观看 | 少妇bbw搡bbbb搡bbbb | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 色婷婷天天干 | 婷婷色在线观看 | 伊人五月天婷婷 | 女人18精品一区二区三区 | 国产精品一区免费在线观看 | 免费网址在线播放 | 久久99电影| 日韩精品免费一区二区 | 一区二区三区免费在线观看视频 | 精品一区二区在线看 | 香蕉网址 | 欧美影院久久 | 91在线永久 | 成人av网站在线观看 | 日日夜夜草 | 96视频在线 | 国产精品亚州 | 毛片永久免费 | 欧美国产三区 | 亚洲最新视频在线 | 国产xxxx做受性欧美88 | 成人午夜电影免费在线观看 | 亚洲最大av在线播放 | 午夜av免费看 | 激情视频久久 | 国内精品一区二区 | 久久网站av | 亚洲男男gaygayxxxgv| 亚洲国产精品日韩 | 伊人天天狠天天添日日拍 | 97在线视频免费播放 | 久久午夜精品视频 | 999久久久久| a视频免费看 | 日韩在线视频一区二区三区 | 日韩啪啪小视频 | 国产三级国产精品国产专区50 | 日本精品一区二区 | 久久精品国产美女 | 精品字幕在线 | 香蕉日日| 午夜视频免费在线观看 | 91麻豆精品国产自产在线游戏 | 国产精品久久久久久久久蜜臀 | 91麻豆精品91久久久久同性 | 福利电影一区二区 | 国产91精品一区二区麻豆亚洲 | 色偷偷97 | 国产综合视频在线观看 | 天干啦夜天干天干在线线 | 亚洲第一香蕉视频 | 超碰在线日韩 | 国产精品一区二区三区电影 | 欧美精品你懂的 | 天天爱天天舔 | 欧美精品久久久久性色 | 高清在线一区二区 | 99re热精品视频 | 91麻豆文化传媒在线观看 | 久久久高清| 免费视频91蜜桃 | 国产原创av在线 | 美女网站久久 | 国产香蕉久久 | 久久精品一级片 | 天天爱天天操天天干 | 久久综合亚洲鲁鲁五月久久 | 日韩一级电影网站 | 综合久久精品 | 国产在线理论片 | 国产69熟| 国产一区二区久久久久 | 中文字幕免费一区二区 | 国产黄色在线网站 | 免费99视频 | 午夜久久久久久久久久久 | 日韩精品一卡 | 人人插人人插 | 91大神精品视频在线观看 | 九九交易行官网 | 久久午夜精品 | 一区二区久久 | 97在线视频网站 | 精品久久久精品 | 中文字幕在线视频一区 | 中文资源在线官网 | 国产精品久久久av久久久 | 超碰人人在 | 天天干天天摸 | 中午字幕在线观看 | 天天操天天干天天操天天干 | 超碰国产在线 | 亚洲在线成人精品 | 91网在线观看 | 免费观看mv大片高清 | 国产成人精品亚洲精品 | 亚洲无吗av | 中文字幕一区2区3区 | 三上悠亚一区二区在线观看 | 亚洲天天摸日日摸天天欢 | www色网站| 国产美女视频免费观看的网站 | 欧美最猛性xxxxx免费 | 欧美日韩啪啪 | 国产精品一区二区在线播放 | 在线观看国产一区二区 | 成人h视频 | 丁香六月久久综合狠狠色 | 国产精品99免视看9 国产精品毛片一区视频 | 日本中文字幕在线 | 成人黄色大片在线观看 | 三级av片 | 一区二区三区不卡在线 | 成年人电影毛片 | 四虎影视成人永久免费观看视频 | 韩国精品一区二区三区六区色诱 | 国产精品18videosex性欧美 | 韩国精品在线观看 | 亚洲精品午夜久久久久久久久久久 | 国产精品 视频 | 操操操操网 | 久久免费视频这里只有精品 | 亚洲精品久久久久久久不卡四虎 | 99精品在线免费观看 | 99精品在线免费视频 | 国产精品 欧美 日韩 | 国产乱码精品一区二区三区介绍 | 久久亚洲专区 | 成人在线观看资源 | 天天色天天射天天干 | 久要激情网| 狠狠艹夜夜干 | 欧美另类性 | 日韩免费在线观看视频 | 二区三区精品 | 亚洲成人精品在线观看 | 狠狠婷婷 | 色福利网站| 成人精品视频久久久久 | 日韩黄视频| 999成人网 | 三级黄色大片在线观看 | 黄色成年| 午夜久久网站 | 97成人在线| 99久久精品日本一区二区免费 | 在线a人片免费观看视频 | 97偷拍在线视频 | 久久久国产精品久久久 | 亚洲午夜精品一区二区三区电影院 | 亚洲视频 一区 | 丁香五月缴情综合网 | 天天射天天操天天干 | 国产成人在线观看 | 亚洲伊人色 | 久久成人一区 | 精品一区精品二区高清 | 欧美午夜久久久 | 国产国产人免费人成免费视频 | 婷婷综合国产 | 亚洲国产精品一区二区尤物区 | 亚洲免费av在线 | 又黄又爽又无遮挡的视频 | 国产精品99久久免费黑人 | 日日操日日插 | 免费三及片| 久久国产热| 欧美性生活小视频 | 国产视频一区二区三区在线 | 久久成人国产精品一区二区 | 97看片吧 | 亚洲精品xx | 天天综合网入口 | 91色吧| 九月婷婷综合网 | 国产精品久久久 | 狠狠狠狠狠操 | 国产精品欧美久久久久三级 | 成人av网站在线观看 | 99在线高清视频在线播放 | 亚洲人天堂 | 色综合久久天天 | 日本中文字幕在线电影 | 黄色毛片视频免费观看中文 | 人人爽久久涩噜噜噜网站 | 日日夜夜天天干 | 伊人中文字幕在线 | 黄色av电影免费观看 | 日韩三级视频在线观看 | 欧美精品久久久久久久久老牛影院 | 美女黄久久| 91在线你懂的 | 国产片网站 | 日韩av中文字幕在线免费观看 | 人人干人人做 | 欧美激情第一区 | 91视频91色| 日日草天天干 | 日韩av在线一区二区 | 亚洲欧美激情插 | 高清一区二区三区 | 日日夜夜天天射 | 午夜视频亚洲 | 亚洲爱视频| 婷婷国产视频 | 中文字幕高清在线 | 免费高清看电视网站 | 色吧久久| 97人人模人人爽人人少妇 | 中文字幕在线视频一区二区 | 国产成人a亚洲精品v | 亚洲www天堂com | 国产精品久久久久久久久久久久 | 欧美日韩在线视频一区二区 | 五月婷网 | 天天射天天干天天 | 久久国产色| 国产精品手机看片 | 国产精品久久网站 | 国产区精品在线 | 日韩素人在线观看 | www.黄色| 久久色网站 | 91亚洲国产成人久久精品网站 | 91九色蝌蚪 | 久久精品成人热国产成 | 国产剧情在线一区 | 国产成人免费网站 | 欧美日韩观看 | 亚洲国产成人精品久久 | 99精品视频免费在线观看 | 久久无码av一区二区三区电影网 | 久久黄色影视 | 瑞典xxxx性hd极品 | 亚洲精品久久久久久久不卡四虎 | 久久久国产精品亚洲一区 | 欧美日韩国产一区二区在线观看 | 国产精品va最新国产精品视频 | 久久久国产精品网站 | 国产女人18毛片水真多18精品 | 欧美天堂久久 | 精品高清美女精品国产区 | 成人黄在线观看 | 日韩视频一区二区三区在线播放免费观看 | 日韩av免费一区二区 | 天天躁日日 | 992tv在线成人免费观看 | 国内精品久久久久久久久久清纯 | 麻豆视频免费入口 | 久久精品福利 | 99久久精品国产一区二区三区 | 久久久五月天 | 99视频在线免费 | 丁香花在线观看视频在线 | 中文字幕精品视频 | 成片免费观看视频 | 亚洲一区二区精品在线 | 久久综合狠狠综合 | 国产精品网站 | 国产精品视频久久 | 久久看片网站 | 久久精品国产精品亚洲 | 日韩欧美国产成人 | 国产 日韩 在线 亚洲 字幕 中文 | 国产精品毛片一区二区三区 | 在线a亚洲视频播放在线观看 | 最近更新的中文字幕 | 久久 国产一区 | 精品伦理一区二区三区 | 三级av免费观看 | 777久久久 | 999久久a精品合区久久久 | 久久免费看a级毛毛片 | 91精品在线视频 | 99视频在线精品 | 国产精品久久久久999 | 欧美成人影音 | 久久久国产99久久国产一 | 成年人看片| 久久久国产网站 | av观看免费在线 | 99久久久久久国产精品 | 国内少妇自拍视频一区 | 天天干天天操天天操 | 中文字幕在线一区二区三区 | 在线日韩中文 | 色婷婷激情网 | 狠狠色丁香久久婷婷综合_中 | 久久伊人八月婷婷综合激情 | 中文字幕在线观看完整版电影 | 久久精品专区 | 四虎影视成人永久免费观看亚洲欧美 | 久久精品国产第一区二区三区 | 国产精品久久一区二区三区不卡 | 99精品国产福利在线观看免费 | 九九热免费精品视频 | 国产一级三级 | 日韩欧美国产免费播放 | 欧美电影黄色 | 国产成人三级一区二区在线观看一 | 婷婷丁香色 | 亚洲一区二区麻豆 | 天天操夜 | 91精品视频导航 | 精品久久中文 | 五月婷网站 | 一区二区三区久久精品 | 久久久久久久久久久免费av | 久久精品亚洲综合专区 | 九九色综合 | 国产精品精品久久久 | 黄色一级大片在线免费看产 | 国产成人一区二区三区免费看 | 色视频在线免费观看 | 二区视频在线观看 | 免费在线观看av | 日躁夜躁狠狠躁2001 | 天天摸天天舔天天操 | 国产精品一区二区三区在线看 | 看污网站 | 亚洲精品视 | 69av国产| 91av电影网 | 亚洲激情六月 | 中文字幕在线免费观看视频 | 在线观看免费日韩 | 亚洲一区二区黄色 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 日韩精品在线一区 | 98涩涩国产露脸精品国产网 | 欧美性生活大片 | www.av免费观看 | 天天久久夜夜 | 欧美日韩在线观看一区 | 久久免费的精品国产v∧ | 午夜视频在线观看一区二区 | 九九视频网站 | 91精品视频免费 | 中文字幕精品一区二区三区电影 | 天天射天 | 五月婷婷综合在线视频 | 免费一级片在线观看 | 2021国产精品视频 | 人人爽人人澡人人添人人人人 | 国产精品伦一区二区三区视频 | 最近中文国产在线视频 | 99电影 | 九九久久视频 | 久久综合九色九九 | 首页国产精品 | 亚洲精品一区二区三区新线路 | 热久久视久久精品18亚洲精品 | 中文在线亚洲 | 在线观看理论 | 欧美在线aa | 久久呀 | 国产精品四虎 | 91精品国产综合久久福利不卡 | 国产黄av | 香蕉视频免费在线播放 | 99视频在线 | 麻豆成人网 | 综合色亚洲 | 亚洲精品久久久久58 | 成人91免费视频 | 久久久久亚洲精品中文字幕 | 久久综合色天天久久综合图片 | 中文字幕av在线电影 | 久久久久久亚洲精品 | 在线有码中文字幕 | 日韩三级视频在线观看 | 人人插超碰 | 中文字幕在线观看你懂的 | 91在线最新 | 亚洲精品88欧美一区二区 | 成人免费一级 | 精品国产乱码久久久久久三级人 | 91丨九色丨高潮 | 激情久久五月 | 91精品视频免费观看 | 午夜精品福利影院 | 久草干 | 91av在线免费观看 | 在线观看91精品国产网站 | 日韩大片在线免费观看 | 精品国产伦一区二区三区观看方式 | 国产91九色视频 | 国产精品综合在线观看 | www.狠狠插.com | 久久久精品午夜 | 91禁在线看 |