admin
2023-02-09 125db633619a0b4c7bd1d498ea2bf1cefa4f73d3
ConsoleApplication/L2TradeQueueUtil.cpp
@@ -1,6 +1,8 @@
#include "L2TradeQueueUtil.h"
list<ImgArea> L2TradeQueueUtil::splitElements(cv::Mat img)
#include "Win32Util.h"
list<ImgArea> L2TradeQueueUtil::splitViewElements(cv::Mat img)
{
   list<int*> rowDataList = splitRows(img);
@@ -74,7 +76,7 @@
   freeData(dataList);
   free(rowData);
   if (false) {
   if (FALSE) {
      //保存
      int index = -1;
      for (list<ImgArea>::iterator ele = posList.begin(); ele != posList.end(); ++ele) {
@@ -93,6 +95,216 @@
   return posList;
}
list<ImgArea> L2TradeQueueUtil::splitBuyQueue(cv::Mat img,int identify)
{
   if (FALSE)
   {
      cv::imwrite(string("C:\\Users\\Administrator\\Desktop\\ocr\\trade_queue\\demo\\").append(to_string(identify)).append("_").append(to_string(rand())).append(".png"), img);
   }
   list<ImgArea> resultList;
   //cv::Mat binary;
   //二值化,方便处理
   //threshold(img, binary, _IMG_BINARY_THRESHOLD, 255, cv::THRESH_BINARY);
   //分隔第一行
   int rows = img.rows;
   int startCol = 0;
   int endCol = img.cols - 1;
   list<int*> rowDataList;
   int full_start = -1;
   int full_end = -1;
   for (int r = 1; r < rows; r++) {
      if (ImgDivider::isRowFull(img, r, startCol, endCol, 1,49,51)) {
         if (full_start < 0) {
            full_start = r;
         }
         if (r - full_start > 10) {
            int* pos = (int*)malloc(sizeof(int) * 2);
            pos[0] = full_start + 1;
            pos[1] = r - 1;
            rowDataList.push_back(pos);
            full_start = r;
         }
         else {
            full_start = r;
         }
      }
   }
   if (rowDataList.size() < 1) {
      throw string("无数据");
   }
   endCol = img.cols - 1;
   int index = 0;
   for (list<int*>::iterator ele = rowDataList.begin(); ele != rowDataList.end(); ++ele) {
      int* pos = *ele;
      int startRow = pos[0];
      int endRow = pos[1];
      free(pos);
      //去除上下空白,右侧留白10
      for (int i = startRow; i <= endRow; i++) {
         if (!ImgDivider::isRowEmpty(img, i, startCol, endCol,1, _IMG_BINARY_THRESHOLD)) {
            startRow = i;
            break;
         }
      }
      for (int i = endRow; i >= startRow; i--) {
         if (!ImgDivider::isRowEmpty(img, i, startCol, endCol,1, _IMG_BINARY_THRESHOLD)) {
            endRow = i;
            break;
         }
      }
      //if (identify == 4|| identify ==6) {
      //   printf("进入调试");
      //}
      if (endRow - startRow > 5)
      {
         list<int*> elements = splitCols(img, startCol, startRow, endCol - 1, endRow, 3);
         for (list<int*>::iterator e = elements.begin(); e != elements.end(); ++e) {
            int* ps = *e;
            ImgArea area;
            area.startx = ps[0];
            area.starty = ps[1];
            area.endx = ps[2];
            area.endy = ps[3];
            resultList.push_back(area);
            free(ps);
            if (FALSE)
            {
               cv::Mat sm = cv::Mat(img, cv::Rect(area.startx, area.starty, area.endx - area.startx + 1, area.endy - area.starty + 1));
               cv::imwrite(string("C:\\Users\\Administrator\\Desktop\\ocr\\trade_queue\\").append(to_string(index)).append(".png"), sm);
            }
            index++;
         }
      }
   }
   return resultList;
}
HWND L2TradeQueueUtil::getTradeQueueBuyHWND(HWND tradeQueueHWND)
{
   //暂时放在这儿
   HWND temp = NULL;
   while (TRUE)
   {
      temp = FindWindowExA(tradeQueueHWND, temp, "#32770", "买卖队列");
      if (Win32Util::isWindowShow(temp) || temp <= 0) {
         break;
      }
   }
   if (temp <= 0) {
      throw string("未找到买卖队列句柄");
   }
   HWND childTemp = NULL;
   HWND rightHWND=NULL;
   int rightPOS=-1;
   while (TRUE)
   {
      childTemp = FindWindowExA(temp, childTemp, "#32770", NULL);
      if (childTemp <= 0) {
         break;
      }
      else {
         if (Win32Util::isWindowShow(childTemp)) {
            //获取最右侧的内容框句柄
            RECT rect;
            Win32Util::getWindowRect(childTemp, &rect);
            if (rightPOS == -1) {
               rightHWND = childTemp;
               rightPOS = rect.right;
            }
            else if (rect.right > rightPOS) {
               rightHWND = childTemp;
               rightPOS = rect.right;
            }
         }
      }
   }
   if (rightHWND <= 0) {
      throw string("买入成交队列句柄查找失败");
   }
   rightHWND = FindWindowExA(rightHWND, NULL, "SysListView32", NULL);
   if (rightHWND <= 0) {
      throw string("买入成交队列句柄查找失败");
   }
   return rightHWND;
}
void L2TradeQueueUtil::filterTradeQueueBuyMat(cv::Mat& grayImg)
{
   list<ImgArea> areas;
   int startR = -1;
   for (int r = 0; r < grayImg.rows; r++) {
      int startc = -1;
      int endc = -1;
      bool empty = TRUE;
      for (int c = 0; c < grayImg.cols; c++) {
         uchar data = grayImg.ptr<uchar>(r)[c];
         if (data >= 178 && data <= 180) {
            empty = FALSE;
            if (startc < 0) {
               startc = c;
               endc = c;
            }
            endc = c;
         }
         else {
            if (startc > 0 && endc - startc > 10 && startR < 0) {
               ImgArea area;
               area.startx = startc;
               area.endx = endc;
               area.starty = r;
               area.endy = -1;
               areas.push_back(area);
               startc = -1;
               endc = -1;
            }
         }
      }
      if (areas.size() > 0 && startR < 0) {
         startR = r;
      }
      if (!empty && areas.size() > 0) {
         continue;
      }
      if (startR > 0 && empty) {
         printf("起始行%d, 结束行:%d 数据条数:%d\n", startR, r, areas.size());
         for (list<ImgArea>::iterator ele = areas.begin(); ele != areas.end(); ++ele) {
            ImgArea area = *ele;
            area.endy = r - 1;
            printf("%d,%d,%d,%d\n", area.startx, area.starty, area.endx, area.endy);
            for (int r = area.starty; r <= area.endy; r++) {
               for (int c = area.startx; c <= area.endx; c++) {
                  uchar   data = grayImg.ptr<uchar>(r)[c];
                  if (data >= _IMG_BINARY_THRESHOLD) {
                     grayImg.ptr<uchar>(r)[c] = 0;
                  }
                  else {
                     grayImg.ptr<uchar>(r)[c] = 255;
                  }
               }
            }
         }
         printf("------------------------\n");
         startR = -1;
         areas.clear();
      }
   }
}
list<int*> L2TradeQueueUtil::splitRows(cv::Mat img)
{
   list<int*>  rowDataList;
@@ -129,23 +341,25 @@
   return rowDataList;
}
list<int*> L2TradeQueueUtil::splitCols(cv::Mat img, int startx, int starty, int endx, int endy)
list<int*> L2TradeQueueUtil::splitCols(cv::Mat img, int startx, int starty, int endx, int endy, int minContentWidth)
{
   cv::imwrite("C:\\Users\\Administrator\\Desktop\\ocr\\l2_trade\\test.png", cv::Mat(img, cv::Rect(startx, starty, endx - startx, endy - starty)));
   if (FALSE)
   {
      cv::imwrite("C:\\Users\\Administrator\\Desktop\\ocr\\l2_trade\\test.png", cv::Mat(img, cv::Rect(startx, starty, endx - startx + 1, endy - starty + 1)));
   }
   list<int*> splitList;
   int empty_start = -1;
   int empty_end = -1;
   int start_col = -1;
   int end_col = -1;
   for (int c = startx; c <= endx; c++) {
      if (ImgDivider::isColEmpty(img, c, starty, endy)) {
      if (ImgDivider::isColEmpty(img, c, starty, endy,_IMG_BINARY_THRESHOLD)) {
         if (empty_start < 0) {
            empty_start = c;
         }
         empty_end = c;
         if (empty_end - empty_start > 10) {
            if (end_col - start_col >= 6) {
            if (end_col - start_col >= minContentWidth) {
               int* itemData = (int*)malloc(sizeof(int) * 4);
               itemData[0] = start_col;
               itemData[1] = starty;
@@ -167,6 +381,16 @@
         empty_end = -1;
      }
   }
   if (end_col - start_col >= minContentWidth) {
      int* itemData = (int*)malloc(sizeof(int) * 4);
      itemData[0] = start_col;
      itemData[1] = starty;
      itemData[2] = empty_start - 1;
      itemData[3] = endy;
      splitList.push_back(itemData);
      start_col = -1;
      end_col = -1;
   }
   return splitList;
}