admin
2022-07-22 9adb473067a993b4e0eacf3675baf14b29da3eca
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;
      }
   }
}