From 954ead41d9391bca28a3cc4f9592f73f25b3bbc8 Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期一, 02 一月 2023 17:55:06 +0800 Subject: [PATCH] '完善批量设置代码' --- ConsoleApplication/TradeListCapture.cpp | 904 +++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 636 insertions(+), 268 deletions(-) diff --git a/ConsoleApplication/TradeListCapture.cpp b/ConsoleApplication/TradeListCapture.cpp index 6ddb8b9..00f0622 100644 --- a/ConsoleApplication/TradeListCapture.cpp +++ b/ConsoleApplication/TradeListCapture.cpp @@ -5,12 +5,15 @@ #include "GPUtil.h" bool TradeListCapture::tradeTimeCapture_success; bool TradeListCapture::tradeTimeCapture_delegate; -OpenCLExcuter* TradeListCapture::openCLExcuter; +OpenCLExcuter* TradeListCapture::openCLExcuterDelegate; +OpenCLExcuter* TradeListCapture::openCLExcuterSuccess; + bool TradeListCapture::inited; bool TradeListCapture::kill_d; bool TradeListCapture::kill_s; HWND TradeListCapture::trade_delegate_win; HWND TradeListCapture::trade_success_win; +HWND TradeListCapture::trade_simple_delegate_win; RecognitionManager* TradeListCapture::recognitionManager; //是否正在执行 @@ -72,8 +75,8 @@ if (running_d && inited) { clock_t start = clock(); try { - list<TradeDelegateData> datas = captureTradeDelegateInfo(); - string money = getAvaiableMoney(); + list<TradeDelegateData> datas = captureSimpleTradeDelegateInfo(); + string money = getSimpleAvaiableMoney(); cout << "耗时:" << clock() - start << " 数量:" << datas.size() << endl; data_callback_delegate(datas, money, context); datas.clear(); @@ -81,7 +84,7 @@ catch (...) { } - Sleep(5); + Sleep(500); } else { Sleep(2000); @@ -91,16 +94,16 @@ -cv::Mat TradeListCapture::grayImgs(cv::Mat oimg) { +cv::Mat TradeListCapture::grayImgs(cv::Mat oimg, OpenCLExcuter* openCLExcuter) { cv::Mat grayImg = cv::Mat::zeros(oimg.rows, oimg.cols, CV_8UC1);//ImgUtil::grayImage(oimg); uchar* imgData = (uchar*)malloc(sizeof(uchar) * oimg.rows * oimg.cols); if (oimg.channels() == 3) { - openCLExcuter->rgb2ThresholdInvert(oimg.data, oimg.cols, oimg.rows, imgData,64); + openCLExcuter->rgb2ThresholdInvert(oimg.data, oimg.cols, oimg.rows, imgData, 64); } else { - openCLExcuter->rgba2ThresholdInvert(oimg.data, oimg.cols, oimg.rows, imgData,64); + openCLExcuter->rgba2ThresholdInvert(oimg.data, oimg.cols, oimg.rows, imgData, 64); } grayImg.data = imgData; @@ -118,8 +121,11 @@ running_d = false; recognitionManager = new RecognitionManager(); - openCLExcuter = new OpenCLExcuter(); - openCLExcuter->init(); + openCLExcuterDelegate = new OpenCLExcuter(); + openCLExcuterDelegate->init(); + + openCLExcuterSuccess = new OpenCLExcuter(); + openCLExcuterSuccess->init(); thread rt(&(TradeListCapture::_run_s)); rt.detach(); @@ -138,6 +144,13 @@ try { refreshTradeDelegateHWND(); + } + catch (...) { + + } + + try { + refreshTradeSimpleDelegateHWND(); } catch (...) { @@ -176,6 +189,33 @@ trade_delegate_win = content; } +void TradeListCapture::refreshTradeSimpleDelegateHWND() +{ + HWND hwnd = THSActionUtil::getTradeSimpleDelegateWindow(); + if (hwnd <= 0) + throw string("同花顺远航版精简交易页面未打开"); + + HWND win = FindWindowExA(hwnd, NULL, "AfxMDIFrame140s", NULL); + HWND child = NULL; + HWND content = 0; + for (int i = 0; i < 3; i++) { + child = FindWindowExA(win, child, "#32770", NULL); + if (child > 0) { + + HWND table = FindWindowExA(child, NULL, NULL, "HexinScrollWnd"); + if (table > 0) { + content = table; + break; + } + } + } + if (content <= 0) + throw string("未获取到内容窗口句柄"); + + trade_simple_delegate_win = content; + +} + void TradeListCapture::refreshTradeSuccessHWND() { HWND hwnd = THSActionUtil::getTradeSuccessWindow(); @@ -187,7 +227,7 @@ HWND temp = FindWindowEx(hwnd, NULL, TEXT("#32770"), NULL); HWND first = 0; - for (int i = 0;i < 20;i++) { + for (int i = 0; i < 20; i++) { if (IsWindowVisible(temp)) { RECT rect; GetWindowRect(temp, &rect); @@ -216,7 +256,7 @@ //顺序 代码-成交时间-成交数量-成交均价-成交金额-合同编号-操作 list<TradeSuccessData> TradeListCapture::captureTradeSuccessInfo(cv::Mat oimg) { - cv::Mat grayImg = grayImgs(oimg); + cv::Mat grayImg = grayImgs(oimg, openCLExcuterSuccess); list<TradeSuccessData> dataList; //分隔元素 int empty_start = -1; @@ -224,7 +264,7 @@ int data_start = -1; int data_end = -1; list<int*> rowData; - for (int r = 0;r < grayImg.rows;r++) { + for (int r = 0; r < grayImg.rows; r++) { if (ImgDivider::isRowEmpty(grayImg, r, 0, 50)) { if (empty_start < 0) { @@ -261,7 +301,7 @@ { free(grayImg.data); grayImg.release(); - for (list<int*>::iterator ele = rowData.begin();ele != rowData.end();ele++) { + for (list<int*>::iterator ele = rowData.begin(); ele != rowData.end(); ele++) { free(*ele); } return dataList; @@ -279,7 +319,7 @@ int* rowIndex = (int*)malloc(sizeof(int) * rowData.size() * 4); int index = 0; - for (list<int*>::iterator ele = rowData.begin();ele != rowData.end();ele++) { + for (list<int*>::iterator ele = rowData.begin(); ele != rowData.end(); ele++) { rowIndex[index * 4 + 0] = 0; rowIndex[index * 4 + 1] = (*ele)[0]; rowIndex[index * 4 + 2] = grayImg.cols - 1; @@ -295,13 +335,13 @@ int* splitResult = (int*)malloc(sizeof(int) * 4 * ele_count_per_line * rowData.size()); - openCLExcuter->splitPlateContentRowData(grayImg.data, grayImg.cols, grayImg.rows, rowIndex, rowData.size(), ele_count_per_line, 0, 6, splitResult); + openCLExcuterSuccess->splitPlateContentRowData(grayImg.data, grayImg.cols, grayImg.rows, rowIndex, rowData.size(), ele_count_per_line, 0, 6, splitResult); if (false) { //保存分隔结果 - for (int i = 0;i < rowData.size();i++) { + for (int i = 0; i < rowData.size(); i++) { int start = i * ele_count_per_line * 4; - for (int j = 0;j < ele_count_per_line;j++) + for (int j = 0; j < ele_count_per_line; j++) { int startx = splitResult[start]; @@ -319,8 +359,8 @@ //分割数字 unsigned char* zeroData = (unsigned char*)malloc(sizeof(unsigned char) * _NUMBER_L2_WIDTH * _NUMBER_L2_HEIGHT); - for (int r = 0;r < _NUMBER_L2_HEIGHT;r++) { - for (int c = 0;c < _NUMBER_L2_WIDTH;c++) + for (int r = 0; r < _NUMBER_L2_HEIGHT; r++) { + for (int c = 0; c < _NUMBER_L2_WIDTH; c++) { zeroData[r * _NUMBER_L2_WIDTH + c] = ImgUtil::NUMS_LEVEL2[0].data.ptr<uchar>(r)[c]; } @@ -335,7 +375,7 @@ typesData.length = ele_count_per_line; typesData.data = types; - openCLExcuter->splitL2NumNew(grayImg, IntDataInfo({ splitResult,(int)(ele_count_per_line * rowData.size()) }), UcharDataInfo({ totalNumberData, -1 }), typesData, zeroData, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, ele_count_per_line, length_per_num); + openCLExcuterSuccess->splitL2NumNew(grayImg, IntDataInfo({ splitResult,(int)(ele_count_per_line * rowData.size()) }), UcharDataInfo({ totalNumberData, -1 }), typesData, zeroData, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, ele_count_per_line, length_per_num); @@ -343,22 +383,22 @@ //识别数字 uchar* templateNums = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_L2_HEIGHT * rowData.size()) * _NUMBER_L2_WIDTH * 10 * line_number_count); - openCLExcuter->createNumberTemplates(rowData.size(), _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, line_number_count, ImgUtil::numsOneLevel_level2, templateNums); - uchar** numberResult = openCLExcuter->recognition_numbers(totalNumberData, templateNums, rowData.size() * _NUMBER_L2_HEIGHT, _NUMBER_L2_WIDTH * 10 * line_number_count, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, line_number_count); + openCLExcuterSuccess->createNumberTemplates(rowData.size(), _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, line_number_count, ImgUtil::numsOneLevel_level2, templateNums); + uchar** numberResult = openCLExcuterSuccess->recognition_numbers(totalNumberData, templateNums, rowData.size() * _NUMBER_L2_HEIGHT, _NUMBER_L2_WIDTH * 10 * line_number_count, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, line_number_count); - for (int i = 0;i < rowData.size();i++) { + for (int i = 0; i < rowData.size(); i++) { TradeSuccessData industryData = TradeSuccessData(); //代码 string code = ""; - for (int j = length_per_num - 6;j < length_per_num;j++) + for (int j = length_per_num - 6; j < length_per_num; j++) { code.append(to_string(numberResult[i][length_per_num * 0 + j])); } //时间 string time = ""; - for (int j = length_per_num - 6;j < length_per_num;j++) + for (int j = length_per_num - 6; j < length_per_num; j++) { if (j - (length_per_num - 6) == 2 || j - (length_per_num - 6) == 4) time.append(":"); @@ -366,7 +406,7 @@ } //数量 string num = ""; - for (int j = 0;j < length_per_num;j++) + for (int j = 0; j < length_per_num; j++) { num.append(to_string(numberResult[i][length_per_num * 2 + j])); } @@ -374,7 +414,7 @@ //价格 string price = ""; - for (int j = 0;j < length_per_num;j++) + for (int j = 0; j < length_per_num; j++) { if (j == length_per_num - 3) { price.append("."); @@ -392,7 +432,7 @@ //金额 string money = ""; - for (int j = 0;j < length_per_num;j++) + for (int j = 0; j < length_per_num; j++) { if (j == length_per_num - 3) { money.append("."); @@ -409,7 +449,7 @@ //合同编号 string trade_num = ""; - for (int j = 0;j < length_per_num;j++) + for (int j = 0; j < length_per_num; j++) { trade_num.append(to_string(numberResult[i][length_per_num * 5 + j])); } @@ -422,8 +462,8 @@ int endy = splitResult[start + 3]; int count = 0; - for (int r = starty;r <= endy;r++) { - for (int c = startx;c <= endx;c++) { + for (int r = starty; r <= endy; r++) { + for (int c = startx; c <= endx; c++) { uchar v = grayImg.ptr<uchar>(r)[c]; if (v >= _IMG_BINARY_THRESHOLD) { count++; @@ -468,6 +508,14 @@ list<TradeSuccessData> TradeListCapture::captureTradeSuccessInfo() { + + HWND win = THSActionUtil::getTradeSuccessWindow(); + //刷新数据,按F5刷新 + Win32Util::virtualKeyboard(win, VK_F5); + //HWND toolBar = FindWindowExA(win, NULL, "ToolbarWindow32", NULL); + //RECT rect; + //Win32Util::getWindowRect(toolBar, &rect); + //Win32Util::click(rect.left + 170, rect.top + 5); cv::Mat oimg = CaptureUtil::capture(trade_success_win); if (oimg.cols < 10 || oimg.rows < 10) { throw string("截图出错"); @@ -480,256 +528,256 @@ //顺序:委托时间-代码-委托数量-委托价格-成交均价-成效数量-操作 list<TradeDelegateData> TradeListCapture::captureTradeDelegateInfo(cv::Mat oimg) { - cv::Mat grayImg = grayImgs(oimg); + cv::Mat grayImg = grayImgs(oimg, openCLExcuterDelegate); - list<TradeDelegateData> dataList; - //分隔元素 - int empty_start = -1; - int empty_end = -1; - int data_start = -1; - int data_end = -1; - list<int*> rowData; - for (int r = 0;r < grayImg.rows;r++) { - if (ImgDivider::isRowEmpty(grayImg, r, 0, 50)) { + list<TradeDelegateData> dataList; + //分隔元素 + int empty_start = -1; + int empty_end = -1; + int data_start = -1; + int data_end = -1; + list<int*> rowData; + for (int r = 0; r < grayImg.rows; r++) { + if (ImgDivider::isRowEmpty(grayImg, r, 0, 100)) { - if (empty_start < 0) { - empty_start = r; - empty_end = r; - } - else { - empty_end = r; - } - if (data_start > -1 && data_end > -1 && data_end - data_start > 5) { - printf("%d-%d\n", data_start, data_end); - int* d = (int*)malloc(sizeof(int) * 2); - d[0] = data_start; - d[1] = data_end; - rowData.push_back(d); - data_start = -1; - data_end = -1; - } + if (empty_start < 0) { + empty_start = r; + empty_end = r; } else { - empty_start = -1; - empty_end = -1; - - if (data_start < 0) { - data_start = r; - data_end = r; - } - else { - data_end = r; - } + empty_end = r; + } + if (data_start > -1 && data_end > -1 && data_end - data_start > 5) { + printf("%d-%d\n", data_start, data_end); + int* d = (int*)malloc(sizeof(int) * 2); + d[0] = data_start; + d[1] = data_end; + rowData.push_back(d); + data_start = -1; + data_end = -1; } } - if (rowData.size() < 2) - { - free(grayImg.data); - grayImg.release(); - for (list<int*>::iterator ele = rowData.begin();ele != rowData.end();ele++) { - free(*ele); - } - return dataList; - } + else { + empty_start = -1; + empty_end = -1; - //去头去尾 - list<int*>::iterator start = rowData.begin(); - list<int*>::iterator end = rowData.end(); - free(*start); - rowData.erase(start); - std::advance(end, -1); - free(*end); - rowData.erase(end); - - int* rowIndex = (int*)malloc(sizeof(int) * rowData.size() * 4); - - int index = 0; - for (list<int*>::iterator ele = rowData.begin();ele != rowData.end();ele++) { - rowIndex[index * 4 + 0] = 0; - rowIndex[index * 4 + 1] = (*ele)[0]; - rowIndex[index * 4 + 2] = grayImg.cols - 1; - rowIndex[index * 4 + 3] = (*ele)[1]; - free(*ele); - index++; - } - - - int ele_count_per_line = 7; - int length_per_num = 8; - - - int* splitResult = (int*)malloc(sizeof(int) * 4 * ele_count_per_line * rowData.size()); - - openCLExcuter->splitPlateContentRowData(grayImg.data, grayImg.cols, grayImg.rows, rowIndex, rowData.size(), ele_count_per_line, 0, 6, splitResult); - - if (false) { - //保存分隔结果 - for (int i = 0;i < rowData.size();i++) { - int start = i * ele_count_per_line * 4; - for (int j = 0;j < ele_count_per_line;j++) - { - - int startx = splitResult[start]; - int starty = splitResult[start + 1]; - int endx = splitResult[start + 2]; - int endy = splitResult[start + 3]; - start += 4; - string path = "C:\\Users\\Administrator\\Desktop\\ocr\\trade\\"; - path.append(to_string(i)).append("_").append(to_string(j)).append(".jpg"); - cv::imwrite(path, cv::Mat(grayImg, cv::Rect(startx, starty, endx - startx + 1, endy - starty + 1))); - } - } - } - - - //分割数字 - unsigned char* zeroData = (unsigned char*)malloc(sizeof(unsigned char) * _NUMBER_L2_WIDTH * _NUMBER_L2_HEIGHT); - for (int r = 0;r < _NUMBER_L2_HEIGHT;r++) { - for (int c = 0;c < _NUMBER_L2_WIDTH;c++) - { - zeroData[r * _NUMBER_L2_WIDTH + c] = ImgUtil::NUMS_LEVEL2[0].data.ptr<uchar>(r)[c]; - } - } - - int line_number_count = ele_count_per_line * length_per_num; - - unsigned char* totalNumberData = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_L2_HEIGHT * rowData.size()) * _NUMBER_L2_WIDTH * 10 * line_number_count); - - UcharDataInfo typesData = UcharDataInfo(); - unsigned char types[] = { NUM_TYPE_TIME,NUM_TYPE_CODE,NUM_TYPE_CODE,NUM_TYPE_PRICE,NUM_TYPE_PRICE,NUM_TYPE_CODE, NUM_TYPE_CODE }; - typesData.length = ele_count_per_line; - typesData.data = types; - - openCLExcuter->splitL2NumNew(grayImg, IntDataInfo({ splitResult,(int)(ele_count_per_line * rowData.size()) }), UcharDataInfo({ totalNumberData, -1 }), typesData, zeroData, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, ele_count_per_line, length_per_num); - - - - - - //识别数字 - uchar* templateNums = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_L2_HEIGHT * rowData.size()) * _NUMBER_L2_WIDTH * 10 * line_number_count); - openCLExcuter->createNumberTemplates(rowData.size(), _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, line_number_count, ImgUtil::numsOneLevel_level2, templateNums); - uchar** numberResult = openCLExcuter->recognition_numbers(totalNumberData, templateNums, rowData.size() * _NUMBER_L2_HEIGHT, _NUMBER_L2_WIDTH * 10 * line_number_count, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, line_number_count); - - for (int i = 0;i < rowData.size();i++) { - TradeDelegateData delegateData = TradeDelegateData(); - //时间 - string time = ""; - for (int j = length_per_num - 6;j < length_per_num;j++) - { - if (j - (length_per_num - 6) == 2 || j - (length_per_num - 6) == 4) - time.append(":"); - time.append(to_string(numberResult[i][length_per_num * 0 + j])); - } - - //代码 - string code = ""; - for (int j = length_per_num - 6;j < length_per_num;j++) - { - code.append(to_string(numberResult[i][length_per_num * 1 + j])); - } - - - //委托数量 - string num = ""; - for (int j = 0;j < length_per_num;j++) - { - num.append(to_string(numberResult[i][length_per_num * 2 + j])); - } - num = to_string(stoi(num)); - - - //委托价格 - string delegate_price = ""; - for (int j = 0;j < length_per_num;j++) - { - if (length_per_num - j == 3) - delegate_price.append("."); - delegate_price.append(to_string(numberResult[i][length_per_num * 3 + j])); - } - delegate_price = to_string(stod(delegate_price)); - char* chCode; - chCode = new char[20]; - sprintf_s(chCode, delegate_price.length(), "%.3lf", stod(delegate_price)); - std::string delegate_price_str(chCode); - - delegate_price = delegate_price_str; - - - //成交均价 - string percent_price = ""; - for (int j = 0;j < length_per_num;j++) - { - if (length_per_num - j == 3) - percent_price.append("."); - percent_price.append(to_string(numberResult[i][length_per_num * 4 + j])); - } - - chCode = new char[20]; - sprintf_s(chCode, percent_price.length(), "%.3lf", stod(percent_price)); - std::string percent_price_str(chCode); - - percent_price = percent_price_str; - - - //成交数量 - string success_num = ""; - for (int j = 0;j < length_per_num;j++) - { - success_num.append(to_string(numberResult[i][length_per_num * 5 + j])); - } - success_num = to_string(stoi(success_num)); - - - //买入卖出 - int start = i * 4 * ele_count_per_line + 6 * 4; - int startx = splitResult[start]; - int starty = splitResult[start + 1]; - int endx = splitResult[start + 2]; - int endy = splitResult[start + 3]; - - int count = 0; - for (int r = starty;r <= endy;r++) { - for (int c = startx;c <= endx;c++) { - uchar v = grayImg.ptr<uchar>(r)[c]; - if (v >= _IMG_BINARY_THRESHOLD) { - count++; - } - } - } - if (count > 50) { - //卖出 - delegateData.type = TRADE_TYPE_SELL; + if (data_start < 0) { + data_start = r; + data_end = r; } else { - //买入 - delegateData.type = TRADE_TYPE_BUY; + data_end = r; } - - - delegateData.index = i; - delegateData.code = code; - delegateData.time = time; - delegateData.num = num; - delegateData.price = delegate_price; - delegateData.trade_price = percent_price; - delegateData.trade_num = success_num; - - - dataList.push_back(delegateData); - free(numberResult[i]); } - - free(totalNumberData); - free(numberResult); - free(rowIndex); - free(splitResult); - free(zeroData); - free(templateNums); + } + if (rowData.size() < 2) + { free(grayImg.data); grayImg.release(); - + for (list<int*>::iterator ele = rowData.begin(); ele != rowData.end(); ele++) { + free(*ele); + } return dataList; + } + + //去头去尾 + list<int*>::iterator start = rowData.begin(); + list<int*>::iterator end = rowData.end(); + free(*start); + rowData.erase(start); + std::advance(end, -1); + free(*end); + rowData.erase(end); + + int* rowIndex = (int*)malloc(sizeof(int) * rowData.size() * 4); + + int index = 0; + for (list<int*>::iterator ele = rowData.begin(); ele != rowData.end(); ele++) { + rowIndex[index * 4 + 0] = 0; + rowIndex[index * 4 + 1] = (*ele)[0]; + rowIndex[index * 4 + 2] = grayImg.cols - 1; + rowIndex[index * 4 + 3] = (*ele)[1]; + free(*ele); + index++; + } + + + int ele_count_per_line = 7; + int length_per_num = 8; + + + int* splitResult = (int*)malloc(sizeof(int) * 4 * ele_count_per_line * rowData.size()); + + openCLExcuterDelegate->splitPlateContentRowData(grayImg.data, grayImg.cols, grayImg.rows, rowIndex, rowData.size(), ele_count_per_line, 0, 6, splitResult); + + if (false) { + //保存分隔结果 + for (int i = 0; i < rowData.size(); i++) { + int start = i * ele_count_per_line * 4; + for (int j = 0; j < ele_count_per_line; j++) + { + + int startx = splitResult[start]; + int starty = splitResult[start + 1]; + int endx = splitResult[start + 2]; + int endy = splitResult[start + 3]; + start += 4; + string path = "C:\\Users\\Administrator\\Desktop\\ocr\\trade\\"; + path.append(to_string(i)).append("_").append(to_string(j)).append(".jpg"); + cv::imwrite(path, cv::Mat(grayImg, cv::Rect(startx, starty, endx - startx + 1, endy - starty + 1))); + } + } + } + + + //分割数字 + unsigned char* zeroData = (unsigned char*)malloc(sizeof(unsigned char) * _NUMBER_L2_WIDTH * _NUMBER_L2_HEIGHT); + for (int r = 0; r < _NUMBER_L2_HEIGHT; r++) { + for (int c = 0; c < _NUMBER_L2_WIDTH; c++) + { + zeroData[r * _NUMBER_L2_WIDTH + c] = ImgUtil::NUMS_LEVEL2[0].data.ptr<uchar>(r)[c]; + } + } + + int line_number_count = ele_count_per_line * length_per_num; + + unsigned char* totalNumberData = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_L2_HEIGHT * rowData.size()) * _NUMBER_L2_WIDTH * 10 * line_number_count); + + UcharDataInfo typesData = UcharDataInfo(); + unsigned char types[] = { NUM_TYPE_TIME,NUM_TYPE_CODE,NUM_TYPE_CODE,NUM_TYPE_PRICE,NUM_TYPE_PRICE,NUM_TYPE_CODE, NUM_TYPE_CODE }; + typesData.length = ele_count_per_line; + typesData.data = types; + + openCLExcuterDelegate->splitL2NumNew(grayImg, IntDataInfo({ splitResult,(int)(ele_count_per_line * rowData.size()) }), UcharDataInfo({ totalNumberData, -1 }), typesData, zeroData, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, ele_count_per_line, length_per_num); + + + + + + //识别数字 + uchar* templateNums = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_L2_HEIGHT * rowData.size()) * _NUMBER_L2_WIDTH * 10 * line_number_count); + openCLExcuterDelegate->createNumberTemplates(rowData.size(), _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, line_number_count, ImgUtil::numsOneLevel_level2, templateNums); + uchar** numberResult = openCLExcuterDelegate->recognition_numbers(totalNumberData, templateNums, rowData.size() * _NUMBER_L2_HEIGHT, _NUMBER_L2_WIDTH * 10 * line_number_count, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, line_number_count); + + for (int i = 0; i < rowData.size(); i++) { + TradeDelegateData delegateData = TradeDelegateData(); + //时间 + string time = ""; + for (int j = length_per_num - 6; j < length_per_num; j++) + { + if (j - (length_per_num - 6) == 2 || j - (length_per_num - 6) == 4) + time.append(":"); + time.append(to_string(numberResult[i][length_per_num * 0 + j])); + } + + //代码 + string code = ""; + for (int j = length_per_num - 6; j < length_per_num; j++) + { + code.append(to_string(numberResult[i][length_per_num * 1 + j])); + } + + + //委托数量 + string num = ""; + for (int j = 0; j < length_per_num; j++) + { + num.append(to_string(numberResult[i][length_per_num * 2 + j])); + } + num = to_string(stoi(num)); + + + //委托价格 + string delegate_price = ""; + for (int j = 0; j < length_per_num; j++) + { + if (length_per_num - j == 3) + delegate_price.append("."); + delegate_price.append(to_string(numberResult[i][length_per_num * 3 + j])); + } + delegate_price = to_string(stod(delegate_price)); + char* chCode; + chCode = new char[20]; + sprintf_s(chCode, delegate_price.length(), "%.3lf", stod(delegate_price)); + std::string delegate_price_str(chCode); + + delegate_price = delegate_price_str; + + + //成交均价 + string percent_price = ""; + for (int j = 0; j < length_per_num; j++) + { + if (length_per_num - j == 3) + percent_price.append("."); + percent_price.append(to_string(numberResult[i][length_per_num * 4 + j])); + } + + chCode = new char[20]; + sprintf_s(chCode, percent_price.length(), "%.3lf", stod(percent_price)); + std::string percent_price_str(chCode); + + percent_price = percent_price_str; + + + //成交数量 + string success_num = ""; + for (int j = 0; j < length_per_num; j++) + { + success_num.append(to_string(numberResult[i][length_per_num * 5 + j])); + } + success_num = to_string(stoi(success_num)); + + + //买入卖出 + int start = i * 4 * ele_count_per_line + 6 * 4; + int startx = splitResult[start]; + int starty = splitResult[start + 1]; + int endx = splitResult[start + 2]; + int endy = splitResult[start + 3]; + + int count = 0; + for (int r = starty; r <= endy; r++) { + for (int c = startx; c <= endx; c++) { + uchar v = grayImg.ptr<uchar>(r)[c]; + if (v >= _IMG_BINARY_THRESHOLD) { + count++; + } + } + } + if (count > 50) { + //卖出 + delegateData.type = TRADE_TYPE_SELL; + } + else { + //买入 + delegateData.type = TRADE_TYPE_BUY; + } + + + delegateData.index = i; + delegateData.code = code; + delegateData.time = time; + delegateData.num = num; + delegateData.price = delegate_price; + delegateData.trade_price = percent_price; + delegateData.trade_num = success_num; + + + dataList.push_back(delegateData); + free(numberResult[i]); + } + + free(totalNumberData); + free(numberResult); + free(rowIndex); + free(splitResult); + free(zeroData); + free(templateNums); + free(grayImg.data); + grayImg.release(); + + return dataList; } @@ -744,6 +792,298 @@ return codes; } +list<TradeDelegateData> TradeListCapture::captureSimpleTradeDelegateInfo(cv::Mat img) +{ + cv::Mat grayImg = grayImgs(img, openCLExcuterDelegate); + + list<TradeDelegateData> dataList; + //分隔元素 + int empty_start = -1; + int empty_end = -1; + int data_start = -1; + int data_end = -1; + list<int*> rowData; + for (int r = 0; r < grayImg.rows; r++) { + if (ImgDivider::isRowEmpty(grayImg, r, 0, 100)) { + + if (empty_start < 0) { + empty_start = r; + empty_end = r; + } + else { + empty_end = r; + } + if (data_start > -1 && data_end > -1 && data_end - data_start > 5) { + printf("%d-%d\n", data_start, data_end); + int* d = (int*)malloc(sizeof(int) * 2); + d[0] = data_start; + d[1] = data_end; + rowData.push_back(d); + data_start = -1; + data_end = -1; + } + } + else { + empty_start = -1; + empty_end = -1; + + if (data_start < 0) { + data_start = r; + data_end = r; + } + else { + data_end = r; + } + } + } + if (rowData.size() < 2) + { + free(grayImg.data); + grayImg.release(); + for (list<int*>::iterator ele = rowData.begin(); ele != rowData.end(); ele++) { + free(*ele); + } + return dataList; + } + + //去头去尾 + list<int*>::iterator start = rowData.begin(); + list<int*>::iterator end = rowData.end(); + int start_end = (*start)[1]; + free(*start); + + rowData.erase(start); + if (rowData.size() == 1) + { + std::advance(end, -1); + if ((*end)[0] - start_end > 30) + { + free(*end); + rowData.erase(end); + } + } + else { + std::advance(end, -1); + free(*end); + rowData.erase(end); + } + + int* rowIndex = (int*)malloc(sizeof(int) * rowData.size() * 4); + + int index = 0; + for (list<int*>::iterator ele = rowData.begin(); ele != rowData.end(); ele++) { + rowIndex[index * 4 + 0] = 0; + rowIndex[index * 4 + 1] = (*ele)[0]; + rowIndex[index * 4 + 2] = grayImg.cols - 1; + rowIndex[index * 4 + 3] = (*ele)[1]; + free(*ele); + index++; + } + + + int ele_count_per_line = 8; + int length_per_num = 9; + + + int* splitResult = (int*)malloc(sizeof(int) * 4 * ele_count_per_line * rowData.size()); + + openCLExcuterDelegate->splitPlateContentRowData(grayImg.data, grayImg.cols, grayImg.rows, rowIndex, rowData.size(), ele_count_per_line, 0, 7, splitResult); + + if (false) { + //保存分隔结果 + for (int i = 0; i < rowData.size(); i++) { + int start = i * ele_count_per_line * 4; + for (int j = 0; j < ele_count_per_line; j++) + { + + int startx = splitResult[start]; + int starty = splitResult[start + 1]; + int endx = splitResult[start + 2]; + int endy = splitResult[start + 3]; + start += 4; + string path = "C:\\Users\\Administrator\\Desktop\\ocr\\trade\\"; + path.append(to_string(i)).append("_").append(to_string(j)).append(".jpg"); + cv::imwrite(path, cv::Mat(grayImg, cv::Rect(startx, starty, endx - startx + 1, endy - starty + 1))); + } + } + } + + + //分割数字 + unsigned char* zeroData = (unsigned char*)malloc(sizeof(unsigned char) * _NUMBER_L2_WIDTH * _NUMBER_L2_HEIGHT); + for (int r = 0; r < _NUMBER_L2_HEIGHT; r++) { + for (int c = 0; c < _NUMBER_L2_WIDTH; c++) + { + zeroData[r * _NUMBER_L2_WIDTH + c] = ImgUtil::NUMS_LEVEL2[0].data.ptr<uchar>(r)[c]; + } + } + + int line_number_count = ele_count_per_line * length_per_num; + + unsigned char* totalNumberData = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_L2_HEIGHT * rowData.size()) * _NUMBER_L2_WIDTH * 10 * line_number_count); + + UcharDataInfo typesData = UcharDataInfo(); + //委托时间,证券代码,申报时间,委托数量,委托价格,成交均价,成交数量,操作 + unsigned char types[] = { NUM_TYPE_TIME,NUM_TYPE_CODE,NUM_TYPE_NUM,NUM_TYPE_CODE,NUM_TYPE_PRICE,NUM_TYPE_PRICE,NUM_TYPE_CODE, NUM_TYPE_CODE }; + typesData.length = ele_count_per_line; + typesData.data = types; + + openCLExcuterDelegate->splitL2NumNew(grayImg, IntDataInfo({ splitResult,(int)(ele_count_per_line * rowData.size()) }), UcharDataInfo({ totalNumberData, -1 }), typesData, zeroData, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, ele_count_per_line, length_per_num); + + + + + + //识别数字 + uchar* templateNums = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_L2_HEIGHT * rowData.size()) * _NUMBER_L2_WIDTH * 10 * line_number_count); + openCLExcuterDelegate->createNumberTemplates(rowData.size(), _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, line_number_count, ImgUtil::numsOneLevel_level2, templateNums); + uchar** numberResult = openCLExcuterDelegate->recognition_numbers(totalNumberData, templateNums, rowData.size() * _NUMBER_L2_HEIGHT, _NUMBER_L2_WIDTH * 10 * line_number_count, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, line_number_count); + + for (int i = 0; i < rowData.size(); i++) { + TradeDelegateData delegateData = TradeDelegateData(); + //时间 + string time = ""; + for (int j = length_per_num - 6; j < length_per_num; j++) + { + if (j - (length_per_num - 6) == 2 || j - (length_per_num - 6) == 4) + time.append(":"); + time.append(to_string(numberResult[i][length_per_num * 0 + j])); + } + + //代码 + string code = ""; + for (int j = length_per_num - 6; j < length_per_num; j++) + { + code.append(to_string(numberResult[i][length_per_num * 1 + j])); + } + + // 申报时间 + string apply_time = ""; + for (int j = length_per_num - 9; j < length_per_num; j++) + { + apply_time.append(to_string(numberResult[i][length_per_num * 2 + j])); + } + + + //委托数量 + string num = ""; + for (int j = 0; j < length_per_num; j++) + { + num.append(to_string(numberResult[i][length_per_num * 3 + j])); + } + num = to_string(stoi(num)); + + + //委托价格 + string delegate_price = ""; + for (int j = 0; j < length_per_num; j++) + { + if (length_per_num - j == 3) + delegate_price.append("."); + delegate_price.append(to_string(numberResult[i][length_per_num * 4 + j])); + } + delegate_price = to_string(stod(delegate_price)); + char* chCode; + chCode = new char[20]; + sprintf_s(chCode, delegate_price.length(), "%.3lf", stod(delegate_price)); + std::string delegate_price_str(chCode); + + delegate_price = delegate_price_str; + + + //成交均价 + string percent_price = ""; + for (int j = 0; j < length_per_num; j++) + { + if (length_per_num - j == 3) + percent_price.append("."); + percent_price.append(to_string(numberResult[i][length_per_num * 5 + j])); + } + + chCode = new char[20]; + sprintf_s(chCode, percent_price.length(), "%.3lf", stod(percent_price)); + std::string percent_price_str(chCode); + + percent_price = percent_price_str; + + + //成交数量 + string success_num = ""; + for (int j = 0; j < length_per_num; j++) + { + success_num.append(to_string(numberResult[i][length_per_num * 6 + j])); + } + success_num = to_string(stoi(success_num)); + + + //买入卖出 + int start = i * 4 * ele_count_per_line + 7 * 4; + int startx = splitResult[start]; + int starty = splitResult[start + 1]; + int endx = splitResult[start + 2]; + int endy = splitResult[start + 3]; + + int count = 0; + for (int r = starty; r <= endy; r++) { + for (int c = startx; c <= endx; c++) { + uchar v = grayImg.ptr<uchar>(r)[c]; + if (v >= _IMG_BINARY_THRESHOLD) { + count++; + } + } + } + if (count > 50) { + //卖出 + delegateData.type = TRADE_TYPE_SELL; + } + else { + //买入 + delegateData.type = TRADE_TYPE_BUY; + } + + + delegateData.index = i; + delegateData.code = code; + delegateData.time = time; + delegateData.apply_time = apply_time; + delegateData.num = num; + delegateData.price = delegate_price; + delegateData.trade_price = percent_price; + delegateData.trade_num = success_num; + + + dataList.push_back(delegateData); + free(numberResult[i]); + } + + free(totalNumberData); + free(numberResult); + free(rowIndex); + free(splitResult); + free(zeroData); + free(templateNums); + free(grayImg.data); + grayImg.release(); + + return dataList; +} + +list<TradeDelegateData> TradeListCapture::captureSimpleTradeDelegateInfo() +{ + + HWND win = THSActionUtil::getTradeSimpleDelegateWindow(); + //刷新数据,按F5刷新 + Win32Util::virtualKeyboard(win, VK_F5); + + cv::Mat oimg = CaptureUtil::capture(trade_simple_delegate_win); + if (oimg.cols < 10 || oimg.rows < 10) { + throw string("截图出错"); + } + + list<TradeDelegateData> codes = captureSimpleTradeDelegateInfo(oimg); + return codes; +} + string TradeListCapture::getAvaiableMoney() { HWND hwnd = THSActionUtil::getTradeDelegateWindow(); @@ -753,7 +1093,7 @@ HWND temp = FindWindowEx(hwnd, NULL, TEXT("#32770"), NULL); HWND avaiableMoneyHWND = 0; - for (int i = 0;i < 20;i++) { + for (int i = 0; i < 20; i++) { if (IsWindowVisible(temp)) { HWND tempW = FindWindowEx(temp, NULL, TEXT("Static"), TEXT("可用")); if (tempW > 0) { @@ -772,6 +1112,34 @@ return text; } +string TradeListCapture::getSimpleAvaiableMoney() +{ + HWND hwnd = THSActionUtil::getTradeSimpleDelegateWindow(); + if (hwnd <= 0) { + throw string("委托窗口未打开"); + } + HWND win = FindWindowExA(hwnd, NULL, "AfxMDIFrame140s", NULL); + HWND child = NULL; + HWND avaiableMoneyHWND = 0; + for (int i = 0; i < 5; i++) { + child = FindWindowExA(win, child, "#32770", NULL); + if (child > 0 && Win32Util::isWindowShow(child)) { + HWND table = FindWindowExA(child, NULL, NULL, "HexinScrollWnd"); + if (table > 0) { + child = FindWindowExA(child, NULL, "#32770", NULL); + avaiableMoneyHWND = GetDlgItem(child, 0x000003F8); + break; + } + } + } + if (avaiableMoneyHWND <= 0) { + throw string("未查找到可用余额控件"); + } + + string text = Win32Util::getWindowName(avaiableMoneyHWND); + return text; +} + bool TradeListCapture::isInited() { return inited; } -- Gitblit v1.8.0