#include "pch.h" #include "WechatOCR.h" #include "StringUtil.h" HWND WechatOCR::getWechatWindow() { return HWND(); } cv::Mat WechatOCR::capture(HWND hwnd) { return cv::Mat(); } string WechatOCR::ocrCode(cv::Mat src) { return string(); } WechatOCR::WechatOCR() { tessApi = new tesseract::TessBaseAPI(); // ÉèÖÃÓïÑÔ // eng+chi_sim if (tessApi->Init("tessdata", "eng+chi_sim")) { std::cerr << "Could not initialize tesseract.\n"; exit(1); } } WechatOCR::~WechatOCR() { if (tessApi != nullptr) { // ÇåÀí tessApi->End(); delete tessApi; } } void WechatOCR::ocr(cv::Mat src) { Pix* pix = pixCreate(src.cols, src.rows, 8); for (int y = 0; y < src.rows; ++y) { for (int x = 0; x < src.cols; ++x) { pixSetPixel(pix, x, y, src.ptr(y)[x]); } } // ÉèÖÃͼÏñ tessApi->SetImage(pix); //char *result = tessApi->GetUTF8Text(); //cout << "ʶ±ðµÄÄÚÈÝ£º"<< string(result) << endl; if (tessApi->Recognize(nullptr) != 0) { std::cerr << "Recognition failed." << std::endl; tessApi->End(); pixDestroy(&pix); cout << "ʶ±ð³ö´í" << endl; return ; } // »ñÈ¡Îı¾ tesseract::ResultIterator* ri = tessApi->GetIterator(); tesseract::PageIteratorLevel level = tesseract::RIL_WORD; if (ri != nullptr) { do { const char* word = ri->GetUTF8Text(level); if (word == nullptr) { continue; } float conf = ri->Confidence(level); int x1, y1, x2, y2; ri->BoundingBox(level, &x1, &y1, &x2, &y2); std::cout << "Word: " << word << ", Confidence: " << conf << ", Bounding box: (" << x1 << ", " << y1 << ") - (" << x2 << ", " << y2 << ")" << std::endl; delete[] word; } while (ri->Next(level)); delete ri; } tessApi->End(); pixDestroy(&pix); } void WechatOCR::test(Pix* src) { // ÉèÖÃͼÏñ tessApi->SetImage(src); // »ñÈ¡Îı¾ tesseract::ResultIterator* ri = tessApi->GetIterator(); tesseract::PageIteratorLevel level = tesseract::RIL_WORD; if (ri != nullptr) { do { const char* word = ri->GetUTF8Text(level); float conf = ri->Confidence(level); int x1, y1, x2, y2; ri->BoundingBox(level, &x1, &y1, &x2, &y2); std::cout << "Word: " << word << ", Confidence: " << conf << ", Bounding box: (" << x1 << ", " << y1 << ") - (" << x2 << ", " << y2 << ")" << std::endl; delete[] word; } while (ri->Next(level)); delete ri; } tessApi->End(); pixDestroy(&src); } list WechatOCR::getWechatSimulatorHwnds() { list hwnds = Win32Util::searchWindow("΢ÐÅ"); list wechatHWNDs; for (list::iterator e = hwnds.begin();e != hwnds.end();++e) { HWND hwnd = *e; hwnd = FindWindowExA(hwnd, 0, "Qt5152QWindowIcon", "Androws"); if (hwnd > 0) { for (int i = 0;i < 10;i++) { hwnd = FindWindowExA(hwnd, 0, "Qt5152QWindowIcon", "Androws"); if (FindWindowExA(hwnd, 0, "subWin", "sub") > 0) { hwnd = FindWindowExA(hwnd, 0, "subWin", "sub"); wechatHWNDs.push_back(hwnd); break; } } } } return wechatHWNDs; } cv::Mat WechatOCR::grayImage(cv::Mat src) { cv::Mat grayImage; if (src.channels() == 3) { cvtColor(src, grayImage, cv::COLOR_RGB2GRAY); } else if (src.channels() == 4) { cvtColor(src, grayImage, cv::COLOR_RGBA2GRAY); } else if (src.channels() == 1) { return src; } return grayImage; }