From 086ec74e94654e92b3a1c6f42612d12ef33ff4b2 Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期五, 28 十月 2022 14:41:08 +0800
Subject: [PATCH] '优化自启动机制'

---
 ConsoleApplication/kernel.cl |  711 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 707 insertions(+), 4 deletions(-)

diff --git a/ConsoleApplication/kernel.cl b/ConsoleApplication/kernel.cl
index 21e8a2d..8003d3b 100644
--- a/ConsoleApplication/kernel.cl
+++ b/ConsoleApplication/kernel.cl
@@ -1290,6 +1290,709 @@
 }
 
 
+//分隔板块数字
+__kernel void split_trade_queue_num(__global const unsigned char* img_in, __global const int* pos_in, __global const unsigned char* zero, __global const unsigned char* types, int width, int num_width, int num_height, int ele_count_per_line, int length_per_num,
+	__global unsigned char* result) {
+
+	int index = get_global_id(0);
+	//区域坐标
+	int startP = index * 4;
+	int startx = pos_in[startP];
+	int starty = pos_in[startP + 1];
+	int endx = pos_in[startP + 2];
+	int endy = pos_in[startP + 3];
+
+	if (startx > 0)
+	{
+		int startNy = -1;
+		int endNy = -1;
+		//去除上下的白边
+		int y = 0;
+		for (y = starty; y <= endy; y++) {
+			bool empty = 1;
+			for (int x = startx; x <= endx; x++)
+			{
+				int p = get_one_level_position(width, x, y);
+				unsigned char value = get_binary_value(img_in[p]);
+				//有数据
+				if (value > 0) {
+					empty = 0;
+					break;
+				}
+			}
+			if (!empty) {
+				startNy = y;
+				break;
+			}
+		}
+
+		for (y = endy; y >= starty; y--) {
+			bool empty = 1;
+			for (int x = startx; x <= endx; x++)
+			{
+				int p = get_one_level_position(width, x, y);
+				unsigned char value = get_binary_value(img_in[p]);
+				//有数据
+				if (value > 0) {
+					empty = 0;
+					break;
+				}
+			}
+			if (!empty) {
+				endNy = y;
+				break;
+			}
+		}
+		starty = startNy;
+		endy = endNy;
+	}
+	int cols = endx - startx + 1;
+	int rows = endy - starty + 1;
+
+	//每个元素占用6个数字的空间,不够的前面填充0
+	int num_count = ele_count_per_line * length_per_num;
+
+	int nps[12];
+	//只能识别4种数字
+	unsigned char type = types[index % ele_count_per_line];
+	//printf("ele_count_line:%d\n", ele_count_line);
+		//是否只有一位小数
+	bool one_point_num = false;
+	//时间
+	if (type == 0) {
+		//时间
+		int s = cols / 2;
+		int i;
+		//往前查找冒号
+		int m1_s = -1, m1_e = -1, m2_s = -1, m2_e = -1;
+		uchar temp[10];
+		for (i = s; i > -1; i--) {
+			if (i < 5) {
+				break;
+			}
+			temp[0] = get_binary_value(img_in[get_one_level_position(width, startx + i, endy)]);
+
+			temp[1] = get_binary_value(img_in[get_one_level_position(width, startx + i - 1, endy)]);
+
+
+			temp[2] = get_binary_value(img_in[get_one_level_position(width, startx + i - 2, endy)]);
+			temp[3] = get_binary_value(img_in[get_one_level_position(width, startx + i - 3, endy)]);
+			temp[4] = get_binary_value(img_in[get_one_level_position(width, startx + i - 4, endy)]);
+			temp[5] = get_binary_value(img_in[get_one_level_position(width, startx + i - 5, endy)]);
+			temp[6] = get_binary_value(img_in[get_one_level_position(width, startx + i - 2, endy - 1)]);
+			temp[7] = get_binary_value(img_in[get_one_level_position(width, startx + i - 3, endy - 1)]);
+			temp[8] = get_binary_value(img_in[get_one_level_position(width, startx + i - 2, endy - 2)]);
+			temp[9] = get_binary_value(img_in[get_one_level_position(width, startx + i - 3, endy - 2)]);
+			if (temp[3] > 0 && temp[2] > 0 && temp[6] > 0 && temp[7] > 0) {
+				int t = temp[0] + temp[1] + temp[4] + temp[5] + temp[8] + temp[9];
+				if (t == 0) {
+					m1_s = i - 5;
+					m1_e = i;
+					break;
+				}
+			}
+
+		}
+
+		//往后查找冒号
+
+		for (i = s; i < cols; i++) {
+			if (i > cols - 5) {
+				break;
+			}
+
+			temp[0] = get_binary_value(img_in[get_one_level_position(width, startx + i, endy)]);
+			temp[1] = get_binary_value(img_in[get_one_level_position(width, startx + i + 1, endy)]);
+			temp[2] = get_binary_value(img_in[get_one_level_position(width, startx + i + 2, endy)]);
+			temp[3] = get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy)]);
+			temp[4] = get_binary_value(img_in[get_one_level_position(width, startx + i + 4, endy)]);
+			temp[5] = get_binary_value(img_in[get_one_level_position(width, startx + i + 5, endy)]);
+			temp[6] = get_binary_value(img_in[get_one_level_position(width, startx + i + 2, endy - 1)]);
+			temp[7] = get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy - 1)]);
+			temp[8] = get_binary_value(img_in[get_one_level_position(width, startx + i + 2, endy - 2)]);
+			temp[9] = get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy - 2)]);
+			if (temp[2] > 0 && temp[3] > 0 && temp[6] > 0 && temp[7] > 0) {
+				int t = temp[0] + temp[1] + temp[4] + temp[5] + temp[8] + temp[9];
+				if (t == 0) {
+					m2_s = i;
+					m2_e = i + 5;
+					break;
+				}
+			}
+		}
+		if (m1_s < 0 || m1_e < 0 || m2_s < 0 || m2_e < 0) {
+			//没有分割成功的话填充0
+			nps[0] = -1;
+			nps[1] = -1;
+			nps[2] = -1;
+			nps[3] = -1;
+
+			nps[4] = -1;
+			nps[5] = -1;
+			nps[6] = -1;
+			nps[7] = -1;
+
+			nps[8] = -1;
+			nps[9] = -1;
+			nps[10] = -1;
+			nps[11] = -1;
+		}
+		else {
+			//3个时间的坐标
+			nps[0] = startx;
+			nps[1] = starty;
+			nps[2] = startx + m1_s - 1;
+			nps[3] = endy;
+
+			nps[4] = startx + m1_e + 1;
+			nps[5] = starty;
+			nps[6] = startx + m2_s - 1;
+			nps[7] = endy;
+
+			nps[8] = startx + m2_e + 1;
+			nps[9] = starty;
+			nps[10] = endx;
+			nps[11] = endy;
+		}
+
+
+	}
+	//金额
+	else if (type == 1) {
+		//查找单位前的空格
+		int num_end = -1;
+		int i;
+		//获取是否有单位
+		int last_empty_index = -1;
+		for (i = endx; i >= startx; i--) {
+			bool empty = 1;
+			for (int y = starty; y < endy; y++) {
+				if (get_binary_value(img_in[get_one_level_position(width, i, y)]) > 0) {
+					empty = 0;
+					break;
+				}
+			}
+			if (empty) {
+				last_empty_index = i;
+				break;
+			}
+		}
+		bool hasUnit = false;
+		if (endx - last_empty_index > num_width) {
+			hasUnit = true;
+		}
+
+		//带有单位
+		if (hasUnit) {
+			for (i = endx - 11; i >= startx; i--) {
+				bool empty = 1;
+				for (int y = starty; y < endy; y++) {
+					if (get_binary_value(img_in[get_one_level_position(width, i, y)]) > 0) {
+						empty = 0;
+						break;
+					}
+				}
+				if (empty) {
+					num_end = i - 1;
+					break;
+				}
+			}
+		}
+
+		if (num_end >= 0) {
+			endx = num_end;
+		}
+
+		//去除上下的空白
+		int startNy = -1;
+		int endNy = -1;
+		//去除上下的白边
+		int y = 0;
+		for (y = starty; y <= endy; y++) {
+			bool empty = 1;
+			for (int x = startx; x <= endx; x++)
+			{
+				int p = get_one_level_position(width, x, y);
+				unsigned char value = get_binary_value(img_in[p]);
+				//有数据
+				if (value > 0) {
+					empty = 0;
+					break;
+				}
+			}
+			if (!empty) {
+				startNy = y;
+				break;
+			}
+		}
+
+		for (y = endy; y >= starty; y--) {
+			bool empty = 1;
+			for (int x = startx; x <= endx; x++)
+			{
+				int p = get_one_level_position(width, x, y);
+				unsigned char value = get_binary_value(img_in[p]);
+				//有数据
+				if (value > 0) {
+					empty = 0;
+					break;
+				}
+			}
+			if (!empty) {
+				endNy = y;
+				break;
+			}
+		}
+		starty = startNy;
+		endy = endNy;
+
+
+
+		cols = endx - startx + 1;
+
+
+
+
+		int m_s = -1, m_e = -1;
+		uchar temp[8];
+
+		for (i = 0; i < cols; i++) {
+			if (i > cols - 5) {
+				break;
+			}
+			temp[0] = get_binary_value(img_in[get_one_level_position(width, startx + i, endy)]);
+			temp[1] = get_binary_value(img_in[get_one_level_position(width, startx + i + 1, endy)]);
+			temp[2] = get_binary_value(img_in[get_one_level_position(width, startx + i + 2, endy)]);
+			temp[3] = get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy)]);
+			temp[4] = get_binary_value(img_in[get_one_level_position(width, startx + i + 4, endy)]);
+			temp[5] = get_binary_value(img_in[get_one_level_position(width, startx + i + 5, endy)]);
+			temp[6] = get_binary_value(img_in[get_one_level_position(width, startx + i + 2, endy - 1)]);
+			temp[7] = get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy - 1)]);
+			if (temp[2] > 0 && temp[3] > 0 && temp[6] > 0 && temp[7] > 0) {
+
+				if (temp[0] + temp[1] + temp[4] + temp[5] == 0)
+				{
+
+					bool empty = 1;
+					for (int y = starty; y < endy - 1; y++) {
+						if (get_binary_value(img_in[get_one_level_position(width, startx + i + 2, y)]) > 0) {
+							empty = 0;
+							break;
+						}
+					}
+					//小数点上方为空值
+					if (empty) {
+						m_s = i;
+						m_e = i + 5;
+						break;
+					}
+				}
+			}
+		}
+
+		if (m_s == -1 || m_e == -1) {
+			//printf("没找到小数点:%d", index);
+			if (hasUnit)
+			{
+				nps[0] = -1;
+				nps[1] = -1;
+				nps[2] = -1;
+				nps[3] = -1;
+			}
+			else {
+				nps[0] = startx;
+				nps[1] = starty;
+				nps[2] = endx;
+				nps[3] = endy;
+			}
+
+			nps[4] = -1;
+			nps[5] = -1;
+			nps[6] = -1;
+			nps[7] = -1;
+
+
+		}
+		else {
+			//printf("找到了小数点:%d", index);
+			nps[0] = startx;
+			nps[1] = starty;
+			nps[2] = startx + m_s - 1;
+			nps[3] = endy;
+
+			nps[4] = startx + m_e + 1;
+			nps[5] = starty;
+			nps[6] = num_end;
+			nps[7] = endy;
+			if (nps[6] - nps[4] + 1 <= num_width) {
+				one_point_num = true;
+			}
+		}
+
+		nps[8] = -1;
+		nps[9] = -1;
+		nps[10] = -1;
+		nps[11] = -1;
+
+
+
+
+	}
+	//价格
+	else if (type == 2) {
+		//股价
+
+		//printf("startx:%d starty:%d endx:%d endy:%d\n",startx,starty,endx,endy);
+
+			//往前查找小数点
+		int m_s = -1, m_e = -1;
+		uchar temp[8];
+		int i;
+		for (i = 0; i < cols; i++) {
+			if (i > cols - 5) {
+				break;
+			}
+			temp[0] = get_binary_value(img_in[get_one_level_position(width, startx + i, endy)]);
+			temp[1] = get_binary_value(img_in[get_one_level_position(width, startx + i + 1, endy)]);
+			temp[2] = get_binary_value(img_in[get_one_level_position(width, startx + i + 2, endy)]);
+			temp[3] = get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy)]);
+			temp[4] = get_binary_value(img_in[get_one_level_position(width, startx + i + 4, endy)]);
+			temp[5] = get_binary_value(img_in[get_one_level_position(width, startx + i + 5, endy)]);
+			temp[6] = get_binary_value(img_in[get_one_level_position(width, startx + i + 2, endy - 1)]);
+			temp[7] = get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy - 1)]);
+			if (temp[2] > 0 && temp[3] > 0 ) {
+
+				if (temp[0] + temp[1] + temp[4] + temp[5] + temp[6] + temp[7] == 0)
+				{
+
+					bool empty = 1;
+					for (int y = starty; y < endy - 1; y++) {
+						if (get_binary_value(img_in[get_one_level_position(width, startx + i + 2, y)]) > 0) {
+							empty = 0;
+							break;
+						}
+					}
+					//小数点上方为空值
+					if (empty) {
+						m_s = i;
+						m_e = i + 5;
+						break;
+					}
+				}
+			}
+		}
+
+		if (m_s == -1 || m_e == -1) {
+			nps[0] = -1;
+			nps[1] = -1;
+			nps[2] = -1;
+			nps[3] = -1;
+
+			nps[4] = -1;
+			nps[5] = -1;
+			nps[6] = -1;
+			nps[7] = -1;
+		}
+		else {
+			nps[0] = startx;
+			nps[1] = starty;
+			nps[2] = startx + m_s - 1;
+			nps[3] = endy;
+
+			nps[4] = startx + m_e + 1;
+			nps[5] = starty;
+			nps[6] = endx;
+			nps[7] = endy;
+		}
+
+		nps[8] = -1;
+		nps[9] = -1;
+		nps[10] = -1;
+		nps[11] = -1;
+
+	}
+	//代码与数字
+	else if (type == 3 || type == 4) {
+		//手数
+		nps[0] = startx;
+		nps[1] = starty;
+		nps[2] = endx;
+		nps[3] = endy;
+
+		nps[4] = -1;
+		nps[5] = -1;
+		nps[6] = -1;
+		nps[7] = -1;
+
+		nps[8] = -1;
+		nps[9] = -1;
+		nps[10] = -1;
+		nps[11] = -1;
+	}
+	//百分比
+	else if (type == 5) {
+
+		//百分比数字起始位置
+		int percent_start = -1;
+		int emptyIndex = -1;
+		int i;
+		for (i = startx; i <= endx; i++) {
+			bool empty = 1;
+			for (int y = starty; y < endy; y++) {
+				if (get_binary_value(img_in[get_one_level_position(width, i, y)]) > 0) {
+					empty = 0;
+					break;
+				}
+			}
+			if (empty) {
+				emptyIndex = i;
+			}
+			else if (emptyIndex > 0) {
+				percent_start = i;
+				break;
+			}
+
+		}
+
+
+		//百分比数字的结束位置
+		int percent_end = -1;
+		emptyIndex = -1;
+
+		for (i = endx; i >= startx; i--) {
+			bool empty = 1;
+			for (int y = starty; y < endy; y++) {
+				if (get_binary_value(img_in[get_one_level_position(width, i, y)]) > 0) {
+					empty = 0;
+					break;
+				}
+			}
+			if (empty) {
+				emptyIndex = i;
+			}
+			else if (emptyIndex > 0) {
+				percent_end = i;
+				break;
+			}
+		}
+
+
+
+		if (percent_start > -1) {
+			startx = percent_start;
+		}
+
+		if (percent_end > -1) {
+			endx = percent_end;
+		}
+
+
+		//按照价格的形式做识别
+		int m_s = -1, m_e = -1;
+		uchar temp[8];
+		for (i = 0; i < cols; i++) {
+			if (i > cols - 5) {
+				break;
+			}
+			temp[0] = get_binary_value(img_in[get_one_level_position(width, startx + i, endy)]);
+			temp[1] = get_binary_value(img_in[get_one_level_position(width, startx + i + 1, endy)]);
+			temp[2] = get_binary_value(img_in[get_one_level_position(width, startx + i + 2, endy)]);
+			temp[3] = get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy)]);
+			temp[4] = get_binary_value(img_in[get_one_level_position(width, startx + i + 4, endy)]);
+			temp[5] = get_binary_value(img_in[get_one_level_position(width, startx + i + 5, endy)]);
+			temp[6] = get_binary_value(img_in[get_one_level_position(width, startx + i + 2, endy - 1)]);
+			temp[7] = get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy - 1)]);
+			if (temp[2] > 0 && temp[3] > 0 && temp[6] > 0 && temp[7] > 0) {
+
+				if (temp[0] + temp[1] + temp[4] + temp[5] == 0)
+				{
+
+					bool empty = 1;
+					for (int y = starty; y < endy - 1; y++) {
+						if (get_binary_value(img_in[get_one_level_position(width, startx + i + 2, y)]) > 0) {
+							empty = 0;
+							break;
+						}
+					}
+					//小数点上方为空值
+					if (empty) {
+						m_s = i;
+						m_e = i + 5;
+						break;
+					}
+				}
+			}
+		}
+
+		if (m_s == -1 || m_e == -1) {
+
+			nps[0] = -1;
+			nps[1] = -1;
+			nps[2] = -1;
+			nps[3] = -1;
+
+			nps[4] = -1;
+			nps[5] = -1;
+			nps[6] = -1;
+			nps[7] = -1;
+		}
+		else {
+			nps[0] = startx;
+			nps[1] = starty;
+			nps[2] = startx + m_s - 1;
+			nps[3] = endy;
+
+			nps[4] = startx + m_e + 1;
+			nps[5] = starty;
+			nps[6] = endx;
+			nps[7] = endy;
+		}
+
+		nps[8] = -1;
+		nps[9] = -1;
+		nps[10] = -1;
+		nps[11] = -1;
+
+	}
+
+	//分隔数据
+
+
+	//最大分割20个数
+	int numCount = 0;
+	//记录分割得到的数据
+	int  numberCols[20 * 2];
+
+	int i;
+	for (i = 0; i < 3; i++) {
+		if (nps[i * 4] == -1) {
+			break;
+		}
+		int _startx = nps[i * 4];
+		int _starty = nps[i * 4 + 1];
+		int _endx = nps[i * 4 + 2];
+		int _endy = nps[i * 4 + 3];
+		int _cols = _endx - _startx + 1;
+
+
+
+		int c, startC = -1, endC = -1;
+		for (c = 0; c < _cols; c++) {
+
+			bool empty = 1;
+			for (int y = _starty; y <= _endy; y++) {
+				unsigned char value = get_binary_value(img_in[get_one_level_position(width, _startx + c, y)]);
+				if (value > 0) {
+					empty = 0;
+					break;
+				}
+			}
+
+			if (empty) {
+				if (startC > -1 && endC > -1) {
+					numberCols[numCount * 2] = _startx + startC;
+					numberCols[numCount * 2 + 1] = _startx + endC;
+					numCount++;
+				}
+				startC = -1;
+				endC = -1;
+			}
+			else {
+				if (startC == -1) {
+					startC = c;
+					endC = c;
+				}
+				else {
+					endC = c;
+				}
+			}
+		}
+
+		if (startC > -1 && endC > -1) {
+			numberCols[numCount * 2] = _startx + startC;
+			numberCols[numCount * 2 + 1] = _startx + endC;
+			numCount++;
+		}
+	}
+
+	int zeroCount = length_per_num - numCount - (one_point_num ? 1 : 0);
+	//最大为20位数
+	int fresult[20 * 2];
+	for (i = 0; i < zeroCount; i++) {
+		fresult[i * 2] = -1;
+		fresult[i * 2 + 1] = -1;
+	}
+
+	for (i = 0; i < numCount; i++) {
+		fresult[(i + zeroCount) * 2] = numberCols[i * 2];
+		fresult[(i + zeroCount) * 2 + 1] = numberCols[i * 2 + 1];
+	}
+	//一位小数需要在末尾填充0
+	if (type == 1 && one_point_num) {
+		fresult[(numCount + zeroCount) * 2] = -1;
+		fresult[(numCount + zeroCount) * 2 + 1] = -1;
+	}
+
+	//开始填充数据
+	for (i = 0; i < length_per_num; i++) {
+
+		unsigned char numData[100 * 100];
+
+		if (fresult[i * 2] == -1) {
+			//填充0
+			for (int r = 0; r < num_height; r++) {
+				for (int c = 0; c < num_width; c++) {
+					unsigned char value = get_binary_value(zero[r * num_width + c]);
+					//设置输出坐标的值 
+					numData[r * num_width + c] = value;
+				}
+			}
+
+		}
+		else {
+			int _startx = fresult[i * 2];
+			int _endx = fresult[i * 2 + 1];
+			for (int r = starty; r <= endy; r++) {
+				for (int c = 0; c < num_width; c++) {
+					unsigned char value = 0;
+					if (_startx + c <= _endx) {
+						//填充空白0	
+						value = get_binary_value(img_in[get_one_level_position(width, _startx + c, r)]);
+						//设置输出坐标的值 
+						numData[(r - starty) * num_width + c] = value;
+					}
+					else {
+						numData[(r - starty) * num_width + c] = 0;
+					}
+				}
+			}
+		}
+
+		int rowDataCount = num_height * num_width * 10 * num_count;
+		int rowIndex = index / ele_count_per_line;
+		int index_0 = rowDataCount * rowIndex;
+		//行偏移量
+		int index_2 = (num_width * 10) * (length_per_num * (index % ele_count_per_line) + i);
+
+		for (int re = 0; re < 10; re++) {
+			int index_3 = re * num_width;
+			for (int r = 0; r < num_height; r++) {
+				int index_1 = r * (num_width * 10 * num_count);
+				for (int c = 0; c < num_width; c++) {
+					int findex = index_0 + index_1 + index_2 + index_3 + c;
+					//printf("index:%d-findex:%d value:%d \n", index, findex, numData[r * num_width + c]);
+					result[findex] = numData[r * num_width + c];
+				}
+			}
+		}
+
+
+	}
+
+	//printf("\n");
+}
+
+
 
 
 //分割L2数字
