印章文字識別


  • 本系列歷程啟發於“禾路老師”的視頻課程,學習到兩個重要知識點:實戰和自己的庫!
  • 本系列歷程多源於answer.opencv論壇的一些牛人的解答,作為小白只是代碼的搬運工。

言歸正傳,請看項目要求:

  • 求取印章的文字識別
  • 圓形規則的文字等
  • 場合應用較為廣泛

印章圖片

思路分析一:

  • 直接利用預處理分割,然后CNN直接搭建學習

思路分析二:

  • 利用直角坐標系到極坐標的轉化,文字轉正
  • 利用投影分割
  • CNN學習

代碼實現:

  • 本博文利用第二種方法,識別精度和效率較高
  1. 預處理找到圓心和半徑,怎么預處理方法太多了,如果有實際項目可以博文留言,大家一起討論!
  2. Cart to Polar Translation
  3. 后期的投影變換之前做過,大家可以看另一篇博文--->>投影變換

預處理得到的圓

matLinearPolar

matLogPolar

#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main( int argc, const char** argv )
{
	Mat img=imread("123.png",0);
	threshold(img,img,200,255,CV_THRESH_BINARY_INV); // to delete some noise
	Mat labels;
	connectedComponents(img, labels, 8, CV_16U);//連通域提取
	Mat maximage = labels == 1;
	maximage.convertTo(maximage, CV_8UC1);
	//找圓的范圍,因為后面minEnclosingCircle函數需要輸入
	Mat locations;
	findNonZero(maximage, locations);
	Point2f center;
	float radius;
	minEnclosingCircle(locations,center,radius);
	Mat showImag = Mat::ones(img.size(),CV_8UC3);
	circle(showImag, center, radius, Scalar(0, 255, 255), 2);
	//---linear Cart to Polar
	Mat matLinearPolar;
	linearPolar(
		img, matLinearPolar,
		center,
		radius, INTER_CUBIC);
	//log Cart to Polar
	Mat matLogPolar;
	cv::logPolar(
		img,
		matLogPolar,
		center,
		radius/3,
		INTER_CUBIC
	);
	threshold(matLinearPolar, matLinearPolar, 0, 255, CV_THRESH_BINARY_INV|THRESH_OTSU);
	threshold(matLogPolar, matLogPolar, 0, 255, CV_THRESH_BINARY_INV|THRESH_OTSU);
	return 0;
}

參考資料:

opencv官網圖片


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM