From 3680049029e6a193eae069596be04ce0fb2b1303 Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期六, 05 十一月 2022 17:19:55 +0800 Subject: [PATCH] '增加l2稳定性' --- ConsoleApplication/L2DataCapture.cpp | 112 ++++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 76 insertions(+), 36 deletions(-) diff --git a/ConsoleApplication/L2DataCapture.cpp b/ConsoleApplication/L2DataCapture.cpp index e51bf89..186fb44 100644 --- a/ConsoleApplication/L2DataCapture.cpp +++ b/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); -- Gitblit v1.8.0