最近工作中需要用到图像文字识别,但由于图像比较大需要识别的文字比较多,所以全图识别的话效果不好,所以需要对文字区域进行检测提取,再进行识别。
功能需要用.net实现,自己对图像识别方面并不熟悉,于是上网找资料发现Python方面的资料比较多,但C#方面的资料真是少之又少。找到的参考文章
https://blog.csdn.net/huobanjishijian/article/details/63685503
写的比较详细。
首先想到的是用C#调用Python程序,但是实践以后发现速度比较慢,由于处理的图片比较多,所以放弃了这种方法。
由于C#也有相应的opencv库,所以最终准备根据Python代码重写C#代码。
先在工具 – nuget中搜索安装OpenCVSharp3,注意OpenCVSharp4也已经有了,但是代码与OpenCVSharp3有较大区别,并且OpenCVSharp3与Python代码的方法比较接近,所以选择OpenCVSharp3。
原理请大家主要看原文章,写的很详细了,这里贴出一部分源码,如需完整代码,请查看我的资源或者github
https://github.com/jsnjfz/OpenCVSharpDemo.git
//读取灰度图
using (Mat src = new Mat(imgPath, ImreadModes.Grayscale))
{
//1.Sobel算子,x方向求梯度
Mat sobel = new Mat();
Cv2.Sobel(src, sobel, MatType.CV_8U, 1, 0, 3);
//2.二值化
Mat binary = new Mat();
Cv2.Threshold(sobel, binary, 0, 255, ThresholdTypes.Otsu | ThresholdTypes.Binary);
//3. 膨胀和腐蚀操作的核函数
Mat element1 = new Mat();
Mat element2 = new Mat();
OpenCvSharp.Size size1 = new OpenCvSharp.Size(30, 9);
OpenCvSharp.Size size2 = new OpenCvSharp.Size(24, 6);
element1 = Cv2.GetStructuringElement(MorphShapes.Rect, size1);
element2 = Cv2.GetStructuringElement(MorphShapes.Rect, size2);
//4. 膨胀一次,让轮廓突出
Mat dilation = new Mat();
Cv2.Dilate(binary, dilation, element2);
//5. 腐蚀一次,去掉细节,如表格线等。注意这里去掉的是竖直的线
Mat erosion = new Mat();
Cv2.Erode(dilation, erosion, element1);
//6. 再次膨胀,让轮廓明显一些
Cv2.Dilate(erosion, dilation2, element2, null, 3);
}
识别效果如图,和原文章一致,经测试批量识别效果也可以接受
转载请注明来源。
版权声明:本文为dangmao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。