From 125db633619a0b4c7bd1d498ea2bf1cefa4f73d3 Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期四, 09 二月 2023 18:54:13 +0800
Subject: [PATCH] '远程OCR'

---
 ConsoleApplication/THSActionUtil.cpp |  221 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 219 insertions(+), 2 deletions(-)

diff --git a/ConsoleApplication/THSActionUtil.cpp b/ConsoleApplication/THSActionUtil.cpp
index 42ccac6..e6060ae 100644
--- a/ConsoleApplication/THSActionUtil.cpp
+++ b/ConsoleApplication/THSActionUtil.cpp
@@ -56,6 +56,125 @@
 	return	nums;
 }
 
+
+//获取整个L2的代码选择区域
+list<GPCodeArea> splitL2WholeCateArea(cv::Mat img) {
+	int contentStartRow = -1;
+	int contentEndRow = -1;
+	for (int r = 5; r < img.rows; r++) {
+		if (ImgDivider::isRowFull(img, r, 10, 200, 2, 10, 30)) {
+			if (contentStartRow < 0)
+			{
+				contentStartRow = r;
+			}
+			else {
+				if (r - contentStartRow > 10) {
+					contentEndRow = r;
+					break;
+				}
+			}
+		}
+	}
+
+	if (contentStartRow < 0 || contentEndRow < 0) {
+		throw string("起始行或结束行分隔出错(23)");
+	}
+	//分隔列
+	list<int*> dataColIndexs;
+	int startf = -1;
+	int endf = -1;
+	int startIndex = -1;
+	for (int i = 10; i < img.cols; i++) {
+		if (startIndex == -1) {
+			startIndex = i;
+		}
+
+		bool full = ImgDivider::isColFull(img, i, contentStartRow, contentEndRow, 2);
+		if (full) {
+			if (startf < 0)
+			{
+				startf = i;
+				endf = i;
+			}
+			else {
+				endf = i;
+			}
+		}
+		else {
+			if (startf > -1 && endf > -1) {
+				int width = endf - startf + 1;
+				int* dd = (int*)malloc(sizeof(int) * 2);
+
+				*dd = startIndex;
+				*(dd + 1) = startf - 1;
+
+				dataColIndexs.push_back(dd);
+				startIndex = i;
+			}
+			startf = -1;
+			endf = -1;
+		}
+
+	}
+
+	if (startf > -1 && endf > -1) {
+		int width = endf - startf + 1;
+		int* dd = (int*)malloc(sizeof(int) * 2);
+
+		*dd = startIndex;
+		*(dd + 1) = startf - 1;
+		LogUtil::debug("列数据:%d-%d\n", *dd, *(dd + 1));
+
+		dataColIndexs.push_back(dd);
+
+		startf = -1;
+		endf = -1;
+	}
+
+	if (img.cols - startIndex > 50) {
+
+		int* dd = (int*)malloc(sizeof(int) * 2);
+
+		*dd = startIndex;
+		*(dd + 1) = img.cols - 1;
+
+		dataColIndexs.push_back(dd);
+	}
+
+
+
+
+	std::list<GPCodeArea> areaList;
+	list<int*>::iterator ele;
+	for (ele = dataColIndexs.begin(); ele != dataColIndexs.end(); ele++) {
+		int* p = *ele;
+		int startx = *p;
+		int endx = *(p + 1);
+
+		int endRow = 0;
+		//判断结束行
+		for (int r = contentStartRow + 10; r < img.rows; r++) {
+			bool full = ImgDivider::isRowFull(img, r, startx, endx, 2, 10, 30);
+			if (full) {
+				endRow = r;
+				break;
+			}
+		}
+
+
+
+		GPCodeArea area = GPCodeArea();
+		area.startx = startx;
+		area.endx = endx;
+		area.starty = contentStartRow;
+		area.endy = contentEndRow;
+		areaList.push_back(area);
+
+		free(*ele);
+	}
+	return areaList;
+}
+
 //获取副屏2
 HWND THSActionUtil::getThirdWindow() {
 	list<HWND> wlist = Win32Util::searchWindow("同花顺(");
@@ -165,12 +284,29 @@
 
 
 		if (isL2Screen(str)) {
-			return hwnd;
+			//判断内容是否为L2的内容
+			HWND mainWin = FindWindowExA(hwnd, NULL, "AfxFrameOrView100s", NULL);
+			HWND temp = NULL;
+			int content_count = 0;
+			while (TRUE) {
+				temp =	FindWindowExA(mainWin, temp, "AfxWnd100s", NULL);
+				if (temp == NULL || temp <= 0) {
+					break;
+				}
+				if (Win32Util::isWindowShow(temp)) {
+					content_count++;
+				}
+			}
+			if (content_count >= 16)
+			{
+				return hwnd;
+			}
 		}
 
 	}
 	return 0;
 }
