| | |
| | | #include <set> |
| | | #include "Win32Util.h" |
| | | #include "TaskChecker.h" |
| | | #include "GPUtil.h" |
| | | bool LimitUpCapture::tradeTimeCapture; |
| | | OpenCLExcuter* LimitUpCapture::openCLExcuter; |
| | | bool LimitUpCapture::inited; |
| | | //是否正在执行 |
| | |
| | | while (true) { |
| | | if (kill) |
| | | break; |
| | | if (tradeTimeCapture) { |
| | | if (!GPUtil::isTradeTime()) { |
| | | Sleep(100); |
| | | continue; |
| | | } |
| | | } |
| | | TaskChecker::clientLiveTime.limitUp = clock(); |
| | | if (running && inited) { |
| | | clock_t start = clock(); |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | bool LimitUpCapture::pause; |
| | | |
| | | void LimitUpCapture::init(CallbackFun_Limit_Up callback, void* contex) { |
| | | data_callback = callback; |
| | |
| | | thread rt(&(LimitUpCapture::_run)); |
| | | rt.detach(); |
| | | inited = true; |
| | | try { |
| | | refreshHWND(); |
| | | } |
| | | catch (...) { |
| | | |
| | | } |
| | | } |
| | | void LimitUpCapture::reCreateRunning() |
| | | { |
| | |
| | | HWND hwnd = getWindow(); |
| | | if (hwnd <= 0) |
| | | throw string("同花顺副屏2未打开"); |
| | | //输入快捷键51定位到我的版块 |
| | | Win32Util::focus(hwnd); |
| | | Win32Util::keyboardNum("51", 200); |
| | | Win32Util::keyboard(VK_RETURN, 1000); |
| | | Sleep(500); |
| | | |
| | | |
| | | HWND content = FindWindowExA(hwnd, NULL, "AfxFrameOrView100s", NULL); |
| | | |
| | |
| | | list<int*> rowData = THSActionUtil::splitPlateRowArea(grayImg); |
| | | |
| | | //每行的元素个数 |
| | | int ele_count_per_line = 4; |
| | | int* splitResult = (int*)malloc(sizeof(int) * 4 * 4 * rowData.size()); |
| | | int ele_count_per_line = 5; |
| | | int num_length_per_ele = 6; |
| | | int* splitResult = (int*)malloc(sizeof(int) * 4 * ele_count_per_line * rowData.size()); |
| | | int* rowIndex = (int*)malloc(sizeof(int) * 4 * rowData.size()); |
| | | int count = 0; |
| | | for (std::list<int*>::iterator ele = rowData.begin();ele != rowData.end();ele++) { |
| | | string path = "C:\\Users\\Administrator\\Desktop\\ocr\\limit_up\\"; |
| | | path.append(to_string(count)).append(".jpg"); |
| | | //cv::imwrite(path, cv::Mat(grayImg, cv::Rect((*ele)[0], (*ele)[1], (*ele)[2] - (*ele)[0] + 1, (*ele)[3] - (*ele)[1] + 1))); |
| | | |
| | | rowIndex[4 * count + 0] = (*ele)[0]; |
| | | rowIndex[4 * count + 1] = (*ele)[1]; |
| | | rowIndex[4 * count + 2] = (*ele)[2]; |
| | |
| | | count++; |
| | | } |
| | | |
| | | int line_number_count = 4 * 6; |
| | | int line_number_count = ele_count_per_line * num_length_per_ele; |
| | | |
| | | openCLExcuter->splitPlateContentRowData(grayImg.data, grayImg.cols, grayImg.rows, rowIndex, rowData.size(), ele_count_per_line,1,4,splitResult); |
| | | openCLExcuter->splitPlateContentRowData(grayImg.data, grayImg.cols, grayImg.rows, rowIndex, rowData.size(), ele_count_per_line,1,5,splitResult); |
| | | |
| | | /* |
| | | *测试 |
| | | |
| | | //测试 |
| | | set<int> excudeIndexs; |
| | | for (int i = 0;i < rowData.size();i++) { |
| | | for (int j = 0;j < line_number_count;j++) { |
| | | int sx = splitResult[(line_number_count * i + j) * 4 + 0]; |
| | | int sy = splitResult[(line_number_count * i + j) * 4 + 1]; |
| | | int ex = splitResult[(line_number_count * i + j) * 4 + 2]; |
| | | int ey = splitResult[(line_number_count * i + j) * 4 + 3]; |
| | | for (int j = 0;j < ele_count_per_line;j++) { |
| | | int sx = splitResult[(ele_count_per_line * i + j) * 4 + 0]; |
| | | int sy = splitResult[(ele_count_per_line * i + j) * 4 + 1]; |
| | | int ex = splitResult[(ele_count_per_line * i + j) * 4 + 2]; |
| | | int ey = splitResult[(ele_count_per_line * i + j) * 4 + 3]; |
| | | string path = "C:\\Users\\Administrator\\Desktop\\ocr\\limit_up\\"; |
| | | path.append(to_string(i)).append("_").append(to_string(j)).append(".jpg"); |
| | | //cv::imwrite(path, cv::Mat(grayImg, cv::Rect(sx, sy, ex - sx + 1, ey - sy + 1))); |
| | | } |
| | | int sx = splitResult[(ele_count_per_line * i + 0) * 4 + 0]; |
| | | int ex = splitResult[(ele_count_per_line * i + 0) * 4 + 2]; |
| | | if (ex - sx < 40) { |
| | | //噪点数据 |
| | | excudeIndexs.insert(i); |
| | | } |
| | | */ |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | |
| | | } |
| | | } |
| | | unsigned char* totalNumberData = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_GP_CODE_HEIGHT * rowData.size()) * _NUMBER_GP_CODE_WIDTH * 10 * line_number_count); |
| | | openCLExcuter->splitPlateNum(grayImg.data, grayImg.cols, grayImg.rows, splitResult, 4 * rowData.size(), zeroData, _NUMBER_GP_CODE_WIDTH, _NUMBER_GP_CODE_HEIGHT, line_number_count, totalNumberData); |
| | | unsigned char types[] = { NUM_TYPE_MONEY,NUM_TYPE_CODE,NUM_TYPE_TIME, NUM_TYPE_PRICE,NUM_TYPE_PERCENT}; |
| | | UcharDataInfo typesData = UcharDataInfo(); |
| | | typesData.length = 5; |
| | | typesData.data = types; |
| | | |
| | | |
| | | |
| | | openCLExcuter->splitPlateNum(grayImg, IntDataInfo({ splitResult,(int)(ele_count_per_line * rowData.size()) }), UcharDataInfo({ totalNumberData, -1 }), typesData, zeroData, _NUMBER_GP_CODE_WIDTH, _NUMBER_GP_CODE_HEIGHT, ele_count_per_line, num_length_per_ele); |
| | | |
| | | //识别数字 |
| | | uchar* templateNums = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_GP_CODE_HEIGHT * rowData.size()) * _NUMBER_GP_CODE_WIDTH * 10 * line_number_count); |
| | |
| | | |
| | | list<LimitUpData> dataList; |
| | | for (int i = 0;i < rowData.size();i++) { |
| | | if (excudeIndexs.count(i) > 0) { |
| | | continue; |
| | | } |
| | | LimitUpData limitUpData = LimitUpData(); |
| | | string code = ""; |
| | | for (int j = 0;j < 6;j++) |
| | | { |
| | | code.append(to_string(numberResult[i][j])); |
| | | } |
| | | string time = ""; |
| | | for (int j = 0;j < 6;j++) |
| | | { |
| | | if (j == 2 || j == 4) { |
| | | time.append(":"); |
| | | } |
| | | time.append(to_string(numberResult[i][6 + j])); |
| | | } |
| | | |
| | | string price = ""; |
| | | for (int j = 0;j < 6;j++) |
| | | { |
| | | if (j == 4) { |
| | | price.append("."); |
| | | } |
| | | price.append(to_string(numberResult[i][6 * 2 + j])); |
| | | } |
| | | |
| | | string money = ""; |
| | | for (int j = 0;j < 6;j++) |
| | | for (int j = 0;j < num_length_per_ele;j++) |
| | | { |
| | | if (j == 4) { |
| | | money.append("."); |
| | | } |
| | | money.append(to_string(numberResult[i][6 * 3 + j])); |
| | | money.append(to_string(numberResult[i][num_length_per_ele*0 + j])); |
| | | } |
| | | |
| | | |
| | | string code = ""; |
| | | for (int j = 0;j < num_length_per_ele;j++) |
| | | { |
| | | code.append(to_string(numberResult[i][num_length_per_ele * 1+j])); |
| | | } |
| | | string time = ""; |
| | | for (int j = 0;j < num_length_per_ele;j++) |
| | | { |
| | | if (j == 2 || j == 4) { |
| | | time.append(":"); |
| | | } |
| | | time.append(to_string(numberResult[i][num_length_per_ele*2 + j])); |
| | | } |
| | | |
| | | string price = ""; |
| | | for (int j = 0;j < num_length_per_ele;j++) |
| | | { |
| | | if (j == 4) { |
| | | price.append("."); |
| | | } |
| | | price.append(to_string(numberResult[i][num_length_per_ele * 3 + j])); |
| | | } |
| | | |
| | | |
| | | |
| | | string percent = ""; |
| | | for (int j = 0;j < num_length_per_ele;j++) |
| | | { |
| | | if (j == 4) { |
| | | percent.append("."); |
| | | } |
| | | percent.append(to_string(numberResult[i][num_length_per_ele * 4 + j])); |
| | | } |
| | | if (percent == "0000.00") { |
| | | int sx = splitResult[(ele_count_per_line * i + 4) * 4 + 0]; |
| | | int sy = splitResult[(ele_count_per_line * i + 4) * 4 + 1]; |
| | | int ex = splitResult[(ele_count_per_line * i + 4) * 4 + 2]; |
| | | int ey = splitResult[(ele_count_per_line * i + 4) * 4 + 3]; |
| | | string path = "C:\\Users\\Administrator\\Desktop\\ocr\\limit_up\\"; |
| | | path.append(to_string(i)).append("_").append(".jpg"); |
| | | cv::imwrite(path, cv::Mat(grayImg, cv::Rect(sx, sy, ex - sx + 1, ey - sy + 1))); |
| | | } |
| | | |
| | | limitUpData.index = i; |
| | | limitUpData.code = code; |
| | | limitUpData.time = time; |
| | | limitUpData.price = price; |
| | | limitUpData.limitUpPercent = percent; |
| | | limitUpData.limitMoney = money; |
| | | if (limitUpData.time != "00:00:00" && limitUpData.price != "0000.00" && limitUpData.limitMoney != "0000.00") { |
| | | if (limitUpData.code != "000000" && limitUpData.limitUpPercent != "0000.00") { |
| | | dataList.push_back(limitUpData); |
| | | } |
| | | free(numberResult[i]); |
| | | } |
| | | free(numberResult); |
| | | |
| | | if (dataList.size() > 0) |
| | | { |
| | | int* unitData = (int*)malloc(sizeof(int) * 4 * dataList.size()); |
| | | |
| | | |
| | | |
| | | //识别金额单位 |
| | | int index = 0; |
| | | for (list<LimitUpData>::iterator ele = dataList.begin();ele != dataList.end();ele++) { |
| | | unitData[index * 4 + 0] = splitResult[(*ele).index * 4 * 4 + 4 * 3 + 0]; |
| | | unitData[index * 4 + 1] = splitResult[(*ele).index * 4 * 4 + 4 * 3 + 1]; |
| | | unitData[index * 4 + 2] = splitResult[(*ele).index * 4 * 4 + 4 * 3 + 2]; |
| | | unitData[index * 4 + 3] = splitResult[(*ele).index * 4 * 4 + 4 * 3 + 3]; |
| | | unitData[index * 4 + 0] = splitResult[(*ele).index * 4 * ele_count_per_line + 4 * 0 + 0]; |
| | | unitData[index * 4 + 1] = splitResult[(*ele).index * 4 * ele_count_per_line + 4 * 0 + 1]; |
| | | unitData[index * 4 + 2] = splitResult[(*ele).index * 4 * ele_count_per_line + 4 * 0 + 2]; |
| | | unitData[index * 4 + 3] = splitResult[(*ele).index * 4 * ele_count_per_line + 4 * 0 + 3]; |
| | | index++; |
| | | } |
| | | int* unitResult = (int*)malloc(sizeof(int) * dataList.size()); |
| | |
| | | } |
| | | index++; |
| | | } |
| | | free(unitData); |
| | | free(unitResult); |
| | | } |
| | | free(rowIndex); |
| | | free(splitResult); |
| | | free(zeroData); |
| | | free(templateNums); |
| | | free(unitData); |
| | | free(unitResult); |
| | | |
| | | free(imgData); |
| | | |
| | | grayImg.release(); |
| | |
| | | if (kill) { |
| | | break; |
| | | } |
| | | //暂停 |
| | | while (pause) { |
| | | cout <<"涨停识别暂停"<< endl; |
| | | Sleep(100); |
| | | } |
| | | int x = (*ele).x;//+ menuRect.left; |
| | | int y = (*ele).y;//+ menuRect.top; |
| | | printf("x:%d y:%d\n", x, y); |
| | | SendMessage(menuWin, WM_LBUTTONDOWN, 0, MAKELONG(x, y)); |
| | | PostMessage(menuWin, WM_LBUTTONDOWN, 0, MAKELONG(x, y)); |
| | | Sleep(10); |
| | | SendMessage(menuWin, WM_LBUTTONUP, 0, MAKELONG(x, y)); |
| | | PostMessage(menuWin, WM_LBUTTONUP, 0, MAKELONG(x, y)); |
| | | //SendMessage(menuWin, WM_SETCURSOR,(int) menuWin, 0x02000001); |
| | | //Win32Util::focus(menuWin); |
| | | //Win32Util::click(x, y); |
| | | Sleep(100); |
| | | Sleep(50); |
| | | |
| | | for (int i = 0;i < 3;i++) |
| | | for (int i = 0;i < 2;i++) |
| | | { |
| | | if (kill) { |
| | | break; |
| | | } |
| | | int x = wrect.right - 50; |
| | | int y = wrect.top + 50; |
| | | SendMessage(win, WM_MOUSEWHEEL, 0, MAKEWORD(x, y)); |
| | | Sleep(100); |
| | | PostMessage(win, WM_MOUSEWHEEL, 0, MAKEWORD(x, y)); |
| | | Sleep(200); |
| | | cv::Mat oimg = CaptureUtil::capture(win); |
| | | list<LimitUpData> codes = captureLimitUpCodes(oimg); |
| | | for (list<LimitUpData>::iterator ele = codes.begin();ele != codes.end();ele++) { |