admin
2022-11-05 3680049029e6a193eae069596be04ce0fb2b1303
ConsoleApplication/L2DataCapture.cpp
@@ -5,6 +5,11 @@
#include <thread>
#include "TaskChecker.h"
#include "GPUtil.h"
#include "LogUtil.h"
//#define malloc(size) malloc(size)
//#define free(ptr) free(ptr)
bool L2DataCapture::inited;
bool L2DataCapture::tradeTimeCapture;
@@ -25,8 +30,6 @@
string L2DataCapture::gpCodes[THS_FRAME_COUNT];
void* L2DataCapture::context;
//运行
void L2DataCapture::_run(int index)
@@ -49,13 +52,32 @@
         try {
            clock_t start = clock();
            cv::Mat mat = CaptureUtil::capture(index, CAPTURE_TYPE_L2);
            if (mat.cols <= 400 || mat.rows <= 1800) {
               mat.release();
               mat = NULL;
               Sleep(100);
               throw string("截图出错");
            }
            list<TradeData> resultList = captureLevel2TradeData(mat, index);
            long processTime = clock() - start;
            data_callback(index, code, start , processTime, resultList, context);
            cout << "时间消耗:" << processTime << endl;
         }
         catch (string st) {
            //delete (openCLExcuter[index]);
            //openCLExcuter[index] = new OpenCLExcuter();
            //openCLExcuter[index]->init();
            LogUtil::getInstance()->getL2Logger().error(string("识别出错:").append(st));
         }
         catch (int error_code) {
            LogUtil::getInstance()->getL2Logger().error(string("识别出错:code-").append(to_string(error_code)));
         }
         catch (exception& e) {
            LogUtil::getInstance()->getL2Logger().error(string("识别出错:").append(e.what()));
         }
         catch (...) {
            LogUtil::getInstance()->getL2Logger().error(string("识别出错:").append("未知错误"));
         }
      }
      Sleep(2);
