#include "L2TradeQueueUtil.h" list L2TradeQueueUtil::splitElements(cv::Mat img) { list rowDataList = splitRows(img); if (rowDataList.size() != 2) { for (list::iterator ele = rowDataList.begin(); ele != rowDataList.end(); ++ele) { free(*ele); } throw string("·Ö¸ôÐгö´í"); } list posList; //·Ö¸ô³öίÂô¶ÓÁÐʱ¼ä£¬Î¯Âôµ¥¼Û£¬Î¯ÂôÊÖÊý£¬Î¯Âò¶ÓÁÐʱ¼ä£¬Î¯Âòµ¥¼Û£¬Î¯ÂòÊÖÊý int* rowData = *(rowDataList.begin()); //ίÂô¶ÓÁÐʱ¼ä list dataList = splitCols(img, 0, rowData[0], img.cols / 2, rowData[1]); if (dataList.size() > 1) { list::iterator ele = dataList.begin(); ++ele; posList.push_back({ (*ele)[0],(*ele)[1],(*ele)[2],(*ele)[3] }); } else { posList.push_back({ -1,-1,-1,-1 }); } freeData(dataList); //ίÂò¶ÓÁÐʱ¼ä dataList = splitCols(img, img.cols / 2 + 1, rowData[0], img.cols - 1, rowData[1]); if (dataList.size() > 1) { list::iterator ele = dataList.begin(); ++ele; posList.push_back({ (*ele)[0],(*ele)[1],(*ele)[2],(*ele)[3] }); } else { posList.push_back({ -1,-1,-1,-1 }); } free(rowData); rowData = *(++rowDataList.begin()); //ίÂôµ¥¼Û£¬Î¯ÂôÊÖÊý freeData(dataList); dataList = splitCols(img, 0, rowData[0], img.cols / 2, rowData[1]); if (dataList.size() > 2) { list::iterator ele = dataList.begin(); ++ele; posList.push_back({ (*ele)[0],(*ele)[1],(*ele)[2],(*ele)[3] }); ++ele; posList.push_back({ (*ele)[0],(*ele)[1],(*ele)[2],(*ele)[3] }); } else { posList.push_back({ -1,-1,-1,-1 }); posList.push_back({ -1,-1,-1,-1 }); } freeData(dataList); //ίÂòµ¥¼Û£¬Î¯ÂòÊÖÊý dataList = splitCols(img, img.cols / 2 + 1, rowData[0], img.cols - 1, rowData[1]); if (dataList.size() > 2) { list::iterator ele = dataList.begin(); ++ele; posList.push_back({ (*ele)[0],(*ele)[1],(*ele)[2],(*ele)[3] }); ++ele; posList.push_back({ (*ele)[0],(*ele)[1],(*ele)[2],(*ele)[3] }); } else { posList.push_back({-1,-1,-1,-1}); posList.push_back({-1,-1,-1,-1}); } freeData(dataList); free(rowData); if (false) { //±£´æ int index = -1; for (list::iterator ele = posList.begin(); ele != posList.end(); ++ele) { index++; ImgArea data = *ele; if (data.startx>-1) { //±£´æÊý¾Ý cv::Mat mat = cv::Mat(img, cv::Rect(data.startx, data.starty, data.endx - data.startx + 1, data.endy - data.starty + 1)); string path = "C:\\Users\\Administrator\\Desktop\\ocr\\l2_trade\\"; path.append(to_string(index)).append(".png"); cv::imwrite(path, mat); } } } return posList; } list L2TradeQueueUtil::splitRows(cv::Mat img) { list rowDataList; //ͼÏñ·Ö¸ô //ÏÈ·Ö¸ô int start_row = -1; int end_row = -1; for (int r = 0; r < img.rows; r++) { if (ImgDivider::isRowEmpty(img, r, 1, img.cols/4,1, _IMG_BINARY_THRESHOLD)) { if (end_row - start_row >=10) { //ÓÐÊý¾Ý int* rowRata = (int*)malloc(sizeof(int) * 2); rowRata[0] = start_row; rowRata[1] = end_row; rowDataList.push_back(rowRata); start_row = -1; end_row = -1; if (rowDataList.size() >= 2) { break; } } start_row = r + 1; } else { if (start_row < 0) { start_row = r; } end_row =r; } } return rowDataList; } list L2TradeQueueUtil::splitCols(cv::Mat img, int startx, int starty, int endx, int endy) { cv::imwrite("C:\\Users\\Administrator\\Desktop\\ocr\\l2_trade\\test.png", cv::Mat(img, cv::Rect(startx, starty, endx - startx, endy - starty))); list 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 (empty_start < 0) { empty_start = c; } empty_end = c; if (empty_end - empty_start > 10) { if (end_col - start_col >= 6) { 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; } } } else { if (start_col < 0) { start_col = c; } end_col = c; empty_start = -1; empty_end = -1; } } return splitList; } void L2TradeQueueUtil::freeData(list dataList) { if (dataList.size()>0) { for (list::iterator ele = dataList.begin(); ele != dataList.end(); ele++) { free(*ele); } } }