From 3680049029e6a193eae069596be04ce0fb2b1303 Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期六, 05 十一月 2022 17:19:55 +0800
Subject: [PATCH] '增加l2稳定性'

---
 ConsoleApplication/L2DataCapture.cpp |  112 ++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 76 insertions(+), 36 deletions(-)

diff --git a/ConsoleApplication/L2DataCapture.cpp b/ConsoleApplication/L2DataCapture.cpp
index e51bf89..186fb44 100644
--- a/ConsoleApplication/L2DataCapture.cpp
+++ b/ConsoleApplication/L2DataCapture.cpp
@@ -5,6 +5,11 @@
 #include <thread>
 #include "TaskChecker.h"
 #include "GPUtil.h"
+#include "LogUtil.h"
+
+//#define malloc(size) malloc(size)
+//#define free(ptr) free(ptr)
+
 bool L2DataCapture::inited;
 bool L2DataCapture::tradeTimeCapture;
 
@@ -25,8 +30,6 @@
 string L2DataCapture::gpCodes[THS_FRAME_COUNT];
 
 void* L2DataCapture::context;
-
-
 
 //运行
 void L2DataCapture::_run(int index)
@@ -49,13 +52,32 @@
 			try {
 				clock_t start = clock();
 				cv::Mat mat = CaptureUtil::capture(index, CAPTURE_TYPE_L2);
+				if (mat.cols <= 400 || mat.rows <= 1800) {
+					mat.release();
+					mat = NULL;
+					Sleep(100);
+					throw string("截图出错");
+				}
+
 				list<TradeData> resultList = captureLevel2TradeData(mat, index);
 				long processTime = clock() - start;
 				data_callback(index, code, start , processTime, resultList, context);
 				cout << "时间消耗:" << processTime << endl;
 			}
+			catch (string st) {
+			   //delete (openCLExcuter[index]);
+			   //openCLExcuter[index] = new OpenCLExcuter();
+			   //openCLExcuter[index]->init();
+				LogUtil::getInstance()->getL2Logger().error(string("识别出错:").append(st));
+			}
+			catch (int error_code) {
+				LogUtil::getInstance()->getL2Logger().error(string("识别出错:code-").append(to_string(error_code)));
+			}
+			catch (exception& e) {
+				LogUtil::getInstance()->getL2Logger().error(string("识别出错:").append(e.what()));
+			}
 			catch (...) {
-
+				LogUtil::getInstance()->getL2Logger().error(string("识别出错:").append("未知错误"));
 			}
 		}
 		Sleep(2);
@@ -189,7 +211,7 @@
 	return inited;
 }
 
