|
// ocr_demo.cpp
#include <opencv2/opencv.hpp>
#include <opencv2/text.hpp> // 注意:Text 模块头
#include <iostream>
int main(int argc, char** argv) {
if (argc < 2) {
std::cerr << "用法: " << argv[0] << " <图像路径>\n";
return -1;
}
// 1. 读图 & 灰度化
cv::Mat src = cv::imread(argv[1]);
if (src.empty()) {
std::cerr << "无法加载图像: " << argv[1] << "\n";
return -1;
}
cv::Mat gray;
cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY);
// 2. (可选)二值化/去噪,提升识别率
cv::Mat bw;
cv::adaptiveThreshold(gray, bw, 255,
cv::ADAPTIVE_THRESH_MEAN_C,
cv::THRESH_BINARY, 15, 10);
// 3. 创建 OCRTesseract 对象
// - datapath: nullptr → 使用系统环境变量 TESSDATA_PREFIX 指向的 tessdata
// - language: "eng" 或 "chi_sim"
// - charWhitelist: nullptr → 识别所有字符
auto ocr = cv::text::OCRTesseract::create(
/*datapath=*/nullptr,
/*language=*/"eng",
/*charWhitelist=*/nullptr,
/*oem=*/cv::text::OEM_LSTM_ONLY,
/*psmode=*/cv::text::PSM_AUTO
);
// 4. 运行 OCR
std::string outputText;
std::vector<cv::Rect> boxes;
std::vector<std::string> words;
std::vector<float> confidences;
ocr->run(
bw, // 输入:二值化后图像
outputText, // 输出:整段文本
&boxes, // 输出:文字块区域
&words, // 输出:分词结果
&confidences, // 输出:对应置信度
cv::text::OCR_LEVEL_WORD
);
// 5. 输出识别结果
std::cout << "===== 识别文本 =====\n" << outputText << "\n";
// 6. 可视化:在原图上画出每个文字块与识别结果
for (size_t i = 0; i < boxes.size(); ++i) {
cv::rectangle(src, boxes, cv::Scalar(0, 0, 255), 2);
cv::putText(src, words,
boxes.tl() + cv::Point(0, -5),
cv::FONT_HERSHEY_SIMPLEX, 0.5,
cv::Scalar(0, 255, 0), 1);
}
cv::imshow("OCR 结果", src);
cv::waitKey(0);
return 0;
}
|
|