ZBLOG

windows环境C++ opencv 如何在电脑屏幕截图中找到想要的字符串例如”丰饶之间”,返回该字符串的最左坐标、最右坐标、最上坐标、最下坐标

要在Windows环境下使用C++和OpenCV在屏幕截图中找到特定的字符串,可以按照以下步骤进行:

  1. 使用OpenCV中的screencapture功能来获取电脑屏幕的截图。你可以使用cv::imshow()函数来显示截图并确保正确性。

  2. 在截图中使用OCR(光学字符识别)库或工具来识别字符串。Tesseract是一个流行且强大的开源OCR引擎,你可以将其与OpenCV结合使用。

  3. 通过遍历识别出的文本区域,在其中寻找目标字符串,并记录相应的坐标信息。

下面是一个简单示例代码,演示了如何实现上述功能:

#include <opencv2/opencv.hpp>
#include <tesseract/baseapi.h>

using namespace cv;

int main()
{
    // 获取屏幕截图
    Mat screenshot;
    HWND hwnd = GetDesktopWindow();
    HDC hdcScreen = GetDC(hwnd);
    HBITMAP hbmpScreen = CreateCompatibleBitmap(hdcScreen, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
    HGDIOBJ hOld = SelectObject(hdcScreen, hbmpScreen);
    BitBlt(hdcScreen, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), hdcScreen, 0, 0, SRCCOPY);
    SelectObject(hdcScreen, hOld);
    ReleaseDC(hwnd, hdcScreen);
    screenshot.create(GetSystemMetrics(SM_CYSCREEN), GetSystemMetrics(SM_CXSCREEN), CV_8UC4);
    GetBitmapBits(hbmpScreen, screenshot.total() * screenshot.elemSize(), screenshot.data);
    DeleteObject(hbmpScreen);

    // 初始化Tesseract OCR引擎
    tesseract::TessBaseAPI tess;
    tess.Init(NULL, "eng", tesseract::OEM_DEFAULT);
    tess.SetPageSegMode(tesseract::PSM_AUTO);

    // 将截图转换为灰度图像
    Mat gray;
    cvtColor(screenshot, gray, COLOR_BGRA2GRAY);

    // 对灰度图像进行二值化处理,以便更好地识别字符
    Mat binary;
    threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);

    // 使用Tesseract进行光学字符识别
    tess.SetImage(binary.data, binary.cols, binary.rows, 1, binary.step);
    tess.Recognize(0);
    tesseract::ResultIterator* ri = tess.GetIterator();
    
	// 遍历识别结果,并查找目标字符串的坐标信息
	int left = INT_MAX;
	int right = INT_MIN;
	int top = INT_MAX;
	int bottom = INT_MIN;

	if (ri != nullptr) {
		do {
			const char* word = ri->GetUTF8Text(tesseract::RIL_WORD);
			float confidence = ri->Confidence(tesseract::RIL_WORD);
			
			// 在这里判断word是否是目标字符串

			if (strcmp(word, "丰饶之间") == 0) {
				tesseract::Box box;
				ri->BoundingBox(tesseract::RIL_WORD, &box);
				
				left = std::min(left, box.x);
				right = std::max(right, box.x + box.w);
				top = std::min(top, box.y);
				bottom = std::max(bottom, box.y + box.h);
			}

			delete[] word;
		} while (ri->Next(tesseract::RIL_WORD));
	}

    // 打印目标字符串的坐标信息
    if (left != INT_MAX && right != INT_MIN && top != INT_MAX && bottom != INT_MIN) {
        printf("Left: %d, Right: %d, Top: %d, Bottom: %d\n", left, right, top, bottom);
    } else {
        printf("目标字符串未找到\n");
    }

    // 释放资源
    tess.End();

    return 0;
}

请注意,这只是一个简单示例,你可能需要根据实际情况进行适当的调整和改进。同时,请确保你已正确安装OpenCV和Tesseract,并将其与项目配置文件连接起来。

希望这可以帮助到你开始在Windows环境下使用C++和OpenCV进行屏幕截图中字符串的查找。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=8014

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?