| | |
| | | #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; |
| | | |
| | |
| | | string L2DataCapture::gpCodes[THS_FRAME_COUNT]; |
| | | |
| | | void* L2DataCapture::context; |
| | | |
| | | |
| | | |
| | | //运行 |
| | | void L2DataCapture::_run(int index) |
| | |
| | | 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); |
| | |
| | | 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; |
| | | } |
| | |
| | | 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) { |
| | | //黑白图片 |
| | |
| | | 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) |
| | | { |
| | |
| | | } |
| | | } |
| | | catch (...) { |
| | | //释放内存 |
| | | free(imgData); |
| | | imgData = NULL; |
| | | |
| | | img.release(); |
| | | img = NULL; |
| | | throw int(ERROR_CODE_DIVIDE_IMG_FAIL); |
| | | } |
| | | //一维行图像数据 |
| | |
| | | free(rowDataOneLevel); |
| | | } |
| | | catch (...) { |
| | | img.release(); |
| | | img = NULL; |
| | | free(rowDataOneLevel); |
| | | free(rowSplitDataOneLevel); |
| | | free(imgData); |
| | | throw string("图片分隔出错"); |
| | | } |
| | | |
| | |
| | | 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出错"); |
| | | } |
| | | |
| | | |
| | | |
| | |
| | | |
| | | //准备模板数字 |
| | | 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(); |
| | |
| | | } |
| | | */ |
| | | |
| | | |
| | | 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; |
| | |
| | | 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); |