| | |
| | | #include "L2TradeQueueUtil.h" |
| | | |
| | | list<ImgArea> L2TradeQueueUtil::splitElements(cv::Mat img) |
| | | #include "Win32Util.h" |
| | | |
| | | list<ImgArea> L2TradeQueueUtil::splitViewElements(cv::Mat img) |
| | | { |
| | | |
| | | list<int*> rowDataList = splitRows(img); |
| | |
| | | freeData(dataList); |
| | | free(rowData); |
| | | |
| | | if (false) { |
| | | if (FALSE) { |
| | | //保存 |
| | | int index = -1; |
| | | for (list<ImgArea>::iterator ele = posList.begin(); ele != posList.end(); ++ele) { |
| | |
| | | return posList; |
| | | } |
| | | |
| | | list<ImgArea> L2TradeQueueUtil::splitBuyQueue(cv::Mat img,int identify) |
| | | { |
| | | if (FALSE) |
| | | { |
| | | cv::imwrite(string("C:\\Users\\Administrator\\Desktop\\ocr\\trade_queue\\demo\\").append(to_string(identify)).append("_").append(to_string(rand())).append(".png"), img); |
| | | } |
| | | list<ImgArea> resultList; |
| | | //cv::Mat binary; |
| | | //二值化,方便处理 |
| | | //threshold(img, binary, _IMG_BINARY_THRESHOLD, 255, cv::THRESH_BINARY); |
| | | |
| | | |
| | | //分隔第一行 |
| | | int rows = img.rows; |
| | | int startCol = 0; |
| | | int endCol = img.cols - 1; |
| | | list<int*> rowDataList; |
| | | int full_start = -1; |
| | | int full_end = -1; |
| | | for (int r = 1; r < rows; r++) { |
| | | if (ImgDivider::isRowFull(img, r, startCol, endCol, 1,49,51)) { |
| | | if (full_start < 0) { |
| | | full_start = r; |
| | | } |
| | | if (r - full_start > 10) { |
| | | int* pos = (int*)malloc(sizeof(int) * 2); |
| | | pos[0] = full_start + 1; |
| | | pos[1] = r - 1; |
| | | rowDataList.push_back(pos); |
| | | full_start = r; |
| | | } |
| | | else { |
| | | full_start = r; |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (rowDataList.size() < 1) { |
| | | throw string("无数据"); |
| | | } |
| | | endCol = img.cols - 1; |
| | | int index = 0; |
| | | for (list<int*>::iterator ele = rowDataList.begin(); ele != rowDataList.end(); ++ele) { |
| | | int* pos = *ele; |
| | | int startRow = pos[0]; |
| | | int endRow = pos[1]; |
| | | free(pos); |
| | | //去除上下空白,右侧留白10 |
| | | for (int i = startRow; i <= endRow; i++) { |
| | | if (!ImgDivider::isRowEmpty(img, i, startCol, endCol,1, _IMG_BINARY_THRESHOLD)) { |
| | | startRow = i; |
| | | break; |
| | | } |
| | | } |
| | | for (int i = endRow; i >= startRow; i--) { |
| | | if (!ImgDivider::isRowEmpty(img, i, startCol, endCol,1, _IMG_BINARY_THRESHOLD)) { |
| | | endRow = i; |
| | | break; |
| | | } |
| | | } |
| | | |
| | | //if (identify == 4|| identify ==6) { |
| | | // printf("进入调试"); |
| | | //} |
| | | |
| | | if (endRow - startRow > 5) |
| | | { |
| | | |
| | | list<int*> elements = splitCols(img, startCol, startRow, endCol - 1, endRow, 3); |
| | | |
| | | for (list<int*>::iterator e = elements.begin(); e != elements.end(); ++e) { |
| | | int* ps = *e; |
| | | ImgArea area; |
| | | area.startx = ps[0]; |
| | | area.starty = ps[1]; |
| | | area.endx = ps[2]; |
| | | area.endy = ps[3]; |
| | | resultList.push_back(area); |
| | | free(ps); |
| | | if (FALSE) |
| | | { |
| | | cv::Mat sm = cv::Mat(img, cv::Rect(area.startx, area.starty, area.endx - area.startx + 1, area.endy - area.starty + 1)); |
| | | cv::imwrite(string("C:\\Users\\Administrator\\Desktop\\ocr\\trade_queue\\").append(to_string(index)).append(".png"), sm); |
| | | } |
| | | index++; |
| | | } |
| | | } |
| | | } |
| | | return resultList; |
| | | } |
| | | |
| | | HWND L2TradeQueueUtil::getTradeQueueBuyHWND(HWND tradeQueueHWND) |
| | | { |
| | | //暂时放在这儿 |
| | | HWND temp = NULL; |
| | | while (TRUE) |
| | | { |
| | | temp = FindWindowExA(tradeQueueHWND, temp, "#32770", "买卖队列"); |
| | | if (Win32Util::isWindowShow(temp) || temp <= 0) { |
| | | break; |
| | | } |
| | | } |
| | | if (temp <= 0) { |
| | | throw string("未找到买卖队列句柄"); |
| | | } |
| | | |
| | | HWND childTemp = NULL; |
| | | |
| | | |
| | | HWND rightHWND=NULL; |
| | | int rightPOS=-1; |
| | | |
| | | while (TRUE) |
| | | { |
| | | childTemp = FindWindowExA(temp, childTemp, "#32770", NULL); |
| | | if (childTemp <= 0) { |
| | | break; |
| | | } |
| | | else { |
| | | if (Win32Util::isWindowShow(childTemp)) { |
| | | //获取最右侧的内容框句柄 |
| | | RECT rect; |
| | | Win32Util::getWindowRect(childTemp, &rect); |
| | | if (rightPOS == -1) { |
| | | rightHWND = childTemp; |
| | | rightPOS = rect.right; |
| | | } |
| | | else if (rect.right > rightPOS) { |
| | | rightHWND = childTemp; |
| | | rightPOS = rect.right; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (rightHWND <= 0) { |
| | | throw string("买入成交队列句柄查找失败"); |
| | | } |
| | | rightHWND = FindWindowExA(rightHWND, NULL, "SysListView32", NULL); |
| | | if (rightHWND <= 0) { |
| | | throw string("买入成交队列句柄查找失败"); |
| | | } |
| | | return rightHWND; |
| | | } |
| | | |
| | | void L2TradeQueueUtil::filterTradeQueueBuyMat(cv::Mat& grayImg) |
| | | { |
| | | list<ImgArea> areas; |
| | | int startR = -1; |
| | | for (int r = 0; r < grayImg.rows; r++) { |
| | | int startc = -1; |
| | | int endc = -1; |
| | | bool empty = TRUE; |
| | | for (int c = 0; c < grayImg.cols; c++) { |
| | | uchar data = grayImg.ptr<uchar>(r)[c]; |
| | | if (data >= 178 && data <= 180) { |
| | | empty = FALSE; |
| | | if (startc < 0) { |
| | | startc = c; |
| | | endc = c; |
| | | } |
| | | endc = c; |
| | | } |
| | | else { |
| | | if (startc > 0 && endc - startc > 10 && startR < 0) { |
| | | ImgArea area; |
| | | area.startx = startc; |
| | | area.endx = endc; |
| | | area.starty = r; |
| | | area.endy = -1; |
| | | areas.push_back(area); |
| | | startc = -1; |
| | | endc = -1; |
| | | } |
| | | } |
| | | } |
| | | if (areas.size() > 0 && startR < 0) { |
| | | startR = r; |
| | | } |
| | | |
| | | if (!empty && areas.size() > 0) { |
| | | continue; |
| | | } |
| | | |
| | | if (startR > 0 && empty) { |
| | | printf("起始行%d, 结束行:%d 数据条数:%d\n", startR, r, areas.size()); |
| | | for (list<ImgArea>::iterator ele = areas.begin(); ele != areas.end(); ++ele) { |
| | | ImgArea area = *ele; |
| | | area.endy = r - 1; |
| | | printf("%d,%d,%d,%d\n", area.startx, area.starty, area.endx, area.endy); |
| | | for (int r = area.starty; r <= area.endy; r++) { |
| | | for (int c = area.startx; c <= area.endx; c++) { |
| | | uchar data = grayImg.ptr<uchar>(r)[c]; |
| | | if (data >= _IMG_BINARY_THRESHOLD) { |
| | | grayImg.ptr<uchar>(r)[c] = 0; |
| | | } |
| | | else { |
| | | grayImg.ptr<uchar>(r)[c] = 255; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | printf("------------------------\n"); |
| | | |
| | | startR = -1; |
| | | areas.clear(); |
| | | } |
| | | } |
| | | } |
| | | list<int*> L2TradeQueueUtil::splitRows(cv::Mat img) |
| | | { |
| | | list<int*> rowDataList; |
| | |
| | | return rowDataList; |
| | | } |
| | | |
| | | list<int*> L2TradeQueueUtil::splitCols(cv::Mat img, int startx, int starty, int endx, int endy) |
| | | list<int*> L2TradeQueueUtil::splitCols(cv::Mat img, int startx, int starty, int endx, int endy, int minContentWidth) |
| | | { |
| | | cv::imwrite("C:\\Users\\Administrator\\Desktop\\ocr\\l2_trade\\test.png", cv::Mat(img, cv::Rect(startx, starty, endx - startx, endy - starty))); |
| | | |
| | | if (FALSE) |
| | | { |
| | | cv::imwrite("C:\\Users\\Administrator\\Desktop\\ocr\\l2_trade\\test.png", cv::Mat(img, cv::Rect(startx, starty, endx - startx + 1, endy - starty + 1))); |
| | | } |
| | | list<int*> splitList; |
| | | int empty_start = -1; |
| | | int empty_end = -1; |
| | | int start_col = -1; |
| | | int end_col = -1; |
| | | for (int c = startx; c <= endx; c++) { |
| | | if (ImgDivider::isColEmpty(img, c, starty, endy)) { |
| | | if (ImgDivider::isColEmpty(img, c, starty, endy,_IMG_BINARY_THRESHOLD)) { |
| | | if (empty_start < 0) { |
| | | empty_start = c; |
| | | } |
| | | empty_end = c; |
| | | if (empty_end - empty_start > 10) { |
| | | if (end_col - start_col >= 6) { |
| | | if (end_col - start_col >= minContentWidth) { |
| | | int* itemData = (int*)malloc(sizeof(int) * 4); |
| | | itemData[0] = start_col; |
| | | itemData[1] = starty; |
| | |
| | | empty_end = -1; |
| | | } |
| | | } |
| | | if (end_col - start_col >= minContentWidth) { |
| | | int* itemData = (int*)malloc(sizeof(int) * 4); |
| | | itemData[0] = start_col; |
| | | itemData[1] = starty; |
| | | itemData[2] = empty_start - 1; |
| | | itemData[3] = endy; |
| | | splitList.push_back(itemData); |
| | | start_col = -1; |
| | | end_col = -1; |
| | | } |
| | | |
| | | return splitList; |
| | | } |