#include "L2TradeQueueUtil.h"
|
|
list<ImgArea> L2TradeQueueUtil::splitElements(cv::Mat img)
|
{
|
|
list<int*> rowDataList = splitRows(img);
|
if (rowDataList.size() != 2) {
|
for (list<int*>::iterator ele = rowDataList.begin(); ele != rowDataList.end(); ++ele) {
|
free(*ele);
|
}
|
throw string("·Ö¸ôÐгö´í");
|
}
|
|
list<ImgArea> posList;
|
|
//·Ö¸ô³öίÂô¶ÓÁÐʱ¼ä£¬Î¯Âôµ¥¼Û£¬Î¯ÂôÊÖÊý£¬Î¯Âò¶ÓÁÐʱ¼ä£¬Î¯Âòµ¥¼Û£¬Î¯ÂòÊÖÊý
|
int* rowData = *(rowDataList.begin());
|
//ίÂô¶ÓÁÐʱ¼ä
|
list<int*> dataList = splitCols(img, 0, rowData[0], img.cols / 2, rowData[1]);
|
if (dataList.size() > 1)
|
{
|
list<int*>::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<int*>::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<int*>::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<int*>::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<ImgArea>::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<int*> L2TradeQueueUtil::splitRows(cv::Mat img)
|
{
|
list<int*> 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<int*> 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<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 (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<int*> dataList)
|
{
|
if (dataList.size()>0) {
|
|
for (list<int*>::iterator ele = dataList.begin(); ele != dataList.end(); ele++) {
|
free(*ele);
|
}
|
|
}
|
|
}
|