@@ -1988,7 +2691,7 @@
 
 
 //RGB图转为灰度图
-__kernel void rgb2GrayImg(__global unsigned char* imgs, int width,
+__kernel void rgb2GrayImg(const __global unsigned char* imgs, int width,
 	__global unsigned char* result) {
 
 	int rowIndex = get_global_id(0);
@@ -2003,7 +2706,7 @@
 	}
 }
 
-__kernel void rgb2ThresholdInvert(__global unsigned char* imgs, int width,
+__kernel void rgb2ThresholdInvert(const __global unsigned char* imgs, int width,
 	__global unsigned char* result, int threadhold) {
 
 	int rowIndex = get_global_id(0);
@@ -2025,7 +2728,7 @@
 	}
 }
 
-__kernel void rgba2GrayImg(__global unsigned char* imgs, int width,
+__kernel void rgba2GrayImg(const __global unsigned char* imgs, int width,
 	__global unsigned char* result) {
 
 	int rowIndex = get_global_id(0);
@@ -2041,7 +2744,7 @@
 }
 
 
-__kernel void rgba2ThresholdInvert(__global unsigned char* imgs, int width,
+__kernel void rgba2ThresholdInvert(const __global unsigned char* imgs, int width,
 	__global unsigned char* result,int threadhold) {
 
 	int rowIndex = get_global_id(0);

--
Gitblit v1.8.0