#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<uchar>(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<HWND> WechatOCR::getWechatSimulatorHwnds()
|
{
|
list<HWND> hwnds = Win32Util::searchWindow("΢ÐÅ");
|
list<HWND> wechatHWNDs;
|
for (list<HWND>::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;
|
}
|