#include "TradeQueueCapture.h" #include "CaptureUtil.h" TradeQueueCapture::TradeQueueCapture() { openCLExcuter = new OpenCLExcuter(); openCLExcuter->init(); } list TradeQueueCapture::split(cv::Mat img) { int full_row = -1; int content_start = -1; int content_end = -1; list dataItemList; for (int r = 5;r < img.rows;r++) { if (ImgDivider::isRowFull(img, r, 0, img.cols, 2, 45, 55)) { full_row = r; if (content_start >= 0 && content_end >= 0) { //¼ÓÈëÄÚÈÝ //printf("%d-%d\n", content_start, content_end); int* item = (int*)malloc(sizeof(int) * 2); item[0] = content_start; item[1] = content_end; dataItemList.push_back(item); content_start = -1; content_end = -1; } } else { if (full_row > -1) { if (content_start < 0) { content_start = r; content_end = r; } else { content_end = r; } } } } int index = 0; list rowDataList; for (list::iterator ele = dataItemList.begin();ele != dataItemList.end();ele++) { index++; int start_row = (*ele)[0]; int end_row = (*ele)[1]; free(*ele); int empty_start = -1; int empty_end = -1; int content_start = -1; int content_end = -1; for (int c = 0;c < img.cols;c += 1) { if (ImgDivider::isColEmpty(img, c, start_row, end_row, _IMG_BINARY_THRESHOLD)) { if (empty_start < 0) { empty_start = c; empty_end = c; } else { empty_end = c; if (empty_end - empty_start > 5) { if (content_start > -1 && content_end > -1) { //printf("%d-%d\n", content_start, content_end); int* item = (int*)malloc(sizeof(int) * 4); item[0] = content_start; item[1] = start_row; item[2] = content_end; item[3] = end_row; rowDataList.push_back(item); content_start = -1; content_end = -1; } } } } else { if (empty_end - empty_start >= 5) { content_start = c; content_end = c; empty_start = -1; empty_end = -1; } else { if (content_start >= 0) { content_end = c; } empty_start = -1; empty_end = -1; } } } if (content_start > -1 && content_end > -1) { printf("%d-%d\n", content_start, content_end); int* item = (int*)malloc(sizeof(int) * 4); item[0] = content_start; item[1] = start_row; item[2] = content_end; item[3] = end_row; rowDataList.push_back(item); content_start = -1; content_end = -1; } } return rowDataList; } list TradeQueueCapture::recognition(cv::Mat img,list rowDataList) { int c = 0; int* pos = (int*)malloc(sizeof(int) * 4 * rowDataList.size()); for (list::iterator ele = rowDataList.begin();ele != rowDataList.end();ele++) { pos[c * 4 + 0] = (*ele)[0]; pos[c * 4 + 1] = (*ele)[1]; pos[c * 4 + 2] = (*ele)[2]; pos[c * 4 + 3] = (*ele)[3]; /* string path = "C:\\Users\\Administrator\\Desktop\\ocr\\trade_queue\\num_"; path.append(to_string(index)).append("_").append(to_string(c)).append(".jpg"); cv::imwrite(path, cv::Mat(img, cv::Rect((*ele)[0], (*ele)[1], (*ele)[2] - (*ele)[0] + 1, (*ele)[3] - (*ele)[1] + 1))); */ free(*ele); c++; } unsigned char* zeroData = (unsigned char*)malloc(sizeof(unsigned char) * _NUMBER_GP_CODE_WIDTH * _NUMBER_GP_CODE_HEIGHT); for (int r = 0;r < _NUMBER_GP_CODE_HEIGHT;r++) { for (int c = 0;c < _NUMBER_GP_CODE_WIDTH;c++) { zeroData[r * _NUMBER_GP_CODE_WIDTH + c] = ImgUtil::NUMS_GP_CODE[0].data.ptr(r)[c]; } } int length_per_num = 5; unsigned char* totalNumberData = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_GP_CODE_HEIGHT * rowDataList.size()) * _NUMBER_GP_CODE_WIDTH * 10 * length_per_num); openCLExcuter->splitTradeQueueNum(img, IntDataInfo({ pos, (int)(rowDataList.size()) }), zeroData, _NUMBER_GP_CODE_WIDTH, _NUMBER_GP_CODE_HEIGHT, totalNumberData, length_per_num); /* cv::Mat m = cv::Mat::zeros(_NUMBER_GP_CODE_HEIGHT * rowDataList.size(), _NUMBER_GP_CODE_WIDTH * 10 * length_per_num, CV_8UC1); m.data = totalNumberData; cv::Mat binary; threshold(m, binary, 0, 255, cv::THRESH_BINARY); cv::imwrite("C:\\Users\\Administrator\\Desktop\\ocr\\trade_queue\\test.jpg", binary); */ uchar* templateNums = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_GP_CODE_HEIGHT * rowDataList.size()) * _NUMBER_GP_CODE_WIDTH * 10 * length_per_num); openCLExcuter->createNumberTemplates(rowDataList.size(), _NUMBER_GP_CODE_WIDTH, _NUMBER_GP_CODE_HEIGHT, length_per_num, ImgUtil::numsOneLevel_gpcode, templateNums); uchar** numberResult = openCLExcuter->recognition_numbers(totalNumberData, templateNums, rowDataList.size() * _NUMBER_GP_CODE_HEIGHT, _NUMBER_GP_CODE_WIDTH * 10 * length_per_num, _NUMBER_GP_CODE_WIDTH, _NUMBER_GP_CODE_HEIGHT, length_per_num); list numberList; for (int i = 0;i < rowDataList.size();i++) { string st = ""; for (int j = 0;j < length_per_num;j++) { st.append(to_string(numberResult[i][j])); } numberList.push_back(stoi(st)); free(numberResult[i]); //printf("½á¹û:%d\n", stoi(st)); } free(numberResult); free(zeroData); free(templateNums); free(totalNumberData); return numberList; } list TradeQueueCapture::recognition(HWND hwnd) { cv::Mat img = CaptureUtil::capture(hwnd); uchar* data = (uchar*)malloc(sizeof(uchar) * img.cols * img.rows); openCLExcuter->rgba2Gray(img.data, img.cols, img.rows, data); cv::Mat grayImg = cv::Mat::zeros(img.rows, img.cols, CV_8UC1); grayImg.data = data; img.release(); list rowDataList = split(grayImg); return recognition(grayImg,rowDataList); } list TradeQueueCapture::recognition(cv::Mat grayImg) { list rowDataList = split(grayImg); return recognition(grayImg, rowDataList); }