From 67a5e3d825fde17b7b00906ce42b0bd8cafebc4e Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期四, 18 八月 2022 18:22:14 +0800
Subject: [PATCH] '完善'

---
 ConsoleApplication/TradeListCapture.cpp |  502 +++++++++++++++++++++++++++++--------------------------
 1 files changed, 263 insertions(+), 239 deletions(-)

diff --git a/ConsoleApplication/TradeListCapture.cpp b/ConsoleApplication/TradeListCapture.cpp
index 8a454f4..a74550a 100644
--- a/ConsoleApplication/TradeListCapture.cpp
+++ b/ConsoleApplication/TradeListCapture.cpp
@@ -25,11 +25,16 @@
 		//1s一次
 		if (running_s && inited) {
 			clock_t start = clock();
-			list<TradeSuccessData> datas = captureTradeSuccessInfo();
-			cout << "耗时:" << clock() - start << "  数量:" << datas.size() << endl;
-			data_callback_success(datas, context);
-			datas.clear();
-			Sleep(500);
+			try {
+				list<TradeSuccessData> datas = captureTradeSuccessInfo();
+				cout << "耗时:" << clock() - start << "  数量:" << datas.size() << endl;
+				data_callback_success(datas, context);
+				datas.clear();
+			}
+			catch (...) {
+
+			}
+			Sleep(10);
 		}
 		else {
 			Sleep(2000);
@@ -43,12 +48,17 @@
 		//1s一次
 		if (running_d && inited) {
 			clock_t start = clock();
-			list<TradeDelegateData> datas = captureTradeDelegateInfo();
-			string money = getAvaiableMoney();
-			cout << "耗时:" << clock() - start << "  数量:" << datas.size() << endl;
-			data_callback_delegate(datas, money, context);
-			datas.clear();
-			Sleep(100);
+			try {
+				list<TradeDelegateData> datas = captureTradeDelegateInfo();
+				string money = getAvaiableMoney();
+				cout << "耗时:" << clock() - start << "  数量:" << datas.size() << endl;
+				data_callback_delegate(datas, money, context);
+				datas.clear();
+			}
+			catch (...) {
+
+			}
+			Sleep(5);
 		}
 		else {
 			Sleep(2000);
@@ -209,6 +219,11 @@
 	}
 	if (rowData.size() < 2)
 	{
+		free(grayImg.data);
+		grayImg.release();
+		for (list<int*>::iterator ele = rowData.begin();ele != rowData.end();ele++) {
+			free(*ele);
+		}
 		return dataList;
 	}
 	//去头去尾
@@ -331,6 +346,8 @@
 		priceCode = new char[20];
 		sprintf_s(priceCode, price.length(), "%.2lf", stod(price));
 		std::string _str(priceCode);
+		delete[] priceCode;
+
 		price = _str;
 
 		//金额
@@ -347,6 +364,7 @@
 		chCode = new char[20];
 		sprintf_s(chCode, money.length(), "%.2lf", stod(money));
 		std::string str(chCode);
+		delete[] chCode;
 		money = str;
 
 		//合同编号
@@ -396,7 +414,7 @@
 		free(numberResult[i]);
 	}
 
-
+	free(totalNumberData);
 	free(numberResult);
 	free(rowIndex);
 	free(splitResult);
