admin
2022-09-09 60feedf43a35a9ca69d05095a01c5d1797b1bdc3
ConsoleApplication/LimitUpCapture.cpp
@@ -3,6 +3,8 @@
#include <set>
#include "Win32Util.h"
#include "TaskChecker.h"
#include "GPUtil.h"
bool LimitUpCapture::tradeTimeCapture;
OpenCLExcuter* LimitUpCapture::openCLExcuter;
bool LimitUpCapture::inited;
//是否正在执行
@@ -32,6 +34,12 @@
   while (true) {
      if (kill)
         break;
      if (tradeTimeCapture) {
         if (!GPUtil::isTradeTime()) {
            Sleep(100);
            continue;
         }
      }
      TaskChecker::clientLiveTime.limitUp = clock();
      if (running && inited) {
         clock_t start = clock();
@@ -47,7 +55,7 @@
   }
}
bool LimitUpCapture::pause;
void LimitUpCapture::init(CallbackFun_Limit_Up callback, void* contex) {
   data_callback = callback;
@@ -60,7 +68,12 @@
   thread rt(&(LimitUpCapture::_run));
   rt.detach();
   inited = true;
   refreshHWND();
   try {
      refreshHWND();
   }
   catch (...) {
   }
}
void LimitUpCapture::reCreateRunning()
{
@@ -74,6 +87,12 @@
   HWND hwnd = getWindow();
   if (hwnd <= 0)
      throw string("同花顺副屏2未打开");
   //输入快捷键51定位到我的版块
   Win32Util::focus(hwnd);
   Win32Util::keyboardNum("51", 200);
   Win32Util::keyboard(VK_RETURN, 1000);
   Sleep(500);
   HWND content = FindWindowExA(hwnd, NULL, "AfxFrameOrView100s", NULL);
@@ -193,15 +212,15 @@
   list<int*> rowData = THSActionUtil::splitPlateRowArea(grayImg);
   //每行的元素个数
   int ele_count_per_line = 4;
   int* splitResult = (int*)malloc(sizeof(int) * 4 * 4 * rowData.size());
   int ele_count_per_line = 5;
   int num_length_per_ele = 6;
   int* splitResult = (int*)malloc(sizeof(int) * 4 * ele_count_per_line * rowData.size());
   int* rowIndex = (int*)malloc(sizeof(int) * 4 * rowData.size());
   int count = 0;
   for (std::list<int*>::iterator ele = rowData.begin();ele != rowData.end();ele++) {
      string path = "C:\\Users\\Administrator\\Desktop\\ocr\\limit_up\\";
      path.append(to_string(count)).append(".jpg");
      //cv::imwrite(path, cv::Mat(grayImg, cv::Rect((*ele)[0], (*ele)[1], (*ele)[2] - (*ele)[0] + 1, (*ele)[3] - (*ele)[1] + 1)));
      rowIndex[4 * count + 0] = (*ele)[0];
      rowIndex[4 * count + 1] = (*ele)[1];
      rowIndex[4 * count + 2] = (*ele)[2];
@@ -210,24 +229,32 @@
      count++;
   }
   int line_number_count = 4 * 6;
   int line_number_count = ele_count_per_line * num_length_per_ele;
   openCLExcuter->splitPlateContentRowData(grayImg.data, grayImg.cols, grayImg.rows, rowIndex, rowData.size(), ele_count_per_line,1,4,splitResult);
   openCLExcuter->splitPlateContentRowData(grayImg.data, grayImg.cols, grayImg.rows, rowIndex, rowData.size(), ele_count_per_line,1,5,splitResult);
   /*
   *测试
   //测试
   set<int> excudeIndexs;
   for (int i = 0;i < rowData.size();i++) {
      for (int j = 0;j < line_number_count;j++) {
         int sx = splitResult[(line_number_count * i + j) * 4 + 0];
         int sy = splitResult[(line_number_count * i + j) * 4 + 1];
         int ex = splitResult[(line_number_count * i + j) * 4 + 2];
         int ey = splitResult[(line_number_count * i + j) * 4 + 3];
      for (int j = 0;j < ele_count_per_line;j++) {
         int sx = splitResult[(ele_count_per_line * i + j) * 4 + 0];
         int sy = splitResult[(ele_count_per_line * i + j) * 4 + 1];
         int ex = splitResult[(ele_count_per_line * i + j) * 4 + 2];
         int ey = splitResult[(ele_count_per_line * i + j) * 4 + 3];
         string path = "C:\\Users\\Administrator\\Desktop\\ocr\\limit_up\\";
         path.append(to_string(i)).append("_").append(to_string(j)).append(".jpg");
         //cv::imwrite(path, cv::Mat(grayImg, cv::Rect(sx, sy, ex - sx + 1, ey - sy + 1)));
      }
      int sx = splitResult[(ele_count_per_line * i + 0) * 4 + 0];
      int ex = splitResult[(ele_count_per_line * i + 0) * 4 + 2];
      if (ex - sx < 40) {
      //噪点数据
         excudeIndexs.insert(i);
      }
   }
   */
@@ -249,10 +276,12 @@
      }
   }
   unsigned char* totalNumberData = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_GP_CODE_HEIGHT * rowData.size()) * _NUMBER_GP_CODE_WIDTH * 10 * line_number_count);
   openCLExcuter->splitPlateNum(grayImg.data, grayImg.cols, grayImg.rows, splitResult, 4 * rowData.size(), zeroData, _NUMBER_GP_CODE_WIDTH, _NUMBER_GP_CODE_HEIGHT, line_number_count, totalNumberData);
   unsigned char types[] = { NUM_TYPE_MONEY,NUM_TYPE_CODE,NUM_TYPE_TIME, NUM_TYPE_PRICE,NUM_TYPE_PERCENT};
   UcharDataInfo typesData = UcharDataInfo();
   typesData.length = 5;
   typesData.data = types;
   openCLExcuter->splitPlateNum(grayImg, IntDataInfo({ splitResult,(int)(ele_count_per_line * rowData.size()) }), UcharDataInfo({ totalNumberData, -1 }), typesData, zeroData, _NUMBER_GP_CODE_WIDTH, _NUMBER_GP_CODE_HEIGHT, ele_count_per_line, num_length_per_ele);
   //识别数字
   uchar* templateNums = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_GP_CODE_HEIGHT * rowData.size()) * _NUMBER_GP_CODE_WIDTH * 10 * line_number_count);
