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