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