@@ -423,249 +441,255 @@
 list<TradeDelegateData> TradeListCapture::captureTradeDelegateInfo(cv::Mat oimg) {
 
 	cv::Mat grayImg = grayImgs(oimg);
-	list<TradeDelegateData> dataList;
-	//分隔元素
-	int empty_start = -1;
-	int empty_end = -1;
-	int data_start = -1;
-	int data_end = -1;
-	list<int*> rowData;
-	for (int r = 0;r < grayImg.rows;r++) {
-		if (ImgDivider::isRowEmpty(grayImg, r, 0, 50)) {
 
-			if (empty_start < 0) {
-				empty_start = r;
-				empty_end = r;
+		list<TradeDelegateData> dataList;
+		//分隔元素
+		int empty_start = -1;
+		int empty_end = -1;
+		int data_start = -1;
+		int data_end = -1;
+		list<int*> rowData;
+		for (int r = 0;r < grayImg.rows;r++) {
+			if (ImgDivider::isRowEmpty(grayImg, r, 0, 50)) {
+
+				if (empty_start < 0) {
+					empty_start = r;
+					empty_end = r;
+				}
+				else {
+					empty_end = r;
+				}
+				if (data_start > -1 && data_end > -1 && data_end - data_start > 5) {
+					printf("%d-%d\n", data_start, data_end);
+					int* d = (int*)malloc(sizeof(int) * 2);
+					d[0] = data_start;
+					d[1] = data_end;
+					rowData.push_back(d);
+					data_start = -1;
+					data_end = -1;
+				}
 			}
 			else {
-				empty_end = r;
-			}
-			if (data_start > -1 && data_end > -1 && data_end - data_start > 5) {
-				printf("%d-%d\n", data_start, data_end);
-				int* d = (int*)malloc(sizeof(int) * 2);
-				d[0] = data_start;
-				d[1] = data_end;
-				rowData.push_back(d);
-				data_start = -1;
-				data_end = -1;
-			}
-		}
-		else {
-			empty_start = -1;
-			empty_end = -1;
+				empty_start = -1;
+				empty_end = -1;
 
-			if (data_start < 0) {
-				data_start = r;
-				data_end = r;
-			}
-			else {
-				data_end = r;
-			}
-		}
-	}
-	if (rowData.size() < 2)
-	{
-		return dataList;
-	}
-
-	//去头去尾
-	list<int*>::iterator start = rowData.begin();
-	list<int*>::iterator end = rowData.end();
-	free(*start);
-	rowData.erase(start);
-	std::advance(end, -1);
-	free(*end);
-	rowData.erase(end);
-
-	int* rowIndex = (int*)malloc(sizeof(int) * rowData.size() * 4);
-
-	int index = 0;
-	for (list<int*>::iterator ele = rowData.begin();ele != rowData.end();ele++) {
-		rowIndex[index * 4 + 0] = 0;
-		rowIndex[index * 4 + 1] = (*ele)[0];
-		rowIndex[index * 4 + 2] = grayImg.cols - 1;
-		rowIndex[index * 4 + 3] = (*ele)[1];
-		free(*ele);
-		index++;
-	}
-
-
-	int ele_count_per_line = 7;
-	int length_per_num = 8;
-
-
-	int* splitResult = (int*)malloc(sizeof(int) * 4 * ele_count_per_line * rowData.size());
-
-	openCLExcuter->splitPlateContentRowData(grayImg.data, grayImg.cols, grayImg.rows, rowIndex, rowData.size(), ele_count_per_line, 0, 6, splitResult);
-
-	if (false) {
-		//保存分隔结果
-		for (int i = 0;i < rowData.size();i++) {
-			int start = i * ele_count_per_line * 4;
-			for (int j = 0;j < ele_count_per_line;j++)
-			{
-
-				int startx = splitResult[start];
-				int starty = splitResult[start + 1];
-				int endx = splitResult[start + 2];
-				int endy = splitResult[start + 3];
-				start += 4;
-				string path = "C:\\Users\\Administrator\\Desktop\\ocr\\trade\\";
-				path.append(to_string(i)).append("_").append(to_string(j)).append(".jpg");
-				cv::imwrite(path, cv::Mat(grayImg, cv::Rect(startx, starty, endx - startx + 1, endy - starty + 1)));
-			}
-		}
-	}
-
-
-	//分割数字
-	unsigned char* zeroData = (unsigned char*)malloc(sizeof(unsigned char) * _NUMBER_L2_WIDTH * _NUMBER_L2_HEIGHT);
-	for (int r = 0;r < _NUMBER_L2_HEIGHT;r++) {
-		for (int c = 0;c < _NUMBER_L2_WIDTH;c++)
-		{
-			zeroData[r * _NUMBER_L2_WIDTH + c] = ImgUtil::NUMS_LEVEL2[0].data.ptr<uchar>(r)[c];
-		}
-	}
-
-	int line_number_count = ele_count_per_line * length_per_num;
-
-	unsigned char* totalNumberData = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_L2_HEIGHT * rowData.size()) * _NUMBER_L2_WIDTH * 10 * line_number_count);
-
-	UcharDataInfo typesData = UcharDataInfo();
-	unsigned char types[] = { NUM_TYPE_TIME,NUM_TYPE_CODE,NUM_TYPE_CODE,NUM_TYPE_PRICE,NUM_TYPE_PRICE,NUM_TYPE_CODE, NUM_TYPE_CODE };
-	typesData.length = ele_count_per_line;
-	typesData.data = types;
-
-	openCLExcuter->splitL2NumNew(grayImg, IntDataInfo({ splitResult,(int)(ele_count_per_line * rowData.size()) }), UcharDataInfo({ totalNumberData, -1 }), typesData, zeroData, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, ele_count_per_line, length_per_num);
-
-
-
-
-
-	//识别数字
-	uchar* templateNums = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_L2_HEIGHT * rowData.size()) * _NUMBER_L2_WIDTH * 10 * line_number_count);
-	openCLExcuter->createNumberTemplates(rowData.size(), _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, line_number_count, ImgUtil::numsOneLevel_level2, templateNums);
-	uchar** numberResult = openCLExcuter->recognition_numbers(totalNumberData, templateNums, rowData.size() * _NUMBER_L2_HEIGHT, _NUMBER_L2_WIDTH * 10 * line_number_count, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, line_number_count);
-
-	for (int i = 0;i < rowData.size();i++) {
-		TradeDelegateData delegateData = TradeDelegateData();
-		//时间
-		string time = "";
-		for (int j = length_per_num - 6;j < length_per_num;j++)
-		{
-			if (j - (length_per_num - 6) == 2 || j - (length_per_num - 6) == 4)
-				time.append(":");
-			time.append(to_string(numberResult[i][length_per_num * 0 + j]));
-		}
-
-		//代码
-		string code = "";
-		for (int j = length_per_num - 6;j < length_per_num;j++)
-		{
-			code.append(to_string(numberResult[i][length_per_num * 1 + j]));
-		}
-
-
-		//委托数量
-		string num = "";
-		for (int j = 0;j < length_per_num;j++)
-		{
-			num.append(to_string(numberResult[i][length_per_num * 2 + j]));
-		}
-		num = to_string(stoi(num));
-
-
-		//委托价格
-		string delegate_price = "";
-		for (int j = 0;j < length_per_num;j++)
-		{
-			if(length_per_num-j==3)
-				delegate_price.append(".");
-			delegate_price.append(to_string(numberResult[i][length_per_num * 3 + j]));
-		}
-		delegate_price = to_string(stod(delegate_price));
-		char* chCode;
-		chCode = new char[20];
-		sprintf_s(chCode, delegate_price.length(), "%.3lf", stod(delegate_price));
-		std::string delegate_price_str(chCode);
-
-		delegate_price = delegate_price_str;
-
-
-		//成交均价
-		string percent_price = "";
-		for (int j = 0;j < length_per_num;j++)
-		{
-			if (length_per_num - j == 3)
-				percent_price.append(".");
-			percent_price.append(to_string(numberResult[i][length_per_num * 4 + j]));
-		}
-
-		chCode = new char[20];
-		sprintf_s(chCode, percent_price.length(), "%.3lf", stod(percent_price));
-		std::string percent_price_str(chCode);
-
-		percent_price = percent_price_str;
-
-
-		//成交数量
-		string success_num = "";
-		for (int j = 0;j < length_per_num;j++)
-		{
-			success_num.append(to_string(numberResult[i][length_per_num * 5 + j]));
-		}
-		success_num = to_string(stoi(success_num));
-
-
-		//买入卖出
-		int start = i * 4 * ele_count_per_line + 6 * 4;
-		int startx = splitResult[start];
-		int starty = splitResult[start + 1];
-		int endx = splitResult[start + 2];
-		int endy = splitResult[start + 3];
-
-		int count = 0;
-		for (int r = starty;r <= endy;r++) {
-			for (int c = startx;c <= endx;c++) {
-				uchar v = grayImg.ptr<uchar>(r)[c];
-				if (v >= _IMG_BINARY_THRESHOLD) {
-					count++;
+				if (data_start < 0) {
+					data_start = r;
+					data_end = r;
+				}
+				else {
+					data_end = r;
 				}
 			}
 		}
-		if (count > 50) {
-			//卖出
-			delegateData.type = TRADE_TYPE_SELL;
+		if (rowData.size() < 2)
+		{
+			free(grayImg.data);
+			grayImg.release();
+			for (list<int*>::iterator ele = rowData.begin();ele != rowData.end();ele++) {
+				free(*ele);
+			}
+			return dataList;
 		}
-		else {
-			//买入
-			delegateData.type = TRADE_TYPE_BUY;
+
+		//去头去尾
+		list<int*>::iterator start = rowData.begin();
+		list<int*>::iterator end = rowData.end();
+		free(*start);
+		rowData.erase(start);
+		std::advance(end, -1);
+		free(*end);
+		rowData.erase(end);
+
+		int* rowIndex = (int*)malloc(sizeof(int) * rowData.size() * 4);
+
+		int index = 0;
+		for (list<int*>::iterator ele = rowData.begin();ele != rowData.end();ele++) {
+			rowIndex[index * 4 + 0] = 0;
+			rowIndex[index * 4 + 1] = (*ele)[0];
+			rowIndex[index * 4 + 2] = grayImg.cols - 1;
+			rowIndex[index * 4 + 3] = (*ele)[1];
+			free(*ele);
+			index++;
 		}
 
 
-		delegateData.index = i;
-		delegateData.code = code;
-		delegateData.time = time;
-		delegateData.num = num;
-		delegateData.price = delegate_price;
-		delegateData.trade_price = percent_price;
-		delegateData.trade_num = success_num;
+		int ele_count_per_line = 7;
+		int length_per_num = 8;
 
 
-		dataList.push_back(delegateData);
-		free(numberResult[i]);
-	}
+		int* splitResult = (int*)malloc(sizeof(int) * 4 * ele_count_per_line * rowData.size());
+
+		openCLExcuter->splitPlateContentRowData(grayImg.data, grayImg.cols, grayImg.rows, rowIndex, rowData.size(), ele_count_per_line, 0, 6, splitResult);
+
+		if (false) {
+			//保存分隔结果
+			for (int i = 0;i < rowData.size();i++) {
+				int start = i * ele_count_per_line * 4;
+				for (int j = 0;j < ele_count_per_line;j++)
+				{
+
+					int startx = splitResult[start];
+					int starty = splitResult[start + 1];
+					int endx = splitResult[start + 2];
+					int endy = splitResult[start + 3];
+					start += 4;
+					string path = "C:\\Users\\Administrator\\Desktop\\ocr\\trade\\";
+					path.append(to_string(i)).append("_").append(to_string(j)).append(".jpg");
+					cv::imwrite(path, cv::Mat(grayImg, cv::Rect(startx, starty, endx - startx + 1, endy - starty + 1)));
+				}
+			}
+		}
 
 
-	free(numberResult);
-	free(rowIndex);
-	free(splitResult);
-	free(zeroData);
-	free(templateNums);
-	free(grayImg.data);
-	grayImg.release();
-	return dataList;
+		//分割数字
+		unsigned char* zeroData = (unsigned char*)malloc(sizeof(unsigned char) * _NUMBER_L2_WIDTH * _NUMBER_L2_HEIGHT);
+		for (int r = 0;r < _NUMBER_L2_HEIGHT;r++) {
+			for (int c = 0;c < _NUMBER_L2_WIDTH;c++)
+			{
+				zeroData[r * _NUMBER_L2_WIDTH + c] = ImgUtil::NUMS_LEVEL2[0].data.ptr<uchar>(r)[c];
+			}
+		}
 
+		int line_number_count = ele_count_per_line * length_per_num;
+
+		unsigned char* totalNumberData = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_L2_HEIGHT * rowData.size()) * _NUMBER_L2_WIDTH * 10 * line_number_count);
+
+		UcharDataInfo typesData = UcharDataInfo();
+		unsigned char types[] = { NUM_TYPE_TIME,NUM_TYPE_CODE,NUM_TYPE_CODE,NUM_TYPE_PRICE,NUM_TYPE_PRICE,NUM_TYPE_CODE, NUM_TYPE_CODE };
+		typesData.length = ele_count_per_line;
+		typesData.data = types;
+
+		openCLExcuter->splitL2NumNew(grayImg, IntDataInfo({ splitResult,(int)(ele_count_per_line * rowData.size()) }), UcharDataInfo({ totalNumberData, -1 }), typesData, zeroData, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, ele_count_per_line, length_per_num);
+
+
+
+
+
+		//识别数字
+		uchar* templateNums = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_L2_HEIGHT * rowData.size()) * _NUMBER_L2_WIDTH * 10 * line_number_count);
+		openCLExcuter->createNumberTemplates(rowData.size(), _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, line_number_count, ImgUtil::numsOneLevel_level2, templateNums);
+		uchar** numberResult = openCLExcuter->recognition_numbers(totalNumberData, templateNums, rowData.size() * _NUMBER_L2_HEIGHT, _NUMBER_L2_WIDTH * 10 * line_number_count, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, line_number_count);
+
+		for (int i = 0;i < rowData.size();i++) {
+			TradeDelegateData delegateData = TradeDelegateData();
+			//时间
+			string time = "";
+			for (int j = length_per_num - 6;j < length_per_num;j++)
+			{
+				if (j - (length_per_num - 6) == 2 || j - (length_per_num - 6) == 4)
+					time.append(":");
+				time.append(to_string(numberResult[i][length_per_num * 0 + j]));
+			}
+
+			//代码
+			string code = "";
+			for (int j = length_per_num - 6;j < length_per_num;j++)
+			{
+				code.append(to_string(numberResult[i][length_per_num * 1 + j]));
+			}
+
+
+			//委托数量
+			string num = "";
+			for (int j = 0;j < length_per_num;j++)
+			{
+				num.append(to_string(numberResult[i][length_per_num * 2 + j]));
+			}
+			num = to_string(stoi(num));
+
+
+			//委托价格
+			string delegate_price = "";
+			for (int j = 0;j < length_per_num;j++)
+			{
+				if (length_per_num - j == 3)
+					delegate_price.append(".");
+				delegate_price.append(to_string(numberResult[i][length_per_num * 3 + j]));
+			}
+			delegate_price = to_string(stod(delegate_price));
+			char* chCode;
+			chCode = new char[20];
+			sprintf_s(chCode, delegate_price.length(), "%.3lf", stod(delegate_price));
+			std::string delegate_price_str(chCode);
+
+			delegate_price = delegate_price_str;
+
+
+			//成交均价
+			string percent_price = "";
+			for (int j = 0;j < length_per_num;j++)
+			{
+				if (length_per_num - j == 3)
+					percent_price.append(".");
+				percent_price.append(to_string(numberResult[i][length_per_num * 4 + j]));
+			}
+
+			chCode = new char[20];
+			sprintf_s(chCode, percent_price.length(), "%.3lf", stod(percent_price));
+			std::string percent_price_str(chCode);
+
+			percent_price = percent_price_str;
+
+
+			//成交数量
+			string success_num = "";
+			for (int j = 0;j < length_per_num;j++)
+			{
+				success_num.append(to_string(numberResult[i][length_per_num * 5 + j]));
+			}
+			success_num = to_string(stoi(success_num));
+
+
+			//买入卖出
+			int start = i * 4 * ele_count_per_line + 6 * 4;
+			int startx = splitResult[start];
+			int starty = splitResult[start + 1];
+			int endx = splitResult[start + 2];
+			int endy = splitResult[start + 3];
+
+			int count = 0;
+			for (int r = starty;r <= endy;r++) {
+				for (int c = startx;c <= endx;c++) {
+					uchar v = grayImg.ptr<uchar>(r)[c];
+					if (v >= _IMG_BINARY_THRESHOLD) {
+						count++;
+					}
+				}
+			}
+			if (count > 50) {
+				//卖出
+				delegateData.type = TRADE_TYPE_SELL;
+			}
+			else {
+				//买入
+				delegateData.type = TRADE_TYPE_BUY;
+			}
+
+
+			delegateData.index = i;
+			delegateData.code = code;
+			delegateData.time = time;
+			delegateData.num = num;
+			delegateData.price = delegate_price;
+			delegateData.trade_price = percent_price;
+			delegateData.trade_num = success_num;
+
+
+			dataList.push_back(delegateData);
+			free(numberResult[i]);
+		}
+
+		free(totalNumberData);
+		free(numberResult);
+		free(rowIndex);
+		free(splitResult);
+		free(zeroData);
+		free(templateNums);
+		free(grayImg.data);
+		grayImg.release();
+
+		return dataList;
 }
 
 

--
Gitblit v1.8.0