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

---
 ConsoleApplication/kernel.cl |  554 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 545 insertions(+), 9 deletions(-)

diff --git a/ConsoleApplication/kernel.cl b/ConsoleApplication/kernel.cl
index 872df6a..70c52f8 100644
--- a/ConsoleApplication/kernel.cl
+++ b/ConsoleApplication/kernel.cl
@@ -449,10 +449,10 @@
 	}
 	//分隔数据
 
-	//最大分割6个数
+	//最大分割20个数
 	int numCount = 0;
 	//记录分割得到的数据
-	int  numberCols[12];
+	int  numberCols[20*2];
 
 	int i;
 	for (i = 0;i < 3;i++) {
@@ -507,8 +507,8 @@
 	}
 
 	int zeroCount = length_per_num - numCount;
-	//最大为10位数
-	int fresult[10 * 2];
+	//最大为20位数
+	int fresult[20 * 2];
 	for (i = 0;i < zeroCount;i++) {
 		fresult[i * 2] = -1;
 		fresult[i * 2 + 1] = -1;
@@ -558,7 +558,7 @@
 		int rowIndex = index / ele_count_per_line;
 		int index_0 = rowDataCount * rowIndex;
 		//行偏移量
-		int index_2 = (num_width * 10) * ( 6 * (index % ele_count_per_line) + i);
+		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;
@@ -577,6 +577,529 @@
 
 	//printf("\n");
 }
+
+
+__kernel void split_l2_num_new(__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) {
+
+	//printf("ele_count_per_line:%d  length_per_num:%d\n", ele_count_per_line, length_per_num);
+
+	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);
+	//时间
+	if (type == 0) {
+		//时间
+		int s = cols / 2;
+		int i;
+		//往前查找冒号
+		int m1_s = -1, m1_e = -1, m2_s = -1, m2_e = -1;
+		uchar temp[7];
+		for (i = s;i > -1;i--) {
+			if (i < 6) {
+				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 - 6, endy)]);
+			if (temp[3] > 0 && get_binary_value(img_in[get_one_level_position(width, startx + i - 3, endy - 1)]) == 0) {
+				int t = temp[0] + temp[1] + temp[2] + temp[4] + temp[5] + temp[6];
+				if (t == 0) {
+					m1_s = i - 6;
+					m1_e = i;
+					break;
+				}
+			}
+
+		}
+
+		//往后查找冒号
+
+		for (i = s;i < cols;i++) {
+			if (i > cols - 6) {
+				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 + 6, endy)]);
+			if (temp[3] > 0 && get_binary_value(img_in[get_one_level_position(width, startx + i + 3, endy - 1)]) == 0) {
+				int t = temp[0] + temp[1] + temp[2] + temp[4] + temp[5] + temp[6];
+				if (t == 0) {
+					m2_s = i;
+					m2_e = i + 6;
+					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;
+		for (i = endx - 9;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[6];
+		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)]);
+			if (temp[2] > 0) {
+
+				bool empty = 1;
+				for (int y = starty;y < endy;y++) {
+					if (get_binary_value(img_in[get_one_level_position(width, startx + i + 2, y)]) > 0) {
+						empty = 0;
+						break;
+					}
+				}
+				//小数点上方为空值
+				if (empty) {
+					unsigned char	t = temp[0] + temp[1] + temp[3] + temp[4] + temp[5];
+					if (t == 0) {
+						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] = num_end;
+			nps[7] = endy;
+
+		}
+
+
+
+
+	}
+	//价格
+	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[6];
+		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)]);
+			if (temp[2] > 0) {
+
+				bool empty = 1;
+				for (int y = starty;y < endy;y++) {
+					if (get_binary_value(img_in[get_one_level_position(width, startx + i + 2, y)]) > 0) {
+						empty = 0;
+						break;
+					}
+				}
+				//小数点上方为空值
+				if (empty) {
+					unsigned char	t = temp[0] + temp[1] + temp[3] + temp[4] + temp[5];
+					if (t == 0) {
+						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;
+
+			nps[8] = -1;
+			nps[9] = -1;
+			nps[10] = -1;
+			nps[11] = -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) {
+		//手数
+		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;
+	}
+	//分隔数据
+
+	//最大分割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;
+	//最大为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];
+	}
+
+	//开始填充数据
+	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数字
@@ -1290,7 +1813,7 @@
 	}
 }
 
-__kernel void rgb2GrayImgInvert(__global unsigned char* imgs, int width,
+__kernel void rgb2ThresholdInvert(__global unsigned char* imgs, int width,
 	__global unsigned char* result) {
 
 	int rowIndex = get_global_id(0);
@@ -1301,7 +1824,14 @@
 		unsigned char R = imgs[start];
 		unsigned char G = imgs[start + 1];
 		unsigned char B = imgs[start + 2];
-		result[index] = 255 - (76 * R + 150 * G + 30 * B) >> 8;
+		int v = (76 * R + 150 * G + 30 * B) >> 8;
+
+		if (v > 64) {
+			result[index] = 0;
+		}
+		else {
+			result[index] = 255;
+		}
 	}
 }
 
@@ -1321,7 +1851,7 @@
 }
 
 
-__kernel void rgba2GrayImgInvert(__global unsigned char* imgs, int width,
+__kernel void rgba2ThresholdInvert(__global unsigned char* imgs, int width,
 	__global unsigned char* result) {
 
 	int rowIndex = get_global_id(0);
@@ -1332,7 +1862,13 @@
 		unsigned char R = imgs[start];
 		unsigned char G = imgs[start + 1];
 		unsigned char B = imgs[start + 2];
-		result[index] =255 - (76 * R + 150 * G + 30 * B) >> 8;
+		int v = (76 * R + 150 * G + 30 * B) >> 8;
+		if (v > 64) {
+			result[index] = 0;
+		}
+		else {
+			result[index] = 255;
+		}
 	}
 }
 

--
Gitblit v1.8.0