-list<TradeData>  L2DataCapture::captureLevel2TradeData(cv::Mat oimg, int identify) {
+list<TradeData>  L2DataCapture::captureLevel2TradeData(cv::Mat& oimg, int identify) {
 	if (oimg.rows == 0 || oimg.cols == 0) {
 		throw ERROR_CODE_CAPTURE_FAIL;
 	}
@@ -203,17 +225,20 @@
 	return resultList;
 }
 
-list<TradeData> L2DataCapture::captureLevel2TradeData(OpenCLExcuter* openCLExcuter, cv::Mat oimg, int identify)
+list<TradeData> L2DataCapture::captureLevel2TradeData(OpenCLExcuter* openCLExcuter, cv::Mat& oimg, int identify)
 {
+
+	if (oimg.cols <= 0 || oimg.rows <= 0) {
+		throw string("图像数据错误");
+	}
 
 	//LogUtil::debug("截图完成");
 	clock_t time_1 = clock();
 	//std::cout << "截图完成: threadid-" << std::this_thread::get_id() << " 耗时:" << (time_1 - starttime) << endl;
 
 	//灰度化
-	cv::Mat img = cv::Mat::zeros(oimg.rows, oimg.cols, CV_8UC1);//ImgUtil::grayImage(oimg);
+	cv::Mat img = cv::Mat::zeros(oimg.rows, oimg.cols, CV_8UC1);
 
-	uchar* imgData = (uchar*)malloc(sizeof(uchar) * oimg.rows * oimg.cols);
 	//
 	if (oimg.channels() == 1) {
 		//黑白图片
@@ -223,26 +248,21 @@
 		try {
 			if (oimg.channels() == 3)
 			{
-				openCLExcuter->rgb2Gray(oimg, imgData);
+				openCLExcuter->rgb2Gray(oimg, img.data);
 			}
 			else {
-				openCLExcuter->rgba2Gray(oimg, imgData);
+				openCLExcuter->rgba2Gray(oimg, img.data);
 			}
+			oimg.release();
 		}
 		catch (...) {
-
-			cv::imwrite("D:\\imgs\\l2.png", oimg);
-
-			if (imgData != NULL)
-			{
-				free(imgData);
-			}
-			imgData = NULL;
 			oimg.release();
+			oimg = NULL;
+			img.release();
+			img = NULL;
 			throw string("灰度出错");
 		}
-		img.data = imgData;
-		oimg.release();
+		//img.data = imgData;
 		clock_t time_2_ = clock();
 		if (identify == 0)
 		{
@@ -267,10 +287,8 @@
 		}
 	}
 	catch (...) {
-		//释放内存
-		free(imgData);
-		imgData = NULL;
-
+		img.release();
+		img = NULL;
 		throw int(ERROR_CODE_DIVIDE_IMG_FAIL);
 	}
 	//一维行图像数据
@@ -293,9 +311,10 @@
 		free(rowDataOneLevel);
 	}
 	catch (...) {
+		img.release();
+		img = NULL;
 		free(rowDataOneLevel);
 		free(rowSplitDataOneLevel);
-		free(imgData);
 		throw string("图片分隔出错");
 	}
 	
@@ -474,10 +493,17 @@
 	clock_t time_33 = clock();
 	if (identify == 0)
 		std::cout << "数据准备-0数据准备: threadid-" << std::this_thread::get_id() << " 耗时:" << time_33 - time_32 << "总耗时:" << time_33 - time_1 << endl;
-
-	openCLExcuter->splitL2Num(imgData, img.cols, img.rows, pos, 4 * rowDataList.size(), zeroData, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, _NUMBER_L2_TOTAL_NUMBER, totalNumberData);
-	free(zeroData);
-	free(pos);
+	try {
+		openCLExcuter->splitL2Num(img.data, img.cols, img.rows, pos, 4 * rowDataList.size(), zeroData, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, _NUMBER_L2_TOTAL_NUMBER, totalNumberData);
+		free(zeroData);
+		free(pos);
+	}
+	catch (...) {
+		free(zeroData);
+		free(pos);
+		free(totalNumberData);
+		throw string("splitL2Num出错");
+	}
 
 
 
@@ -496,8 +522,15 @@
 
 	//准备模板数字
 	uchar* templateNums = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_L2_HEIGHT * rowDataList.size()) * _NUMBER_L2_WIDTH * 10 * _NUMBER_L2_TOTAL_NUMBER);
+	try {
+		openCLExcuter->createNumberTemplates(rowDataList.size(), _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, _NUMBER_L2_TOTAL_NUMBER, ImgUtil::numsOneLevel_level2, templateNums);
+	}
+	catch (...) {
+		free(totalNumberData);
+		free(templateNums);
+		throw string("创建数据模板出错");
 
-	openCLExcuter->createNumberTemplates(rowDataList.size(), _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, _NUMBER_L2_TOTAL_NUMBER, ImgUtil::numsOneLevel_level2, templateNums);
+	}
 
 	//ImgUtil::createTemplateNumData(data.size());
 	clock_t time_4 = clock();
@@ -520,12 +553,21 @@
 	}
 	*/
 
-
+	uchar** numberResult=nullptr;
 	//数字识别
-	uchar** numberResult = openCLExcuter->recognition_numbers(totalNumberData, templateNums, rowDataList.size() * _NUMBER_L2_HEIGHT, _NUMBER_L2_WIDTH * 10 * _NUMBER_L2_TOTAL_NUMBER, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, _NUMBER_L2_TOTAL_NUMBER);
-	//释放内存
-	free(totalNumberData);
-	free(templateNums);
+	try {
+		 numberResult = openCLExcuter->recognition_numbers(totalNumberData, templateNums, rowDataList.size() * _NUMBER_L2_HEIGHT, _NUMBER_L2_WIDTH * 10 * _NUMBER_L2_TOTAL_NUMBER, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, _NUMBER_L2_TOTAL_NUMBER);
+		//释放内存
+		free(totalNumberData);
+		free(templateNums);
+	}
+	catch (...) {
+		//释放内存
+		free(totalNumberData);
+		free(templateNums);
+		throw string("数字识别出错");
+	}
+
 	//循环读取数字
 	list<TradeData>::iterator tradeEle;
 	index = 0;
@@ -571,8 +613,6 @@
 		std::cout << "数字识别完成: threadid-" << std::this_thread::get_id() << " 耗时:" << time_6 - time_5 << "总耗时:" << time_6 - time_1 << endl;
 
 	//释放内存
-	//img.release();
-	free(imgData);
 	img.release();
 	rowDataList.clear();
 	list<int*>().swap(rowDataList);

--
Gitblit v1.8.0