c++OpenCV数字识别
时间: 2025-06-13 10:57:01 浏览: 13
### C++ OpenCV 数字识别 示例代码与教程
数字识别是计算机视觉领域的重要应用之一,结合OpenCV和C++可以实现高效的图像处理与模式识别。以下是基于OpenCV的数字识别完整示例代码及说明。
#### 1. 图像预处理
在进行数字识别之前,需要对输入图像进行预处理以提高识别准确率。常见的预处理步骤包括灰度化、二值化以及噪声去除。
```cpp
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
// 读取图像
cv::Mat img = cv::imread("digits.png");
if (img.empty()) {
std::cerr << "Image not loaded!" << std::endl;
return -1;
}
// 转换为灰度图像
cv::Mat gray;
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
// 应用高斯模糊去噪
cv::GaussianBlur(gray, gray, cv::Size(5, 5), 0);
// 二值化处理
cv::threshold(gray, gray, 0, 255, cv::THRESH_BINARY_INV + cv::THRESH_OTSU);
return 0;
}
```
通过上述代码,可以将彩色图像转换为适合数字识别的二值化图像[^1]。
#### 2. 轮廓检测
轮廓检测用于提取图像中的独立字符或数字区域。OpenCV提供了`findContours`函数来实现这一功能。
```cpp
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
// 查找轮廓
cv::findContours(gray, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
// 绘制轮廓
cv::Mat contourImg = cv::Mat::zeros(gray.size(), CV_8UC3);
for (size_t i = 0; i < contours.size(); i++) {
cv::Scalar color = cv::Scalar(0, 255, 0);
cv::drawContours(contourImg, contours, i, color, 2, cv::LINE_8, hierarchy, 0);
}
cv::imshow("Contours", contourImg);
cv::waitKey(0);
```
通过轮廓检测,可以定位到图像中的每个数字区域[^2]。
#### 3. 特征提取与分类
为了识别数字,可以使用机器学习模型(如KNN或SVM)进行分类。以下是一个简单的KNN训练与预测示例:
```cpp
#include <opencv2/ml.hpp>
void trainKNN(cv::Ptr<cv::ml::KNearest>& knn) {
// 准备训练数据
cv::Mat trainingData = (cv::Mat_<float>(10, 64) << /* 插入特征向量 */);
cv::Mat labels = (cv::Mat_<float>(10, 1) << 0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
// 初始化KNN
knn = cv::ml::KNearest::create();
knn->train(trainingData, cv::ml::ROW_SAMPLE, labels);
}
void predictKNN(cv::Ptr<cv::ml::KNearest>& knn, const cv::Mat& sample) {
cv::Mat response;
knn->findNearest(sample, 1, response);
std::cout << "Predicted digit: " << response.at<float>(0) << std::endl;
}
```
通过KNN模型,可以对提取的数字特征进行分类并输出结果[^1]。
#### 4. 使用OCR引擎
如果需要更复杂的识别任务,可以集成Tesseract OCR引擎。以下是一个简单的Tesseract初始化与识别示例:
```cpp
#include <tesseract/baseapi.h>
void ocrRecognition(const cv::Mat& img) {
tesseract::TessBaseAPI ocr;
if (ocr.Init(NULL, "eng", tesseract::OEM_LSTM_ONLY)) {
std::cerr << "Could not initialize tesseract." << std::endl;
return;
}
ocr.SetImage((uchar*)img.data, img.cols, img.rows, 1, img.step);
std::string text = ocr.GetUTF8Text();
std::cout << "OCR Output: " << text << std::endl;
ocr.End();
}
```
Tesseract OCR能够高效地识别复杂场景下的数字和字符[^1]。
---
###
阅读全文
相关推荐
