+
 bool THSActionUtil::checkEnv() {
 
 	list<HWND> wlist = Win32Util::searchWindow("同花顺(");
@@ -228,6 +364,86 @@
 			Sleep(1000);
 		}
 	}
+}
+
+bool THSActionUtil::correctL2ScreenPlate(MatOcrFun matOcrFun)
+{
+	HWND mainPage = getL2Win();
+	if (mainPage <= 0) {
+		throw string("L2屏未打开");
+	}
+	//获取板块的Mat
+	HWND content = FindWindowExA(mainPage, NULL, "AfxFrameOrView100s", NULL);
+	//截图
+	cv::Mat oimg = CaptureUtil::capture(content);
+	cv::Mat img = ImgUtil::grayImage(oimg);
+	oimg.release();
+	//分隔图片
+	list<GPCodeArea>  areaList = splitL2WholeCateArea(img);
+	int index = 0;
+	for (list<GPCodeArea>::iterator e = areaList.begin(); e != areaList.end(); ++e)
+	{
+		GPCodeArea area = *e;
+		RECT plateRect;
+		Win32Util::getWindowRect(content, &plateRect);
+		//获取窗体位置
+		try {
+			int rows = area.endy - area.starty + 1;
+			int cols = area.endx - area.startx + 1;
+			cv::Mat mat = cv::Mat::zeros(rows, cols, CV_8UC1);
+			cv::Mat mat1 = cv::Mat(img,cv::Rect(area.startx, area.starty, cols, rows));
+			uchar *datas =(uchar *) malloc(sizeof(uchar)*mat.rows* mat.cols);
+			for (int r = 0; r < rows; r++) {
+				for (int c = 0; c < cols; c++) {
+					datas[r * cols + c] = mat1.ptr<uchar>(r)[c];
+				}
+			}
+			mat.data = datas;
+			list<OCRResult> results = matOcrFun("首板关注", mat);
+			free(datas);
+			//获取点击位置
+			for (list<OCRResult>::iterator ele = results.begin(); ele != results.end(); ++ele)
+			{
+				OCRResult result = *ele;
+				int x =  area.startx + result.rect.left;
+				int y = area.starty + result.rect.top;
+				cv::Rect ocrRect = cv::Rect(x, y, result.rect.right - result.rect.left + 1, result.rect.bottom - result.rect.top + 1);
+				//判断是否选中,选中后背景颜色的色值为15,否则就未选中
+				int selectColorCount = 0;
+				for (int r = ocrRect.y; r < ocrRect.y + ocrRect.height; r++) {
+					for (int c = ocrRect.x; c < ocrRect.x + ocrRect.width; c++) {
+						if (img.ptr<uchar>(r)[c] == 15) {
+							selectColorCount++;
+						}
+					}
+				}
+
+				//ImgUtil::markMat(img,ocrRect,255,1);
+				Win32Util::showWindow(content);
+				Win32Util::focus(content);
+				
+				// 未被选中
+				if (selectColorCount < 20)
+				{
+					for (int i = 0; i < 2; i++)
+					{
+						Win32Util::click(plateRect.left + x + 10, plateRect.top + y + (result.rect.bottom - result.rect.top) / 2, 100);
+					}
+				}
+			}
+			
+		}
+
+		catch (string st) {
+			printf(st.c_str());
+			return FALSE;
+		}
+	}
+	if (FALSE) {
+		string path = string("D:/test_mark.png");
+		cv::imwrite(path, img);
+	}
+	return TRUE;
 }
 
 void THSActionUtil::openSecondScreen() {
@@ -1042,6 +1258,8 @@
 }
 
 
+
+
 //分隔L2数据的目录
 std::list<GPCodeArea> splitL2Cate(cv::Mat img) {
 	int cols = img.cols;
@@ -1168,7 +1386,6 @@
 	}
 	return areaList;
 }
-
 
 
 //分隔L2交易队列

--
Gitblit v1.8.0