| | |
| | | } |
| | | //分隔数据 |
| | | |
| | | //最大分割6个数 |
| | | //最大分割20个数 |
| | | int numCount = 0; |
| | | //记录分割得到的数据 |
| | | int numberCols[12]; |
| | | int numberCols[20*2]; |
| | | |
| | | int i; |
| | | for (i = 0;i < 3;i++) { |
| | |
| | | } |
| | | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | |
| | | //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数字 |
| | |
| | | } |
| | | } |
| | | |
| | | __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); |
| | |
| | | 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; |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | __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); |
| | |
| | | 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; |
| | | } |
| | | } |
| | | } |
| | | |