用 C++ + OpenCV + ONNX 实现图像验证码识别

本文介绍如何在 C++ 环境下完成图像验证码识别任务。我们将借助 Python 训练好模型并导出为 ONNX 格式,随后在 C++ 中加载模型并进行预测。

一、准备数据与训练模型(使用 Python)
仍然用 Python 生成数据和训练模型,最后导出为 ONNX 格式:

模型训练代码略,可复用 PyTorch 实现

最后导出模型

torch.onnx.export(model, sample_input, "captcha_model.onnx",
input_names=["input"], output_names=["output"],
dynamic_axes={"input": {0: "batch_size"}, "output": {0: "batch_size"}})
二、C++ 项目配置
确保安装了以下库:
更多内容访问ttocr.com或联系1436423940
OpenCV(图像处理)

ONNX Runtime(模型推理)

可以使用 CMake 进行构建:

find_package(OpenCV REQUIRED)
find_package(ONNXRuntime REQUIRED)

add_executable(captcha_predict main.cpp)
target_link_libraries(captcha_predict ${OpenCV_LIBS} onnxruntime)
三、图像预处理(OpenCV)

cv::Mat preprocess(const cv::Mat& img) {
cv::Mat resized, float_img, normalized;
cv::resize(img, resized, cv::Size(160, 60));
resized.convertTo(float_img, CV_32F, 1.0 / 255);
normalized = (float_img - 0.5) / 0.5; // 标准化到 [-1, 1]
return normalized;
}
四、使用 ONNX Runtime 加载并推理模型

include <onnxruntime_cxx_api.h>

Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "captcha");
Ort::SessionOptions session_options;
Ort::Session session(env, "captcha_model.onnx", session_options);

Ort::AllocatorWithDefaultOptions allocator;
auto input_name = session.GetInputName(0, allocator);
auto output_name = session.GetOutputName(0, allocator);

// 假设图片已经加载并处理为 float 数组 input_tensor_values
std::array<int64_t, 4> input_shape = {1, 3, 60, 160};
Ort::Value input_tensor = Ort::Value::CreateTensor(
allocator, input_tensor_values.data(), input_tensor_values.size(),
input_shape.data(), input_shape.size());

auto output_tensors = session.Run(Ort::RunOptions{nullptr},
&input_name, &input_tensor, 1,
&output_name, 1);

// 解析输出
float* out = output_tensors.front().GetTensorMutableData();
for (int i = 0; i < 4; ++i) {
int max_idx = std::max_element(out + i * 36, out + (i + 1) * 36) - (out + i * 36);
std::cout << characters[max_idx];
}

posted @ 2025-05-28 23:01  ttocr、com  阅读(123)  评论(0)    收藏  举报