From 9adb473067a993b4e0eacf3675baf14b29da3eca Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期五, 22 七月 2022 18:44:24 +0800
Subject: [PATCH] '测试'

---
 ConsoleApplication/IndustryCapture.cpp |  299 +++++++++++++++++++++++++++++++++--------------------------
 1 files changed, 167 insertions(+), 132 deletions(-)

diff --git a/ConsoleApplication/IndustryCapture.cpp b/ConsoleApplication/IndustryCapture.cpp
index 333b84d..fe7ce20 100644
--- a/ConsoleApplication/IndustryCapture.cpp
+++ b/ConsoleApplication/IndustryCapture.cpp
@@ -1,5 +1,4 @@
 #include "IndustryCapture.h"
-#include "THSActionUtil.h"
 #include <set>
 #include "Win32Util.h"
 OpenCLExcuter* IndustryCapture::openCLExcuter;
@@ -7,7 +6,10 @@
 
 HWND IndustryCapture::win;
 
+ CallbackFun_Industry IndustryCapture::data_callback;
+ void* IndustryCapture::context;
 
+ bool  IndustryCapture::terminated;
 
 
 RecognitionManager* IndustryCapture::recognitionManager;
@@ -32,11 +34,19 @@
 
 
 
-void IndustryCapture::init() {
+void IndustryCapture::init(CallbackFun_Industry callback, void* contex) {
+	terminated = false;
+	data_callback = callback;
+	context = contex;
 	recognitionManager = new RecognitionManager();
 	openCLExcuter = new OpenCLExcuter();
 	openCLExcuter->init();
-	refreshHWND();
+	try {
+		refreshHWND();
+	}
+	catch (...) {
+	
+	}
 }
 void IndustryCapture::refreshHWND() {
 	HWND hwnd = THSActionUtil::getIndustryWindow();
@@ -60,160 +70,171 @@
 
 
 list<list<IndustryData>> IndustryCapture::captureIndustryCodes(cv::Mat oimg) {
-	cv::Mat grayImg_ = cv::Mat::zeros(oimg.rows, oimg.cols, CV_8UC1);//ImgUtil::grayImage(oimg);
-
-	uchar* imgData = (uchar*)malloc(sizeof(uchar) * oimg.rows * oimg.cols);
-	if (oimg.channels() == 3)
-	{
-		openCLExcuter->rgb2Gray(oimg.data, oimg.cols, oimg.rows, imgData);
-	}
-	else {
-		openCLExcuter->rgba2Gray(oimg.data, oimg.cols, oimg.rows, imgData);
-	}
-	grayImg_.data = imgData;
-	//cv::imwrite("C:\\Users\\Administrator\\Desktop\\ocr\\industry.jpg", grayImg);
+	cv::Mat grayImg_ = grayImgs(oimg);
 
 	GPCodeArea menu = THSActionUtil::splitPlateMenuArea(grayImg_);
 	list<int*> menus = splitMenu(menu, grayImg_);
 
+	free(grayImg_.data);
+	grayImg_.release();
+
 	list<list<IndustryData>> flist;
+
+	int menu_index = 0;
 	
 	for (list<int*>::iterator ele = menus.begin();ele != menus.end();ele++) {
+		menu_index++;
 
 		int x = ((*ele)[0] + (*ele)[2]) / 2;
 		int y = ((*ele)[1] + (*ele)[3]) / 2;
-		//点击   
-		SendMessage(win, WM_LBUTTONDOWN, 0, MAKELONG(x, y));
-		Sleep(10);
-		SendMessage(win, WM_LBUTTONUP, 0, MAKELONG(x, y));
+		if (menu_index > 1)
+		{
+			//点击   
+			SendMessage(win, WM_LBUTTONDOWN, 0, MAKELONG(x, y));
+			Sleep(10);
+			SendMessage(win, WM_LBUTTONUP, 0, MAKELONG(x, y));
+		}
+
 		list<IndustryData> dataList;
-		for (int i = 0;i < 3;i++) {
-			
+		for (int i = 0;i < 10;i++) {
+			if (terminated) {
+				break;
+			}
 			Sleep(500);
 			//截图+灰度化
 			
 			list<IndustryData> itemList;
 
-		    cv::Mat	grayImg = grayImgs(CaptureUtil::capture(win));
-			list<int*> rowData = THSActionUtil::splitPlateRowArea(grayImg);
+			try {
 
-			//每行的元素个数
-			int ele_count_per_line = 2;
-			int* splitResult = (int*)malloc(sizeof(int) * 4 * ele_count_per_line * rowData.size());
-			int* rowIndex = (int*)malloc(sizeof(int) * 4 * rowData.size());
-			int count = 0;
-			for (std::list<int*>::iterator ele = rowData.begin();ele != rowData.end();ele++) {
+				cv::Mat	grayImg = grayImgs(CaptureUtil::capture(win));
+				list<int*> rowData = THSActionUtil::splitPlateRowArea(grayImg);
 
-				string path = "C:\\Users\\Administrator\\Desktop\\ocr\\limit_up\\";
-				path.append(to_string(count)).append(".jpg");
-				//cv::imwrite(path, cv::Mat(grayImg, cv::Rect((*ele)[0], (*ele)[1], (*ele)[2] - (*ele)[0] + 1, (*ele)[3] - (*ele)[1] + 1)));
-				rowIndex[4 * count + 0] = (*ele)[0];
-				rowIndex[4 * count + 1] = (*ele)[1];
-				rowIndex[4 * count + 2] = (*ele)[2];
-				rowIndex[4 * count + 3] = (*ele)[3];
-				free(*ele);
-				count++;
-			}
+				//每行的元素个数
+				int ele_count_per_line = 2;
+				int* splitResult = (int*)malloc(sizeof(int) * 4 * ele_count_per_line * rowData.size());
+				int* rowIndex = (int*)malloc(sizeof(int) * 4 * rowData.size());
+				int count = 0;
+				for (std::list<int*>::iterator ele = rowData.begin();ele != rowData.end();ele++) {
 
-			int line_number_count = ele_count_per_line * 6;
-
-			openCLExcuter->splitPlateContentRowData(grayImg.data, grayImg.cols, grayImg.rows, rowIndex, rowData.size(), ele_count_per_line, 1, 2, splitResult);
-
-			//分割数字
-			unsigned char* zeroData = (unsigned char*)malloc(sizeof(unsigned char) * _NUMBER_GP_CODE_WIDTH * _NUMBER_GP_CODE_HEIGHT);
-			for (int r = 0;r < _NUMBER_GP_CODE_HEIGHT;r++) {
-				for (int c = 0;c < _NUMBER_GP_CODE_WIDTH;c++)
-				{
-					zeroData[r * _NUMBER_GP_CODE_WIDTH + c] = ImgUtil::NUMS_GP_CODE[0].data.ptr<uchar>(r)[c];
-				}
-			}
-			unsigned char* totalNumberData = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_GP_CODE_HEIGHT * rowData.size()) * _NUMBER_GP_CODE_WIDTH * 10 * line_number_count);
-
-			UcharDataInfo typesData = UcharDataInfo();
-			unsigned char types[] = { NUM_TYPE_CODE,NUM_TYPE_MONEY};
-			typesData.length = 2;
-			typesData.data = types;
-
-			openCLExcuter->splitPlateNum(grayImg, IntDataInfo({ splitResult,(int) (ele_count_per_line * rowData.size()) }), UcharDataInfo({ totalNumberData, -1 }), typesData, zeroData, _NUMBER_GP_CODE_WIDTH, _NUMBER_GP_CODE_HEIGHT, ele_count_per_line, 6);
-
-
-
-
-			//识别数字
-			uchar* templateNums = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_GP_CODE_HEIGHT * rowData.size()) * _NUMBER_GP_CODE_WIDTH * 10 * line_number_count);
-			openCLExcuter->createNumberTemplates(rowData.size(), _NUMBER_GP_CODE_WIDTH, _NUMBER_GP_CODE_HEIGHT, line_number_count, ImgUtil::numsOneLevel_gpcode, templateNums);
-			uchar** numberResult = openCLExcuter->recognition_numbers(totalNumberData, templateNums, rowData.size() * _NUMBER_GP_CODE_HEIGHT, _NUMBER_GP_CODE_WIDTH * 10 * line_number_count, _NUMBER_GP_CODE_WIDTH, _NUMBER_GP_CODE_HEIGHT, line_number_count);
-
-			for (int i = 0;i < rowData.size();i++) {
-				IndustryData industryData = IndustryData();
-				string code = "";
-				for (int j = 0;j < 6;j++)
-				{
-					code.append(to_string(numberResult[i][6*1+j]));
+					string path = "C:\\Users\\Administrator\\Desktop\\ocr\\limit_up\\";
+					path.append(to_string(count)).append(".jpg");
+					//cv::imwrite(path, cv::Mat(grayImg, cv::Rect((*ele)[0], (*ele)[1], (*ele)[2] - (*ele)[0] + 1, (*ele)[3] - (*ele)[1] + 1)));
+					rowIndex[4 * count + 0] = (*ele)[0];
+					rowIndex[4 * count + 1] = (*ele)[1];
+					rowIndex[4 * count + 2] = (*ele)[2];
+					rowIndex[4 * count + 3] = (*ele)[3];
+					free(*ele);
+					count++;
 				}
 
-				string money = "";
-				for (int j = 0;j < 6;j++)
-				{
-					if (j == 4) {
-						money.append(".");
+				int  length_per_num = 6;
+
+				int line_number_count = ele_count_per_line * length_per_num;
+
+				openCLExcuter->splitPlateContentRowData(grayImg.data, grayImg.cols, grayImg.rows, rowIndex, rowData.size(), ele_count_per_line, 1, 2, splitResult);
+
+				//分割数字
+				unsigned char* zeroData = (unsigned char*)malloc(sizeof(unsigned char) * _NUMBER_GP_CODE_WIDTH * _NUMBER_GP_CODE_HEIGHT);
+				for (int r = 0;r < _NUMBER_GP_CODE_HEIGHT;r++) {
+					for (int c = 0;c < _NUMBER_GP_CODE_WIDTH;c++)
+					{
+						zeroData[r * _NUMBER_GP_CODE_WIDTH + c] = ImgUtil::NUMS_GP_CODE[0].data.ptr<uchar>(r)[c];
 					}
-					money.append(to_string(numberResult[i][ j]));
 				}
+				unsigned char* totalNumberData = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_GP_CODE_HEIGHT * rowData.size()) * _NUMBER_GP_CODE_WIDTH * 10 * line_number_count);
 
-				industryData.index = i;
-				industryData.code = code;
-				industryData.zyltMoney = money;
-				itemList.push_back(industryData);
-				free(numberResult[i]);
-			}
-			free(numberResult);
-			int* unitData = (int*)malloc(sizeof(int) * 4 * rowData.size());
+				UcharDataInfo typesData = UcharDataInfo();
+				unsigned char types[] = { NUM_TYPE_MONEY,NUM_TYPE_CODE };
+				typesData.length = 2;
+				typesData.data = types;
+
+				openCLExcuter->splitPlateNum(grayImg, IntDataInfo({ splitResult,(int)(ele_count_per_line * rowData.size()) }), UcharDataInfo({ totalNumberData, -1 }), typesData, zeroData, _NUMBER_GP_CODE_WIDTH, _NUMBER_GP_CODE_HEIGHT, ele_count_per_line, length_per_num);
 
 
 
-			//识别金额单位
-			int index = 0;
-			for (list<IndustryData>::iterator ele = itemList.begin();ele != itemList.end();ele++) {
-				unitData[index * 4 + 0] = splitResult[(*ele).index * 4 * ele_count_per_line + 4 * 0 + 0];
-				unitData[index * 4 + 1] = splitResult[(*ele).index * 4 * ele_count_per_line + 4 * 0 + 1];
-				unitData[index * 4 + 2] = splitResult[(*ele).index * 4 * ele_count_per_line + 4 * 0 + 2];
-				unitData[index * 4 + 3] = splitResult[(*ele).index * 4 * ele_count_per_line + 4 * 0 + 3];
-				string path = "C:\\Users\\Administrator\\Desktop\\ocr\\limit_up\\";
-				path.append(to_string(index)).append("_1.jpg");
-				//cv::imwrite(path, cv::Mat(grayImg,cv::Rect(unitData[index * 4 + 0], unitData[index * 4 + 1], unitData[index * 4 + 2]- unitData[index * 4 + 0]+1, unitData[index * 4 + 3]- unitData[index * 4 + 1]+1)));
 
-				index++;
-			}
-			int* unitResult = (int*)malloc(sizeof(int) * itemList.size());
-			openCLExcuter->recognitionPlateMoneyUnit(grayImg.data, grayImg.cols, grayImg.rows, unitData, 1, itemList.size(), unitResult);
-			index = 0;
-			for (list<IndustryData>::iterator ele = itemList.begin();ele != itemList.end();ele++) {
-				switch (unitResult[index])
-				{
-				case 0:
-					(*ele).zyltMoneyUnit = MONEY_UNIT_Y;
-					break;
-				case 1:
-					(*ele).zyltMoneyUnit = MONEY_UNIT_W;
-					break;
-				default:
-					break;
+				//识别数字
+				uchar* templateNums = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_GP_CODE_HEIGHT * rowData.size()) * _NUMBER_GP_CODE_WIDTH * 10 * line_number_count);
+				openCLExcuter->createNumberTemplates(rowData.size(), _NUMBER_GP_CODE_WIDTH, _NUMBER_GP_CODE_HEIGHT, line_number_count, ImgUtil::numsOneLevel_gpcode, templateNums);
+				uchar** numberResult = openCLExcuter->recognition_numbers(totalNumberData, templateNums, rowData.size() * _NUMBER_GP_CODE_HEIGHT, _NUMBER_GP_CODE_WIDTH * 10 * line_number_count, _NUMBER_GP_CODE_WIDTH, _NUMBER_GP_CODE_HEIGHT, line_number_count);
+
+				for (int i = 0;i < rowData.size();i++) {
+					IndustryData industryData = IndustryData();
+					string code = "";
+					for (int j = 0;j < length_per_num;j++)
+					{
+						code.append(to_string(numberResult[i][6 * 1 + j]));
+					}
+
+					string money = "";
+					for (int j = 0;j < length_per_num;j++)
+					{
+						if (j == 4) {
+							money.append(".");
+						}
+						money.append(to_string(numberResult[i][j]));
+					}
+
+					industryData.index = i;
+					industryData.code = code;
+					industryData.zyltMoney = money;
+					itemList.push_back(industryData);
+					free(numberResult[i]);
 				}
-				index++;
+				free(numberResult);
+				int* unitData = (int*)malloc(sizeof(int) * 4 * rowData.size());
+
+
+
+				//识别金额单位
+				int index = 0;
+				for (list<IndustryData>::iterator ele = itemList.begin();ele != itemList.end();ele++) {
+					unitData[index * 4 + 0] = splitResult[(*ele).index * 4 * ele_count_per_line + 4 * 0 + 0];
+					unitData[index * 4 + 1] = splitResult[(*ele).index * 4 * ele_count_per_line + 4 * 0 + 1];
+					unitData[index * 4 + 2] = splitResult[(*ele).index * 4 * ele_count_per_line + 4 * 0 + 2];
+					unitData[index * 4 + 3] = splitResult[(*ele).index * 4 * ele_count_per_line + 4 * 0 + 3];
+					string path = "C:\\Users\\Administrator\\Desktop\\ocr\\limit_up\\";
+					path.append(to_string(index)).append("_1.jpg");
+					//cv::imwrite(path, cv::Mat(grayImg,cv::Rect(unitData[index * 4 + 0], unitData[index * 4 + 1], unitData[index * 4 + 2]- unitData[index * 4 + 0]+1, unitData[index * 4 + 3]- unitData[index * 4 + 1]+1)));
+
+					index++;
+				}
+				int* unitResult = (int*)malloc(sizeof(int) * itemList.size());
+				openCLExcuter->recognitionPlateMoneyUnit(grayImg.data, grayImg.cols, grayImg.rows, unitData, 1, itemList.size(), unitResult);
+				index = 0;
+				for (list<IndustryData>::iterator ele = itemList.begin();ele != itemList.end();ele++) {
+					switch (unitResult[index])
+					{
+					case 0:
+						(*ele).zyltMoneyUnit = MONEY_UNIT_Y;
+						break;
+					case 1:
+						(*ele).zyltMoneyUnit = MONEY_UNIT_W;
+						break;
+					default:
+						break;
+					}
+					index++;
+				}
+		
+				free(rowIndex);
+				free(splitResult);
+				free(zeroData);
+				free(totalNumberData);
+				free(templateNums);
+				free(unitData);
+				free(unitResult);
+				free(grayImg.data);
+				grayImg.release();
+
+
+				for (list<IndustryData>::iterator el = itemList.begin();el != itemList.end();el++) {
+					dataList.push_back(*el);
+				}
 			}
-			free(rowIndex);
-			free(splitResult);
-			free(zeroData);
-			free(templateNums);
-			free(unitData);
-			free(unitResult);
-			free(grayImg.data);
-			grayImg.release();
-
-
-			for (list<IndustryData>::iterator el = itemList.begin();el != itemList.end();el++) {
-				dataList.push_back(*el);
+			catch (...) {
+			
 			}
 
 			int x = oimg.cols - 50;
@@ -228,8 +249,12 @@
 			Sleep(10);
 			SendMessage(win, WM_MOUSEWHEEL, 0, MAKELONG(x, y));
 		}
-
+		data_callback(dataList, context);
 		flist.push_back(dataList);
+		//break;
+		if (terminated) {
+			break;
+		}
 	}
 
 	return flist;
@@ -240,6 +265,7 @@
 list<list<IndustryData>> IndustryCapture::captureIndustryCodes() {
 	list<list<IndustryData>> flist;
 	set<string> codesSet;
+   //测试
 	for (int i = 0;i < 3;i++) {
 		Sleep(1000);
 		cv::Mat oimg = CaptureUtil::capture(win);
@@ -247,17 +273,26 @@
 		for (list<list<IndustryData>>::iterator el = codes.begin();el != codes.end();el++) {
 			flist.push_back(*el);
 		}
+		if (terminated) {
+			break;
+		}
+		//滑动到下一页
 		RECT rect;
 		GetWindowRect(win, &rect);
-		SendMessage(win, WM_LBUTTONDOWN, 0, MAKELONG(20, 100));
+		SendMessage(win, WM_LBUTTONDOWN, 0, MAKELONG(50, 100));
 		Sleep(10);
-		SendMessage(win, WM_LBUTTONUP, 0, MAKELONG(20, 100));
+		SendMessage(win, WM_LBUTTONUP, 0, MAKELONG(50, 100));
 		Sleep(10);
-		SendMessage(win, WM_MOUSEWHEEL, 0, MAKEWORD(20, 100));
+		SendMessage(win, WM_MOUSEWHEEL, 0, MAKEWORD(50, 100));
 	}
+	terminated = false;
 	return flist;
 }
 
 bool IndustryCapture::isInited() {
 	return inited;
-}
\ No newline at end of file
+}
+
+void IndustryCapture::stop() {
+	terminated = true;
+}

--
Gitblit v1.8.0