银行卡的数字检測

业余瞎搞。废话少说。上代码:

#pragma comment(lib, "libtesseract302.lib")
#pragma comment(lib, "liblept.lib")

#include <iostream>
#include <string>
#include <opencv.hpp>
#include <opencv2highguihighgui.hpp>
#include <tesseractaseapi.h>  
#include <tesseractstrngs.h>  

using namespace std;
cv::Mat image;
string windowsname = "image";
void OnTracker(int thres, void *user)
{
	cv::threshold(image, image, thres, 2.5*thres,CV_THRESH_BINARY);
	cv::imshow(windowsname, image);


	tesseract::TessBaseAPI  api;  
	api.Init(NULL, "eng", tesseract::OEM_DEFAULT);   //识别英文
	api.SetVariable( "tessedit_char_whitelist", "0123456789");//限制识别字符范围  
	api.SetImage(image.data,image.cols, image.rows, image.channels(), image.step);
	if (0==api.Recognize(NULL))
	{	
		STRING str = api.GetUTF8Text();
		printf(str.string());

		string strtemp = str.string();

		while (1)
		{
			int k = strtemp.find_first_of(' ');
			if (k<0||k>=strtemp.length())
			{
				break;
			}
			strtemp.erase(k,1);

		}

		cout << strtemp << endl;
		while(1)
		{
			int k = strtemp.find_first_of('
');
			if (k<0||k>=strtemp.length())
			{
				break;
			}
			string temp = strtemp.substr(0,k);
			cout << temp << endl;
			if (temp.length() > 14)
			{
				cout << "the card numbers is :" << temp << endl;;
				break;
			}
			strtemp.erase(0,k+1);
		}

	}
}

int main()
{
	cv::namedWindow("image", 1);
	image = cv::imread("test.jpg");
	cv::cvtColor(image, image, CV_RGB2GRAY);
	int thres = 100;
	cv::createTrackbar("thres:", "image", &thres, 255, OnTracker);
	cv::imshow(windowsname, image);

	cv::waitKey(0);

	return 0;
}


检測结果例如以下:





对数字3和8偶尔会出现检測不准确的现象


原文地址:https://www.cnblogs.com/claireyuancy/p/6822270.html