@@ -261,86 +290,114 @@
   list<LimitUpData> dataList;
   for (int i = 0;i < rowData.size();i++) {
      if (excudeIndexs.count(i) > 0) {
         continue;
      }
      LimitUpData limitUpData = LimitUpData();
      string code = "";
      for (int j = 0;j < 6;j++)
      {
         code.append(to_string(numberResult[i][j]));
      }
      string time = "";
      for (int j = 0;j < 6;j++)
      {
         if (j == 2 || j == 4) {
            time.append(":");
         }
         time.append(to_string(numberResult[i][6 + j]));
      }
      string price = "";
      for (int j = 0;j < 6;j++)
      {
         if (j == 4) {
            price.append(".");
         }
         price.append(to_string(numberResult[i][6 * 2 + j]));
      }
      string money = "";
      for (int j = 0;j < 6;j++)
      for (int j = 0;j < num_length_per_ele;j++)
      {
         if (j == 4) {
            money.append(".");
         }
         money.append(to_string(numberResult[i][6 * 3 + j]));
         money.append(to_string(numberResult[i][num_length_per_ele*0  + j]));
      }
      string code = "";
      for (int j = 0;j < num_length_per_ele;j++)
      {
         code.append(to_string(numberResult[i][num_length_per_ele * 1+j]));
      }
      string time = "";
      for (int j = 0;j < num_length_per_ele;j++)
      {
         if (j == 2 || j == 4) {
            time.append(":");
         }
         time.append(to_string(numberResult[i][num_length_per_ele*2 + j]));
      }
      string price = "";
      for (int j = 0;j < num_length_per_ele;j++)
      {
         if (j == 4) {
            price.append(".");
         }
         price.append(to_string(numberResult[i][num_length_per_ele * 3 + j]));
      }
      string percent = "";
      for (int j = 0;j < num_length_per_ele;j++)
      {
         if (j == 4) {
            percent.append(".");
         }
         percent.append(to_string(numberResult[i][num_length_per_ele * 4 + j]));
      }
      if (percent == "0000.00") {
         int sx = splitResult[(ele_count_per_line * i + 4) * 4 + 0];
         int sy = splitResult[(ele_count_per_line * i + 4) * 4 + 1];
         int ex = splitResult[(ele_count_per_line * i + 4) * 4 + 2];
         int ey = splitResult[(ele_count_per_line * i + 4) * 4 + 3];
         string path = "C:\\Users\\Administrator\\Desktop\\ocr\\limit_up\\";
         path.append(to_string(i)).append("_").append(".jpg");
         cv::imwrite(path, cv::Mat(grayImg, cv::Rect(sx, sy, ex - sx + 1, ey - sy + 1)));
      }
      limitUpData.index = i;
      limitUpData.code = code;
      limitUpData.time = time;
      limitUpData.price = price;
      limitUpData.limitUpPercent = percent;
      limitUpData.limitMoney = money;
      if (limitUpData.time != "00:00:00" && limitUpData.price != "0000.00" && limitUpData.limitMoney != "0000.00") {
      if (limitUpData.code != "000000" && limitUpData.limitUpPercent != "0000.00") {
         dataList.push_back(limitUpData);
      }
      free(numberResult[i]);
   }
   free(numberResult);
   int* unitData = (int*)malloc(sizeof(int) * 4 * dataList.size());
   //识别金额单位
   int index = 0;
   for (list<LimitUpData>::iterator ele = dataList.begin();ele != dataList.end();ele++) {
      unitData[index * 4 + 0] = splitResult[(*ele).index * 4 * 4 + 4 * 3 + 0];
      unitData[index * 4 + 1] = splitResult[(*ele).index * 4 * 4 + 4 * 3 + 1];
      unitData[index * 4 + 2] = splitResult[(*ele).index * 4 * 4 + 4 * 3 + 2];
      unitData[index * 4 + 3] = splitResult[(*ele).index * 4 * 4 + 4 * 3 + 3];
      index++;
   }
   int* unitResult = (int*)malloc(sizeof(int) * dataList.size());
   openCLExcuter->recognitionPlateMoneyUnit(grayImg.data, grayImg.cols, grayImg.rows, unitData, 1, dataList.size(), unitResult);
   index = 0;
   for (list<LimitUpData>::iterator ele = dataList.begin();ele != dataList.end();ele++) {
      switch (unitResult[index])
      {
      case 0:
         (*ele).limitMoneyUnit = MONEY_UNIT_Y;
         break;
      case 1:
         (*ele).limitMoneyUnit = MONEY_UNIT_W;
         break;
      default:
         break;
   if (dataList.size() > 0)
   {
      int* unitData = (int*)malloc(sizeof(int) * 4 * dataList.size());
      //识别金额单位
      int index = 0;
      for (list<LimitUpData>::iterator ele = dataList.begin();ele != dataList.end();ele++) {
         unitData[index * 4 + 0] = splitResult[(*ele).index * 4 * ele_count_per_line + 4 * 0 + 0];
         unitData[index * 4 + 1] = splitResult[(*ele).index * 4 * ele_count_per_line + 4 * 0 + 1];
         unitData[index * 4 + 2] = splitResult[(*ele).index * 4 * ele_count_per_line + 4 * 0 + 2];
         unitData[index * 4 + 3] = splitResult[(*ele).index * 4 * ele_count_per_line + 4 * 0 + 3];
         index++;
      }
      index++;
      int* unitResult = (int*)malloc(sizeof(int) * dataList.size());
      openCLExcuter->recognitionPlateMoneyUnit(grayImg.data, grayImg.cols, grayImg.rows, unitData, 1, dataList.size(), unitResult);
      index = 0;
      for (list<LimitUpData>::iterator ele = dataList.begin();ele != dataList.end();ele++) {
         switch (unitResult[index])
         {
         case 0:
            (*ele).limitMoneyUnit = MONEY_UNIT_Y;
            break;
         case 1:
            (*ele).limitMoneyUnit = MONEY_UNIT_W;
            break;
         default:
            break;
         }
         index++;
      }
      free(unitData);
      free(unitResult);
   }
   free(rowIndex);
   free(splitResult);
   free(zeroData);
   free(templateNums);
   free(unitData);
   free(unitResult);
   free(imgData);
   grayImg.release();
@@ -366,26 +423,31 @@
      if (kill) {
         break;
      }
      //暂停
      while (pause) {
         cout <<"涨停识别暂停"<< endl;
         Sleep(100);
      }
      int x = (*ele).x;//+ menuRect.left;
      int y = (*ele).y;//+ menuRect.top;
      printf("x:%d y:%d\n", x, y);
      SendMessage(menuWin, WM_LBUTTONDOWN, 0, MAKELONG(x, y));
       PostMessage(menuWin, WM_LBUTTONDOWN, 0, MAKELONG(x, y));
      Sleep(10);
      SendMessage(menuWin, WM_LBUTTONUP, 0, MAKELONG(x, y));
      PostMessage(menuWin, WM_LBUTTONUP, 0, MAKELONG(x, y));
      //SendMessage(menuWin, WM_SETCURSOR,(int) menuWin, 0x02000001);
      //Win32Util::focus(menuWin);
      //Win32Util::click(x, y);
      Sleep(100);
      Sleep(50);
      
      for (int i = 0;i < 3;i++)
      for (int i = 0;i < 2;i++)
      {
         if (kill) {
            break;
         }
         int x = wrect.right - 50;
         int y = wrect.top + 50;
         SendMessage(win, WM_MOUSEWHEEL, 0, MAKEWORD(x, y));
         Sleep(100);
         PostMessage(win, WM_MOUSEWHEEL, 0, MAKEWORD(x, y));
         Sleep(200);
         cv::Mat oimg = CaptureUtil::capture(win);
         list<LimitUpData> codes = captureLimitUpCodes(oimg);
         for (list<LimitUpData>::iterator ele = codes.begin();ele != codes.end();ele++) {