@@ -189,7 +211,7 @@
   return inited;
}
list<TradeData>  L2DataCapture::captureLevel2TradeData(cv::Mat oimg, int identify) {
list<TradeData>  L2DataCapture::captureLevel2TradeData(cv::Mat& oimg, int identify) {
   if (oimg.rows == 0 || oimg.cols == 0) {
      throw ERROR_CODE_CAPTURE_FAIL;
   }
@@ -203,17 +225,20 @@
   return resultList;
}
list<TradeData> L2DataCapture::captureLevel2TradeData(OpenCLExcuter* openCLExcuter, cv::Mat oimg, int identify)
list<TradeData> L2DataCapture::captureLevel2TradeData(OpenCLExcuter* openCLExcuter, cv::Mat& oimg, int identify)
{
   if (oimg.cols <= 0 || oimg.rows <= 0) {
      throw string("图像数据错误");
   }
   //LogUtil::debug("截图完成");
   clock_t time_1 = clock();
   //std::cout << "截图完成: threadid-" << std::this_thread::get_id() << " 耗时:" << (time_1 - starttime) << endl;
   //灰度化
   cv::Mat img = cv::Mat::zeros(oimg.rows, oimg.cols, CV_8UC1);//ImgUtil::grayImage(oimg);
   cv::Mat img = cv::Mat::zeros(oimg.rows, oimg.cols, CV_8UC1);
   uchar* imgData = (uchar*)malloc(sizeof(uchar) * oimg.rows * oimg.cols);
   //
   if (oimg.channels() == 1) {
      //黑白图片
@@ -223,26 +248,21 @@
      try {
         if (oimg.channels() == 3)
         {
            openCLExcuter->rgb2Gray(oimg, imgData);
            openCLExcuter->rgb2Gray(oimg, img.data);
         }
         else {
            openCLExcuter->rgba2Gray(oimg, imgData);
            openCLExcuter->rgba2Gray(oimg, img.data);
         }
         oimg.release();
      }
      catch (...) {
         cv::imwrite("D:\\imgs\\l2.png", oimg);
         if (imgData != NULL)
         {
            free(imgData);
         }
         imgData = NULL;
         oimg.release();
         oimg = NULL;
         img.release();
         img = NULL;
         throw string("灰度出错");
      }
      img.data = imgData;
      oimg.release();
      //img.data = imgData;
      clock_t time_2_ = clock();
      if (identify == 0)
      {
@@ -267,10 +287,8 @@
      }
   }
   catch (...) {
      //释放内存
      free(imgData);
      imgData = NULL;
      img.release();
      img = NULL;
      throw int(ERROR_CODE_DIVIDE_IMG_FAIL);
   }
   //一维行图像数据
@@ -293,9 +311,10 @@
      free(rowDataOneLevel);
   }
   catch (...) {
      img.release();
      img = NULL;
      free(rowDataOneLevel);
      free(rowSplitDataOneLevel);
      free(imgData);
      throw string("图片分隔出错");
   }
   
@@ -474,10 +493,17 @@
   clock_t time_33 = clock();
   if (identify == 0)
      std::cout << "数据准备-0数据准备: threadid-" << std::this_thread::get_id() << " 耗时:" << time_33 - time_32 << "总耗时:" << time_33 - time_1 << endl;
   openCLExcuter->splitL2Num(imgData, img.cols, img.rows, pos, 4 * rowDataList.size(), zeroData, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, _NUMBER_L2_TOTAL_NUMBER, totalNumberData);
   free(zeroData);
   free(pos);
   try {
      openCLExcuter->splitL2Num(img.data, img.cols, img.rows, pos, 4 * rowDataList.size(), zeroData, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, _NUMBER_L2_TOTAL_NUMBER, totalNumberData);
      free(zeroData);
      free(pos);
   }
   catch (...) {
      free(zeroData);
      free(pos);
      free(totalNumberData);
      throw string("splitL2Num出错");
   }
@@ -496,8 +522,15 @@
   //准备模板数字
   uchar* templateNums = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_L2_HEIGHT * rowDataList.size()) * _NUMBER_L2_WIDTH * 10 * _NUMBER_L2_TOTAL_NUMBER);
   try {
      openCLExcuter->createNumberTemplates(rowDataList.size(), _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, _NUMBER_L2_TOTAL_NUMBER, ImgUtil::numsOneLevel_level2, templateNums);
   }
   catch (...) {
      free(totalNumberData);
      free(templateNums);
      throw string("创建数据模板出错");
   openCLExcuter->createNumberTemplates(rowDataList.size(), _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, _NUMBER_L2_TOTAL_NUMBER, ImgUtil::numsOneLevel_level2, templateNums);
   }
   //ImgUtil::createTemplateNumData(data.size());
   clock_t time_4 = clock();
@@ -520,12 +553,21 @@
   }
   */
   uchar** numberResult=nullptr;
   //数字识别
   uchar** numberResult = openCLExcuter->recognition_numbers(totalNumberData, templateNums, rowDataList.size() * _NUMBER_L2_HEIGHT, _NUMBER_L2_WIDTH * 10 * _NUMBER_L2_TOTAL_NUMBER, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, _NUMBER_L2_TOTAL_NUMBER);
   //释放内存
   free(totalNumberData);
   free(templateNums);
   try {
       numberResult = openCLExcuter->recognition_numbers(totalNumberData, templateNums, rowDataList.size() * _NUMBER_L2_HEIGHT, _NUMBER_L2_WIDTH * 10 * _NUMBER_L2_TOTAL_NUMBER, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, _NUMBER_L2_TOTAL_NUMBER);
      //释放内存
      free(totalNumberData);
      free(templateNums);
   }
   catch (...) {
      //释放内存
      free(totalNumberData);
      free(templateNums);
      throw string("数字识别出错");
   }
   //循环读取数字
   list<TradeData>::iterator tradeEle;
   index = 0;
@@ -571,8 +613,6 @@
      std::cout << "数字识别完成: threadid-" << std::this_thread::get_id() << " 耗时:" << time_6 - time_5 << "总耗时:" << time_6 - time_1 << endl;
   //释放内存
   //img.release();
   free(imgData);
   img.release();
   rowDataList.clear();
   list<int*>().swap(rowDataList);