在人工智能与计算机视觉飞速发展的今天,C++ OpenCV机器学习已成为开发者入门图像智能分析的重要工具。OpenCV不仅提供强大的图像处理功能,还内置了OpenCV ML模块,支持多种经典机器学习算法。本教程将手把手带你用C++和OpenCV实现一个简单的图像分类任务,即使你是编程小白,也能轻松上手!

首先,确保你已安装OpenCV库(建议版本4.x以上)。在Ubuntu系统中,可通过以下命令安装:
sudo apt-get updatesudo apt-get install libopencv-devWindows用户可使用vcpkg或预编译库。安装完成后,编写CMakeLists.txt以链接OpenCV:
cmake_minimum_required(VERSION 3.10)project(opencv_ml_demo)find_package(OpenCV REQUIRED)include_directories(${OpenCV_INCLUDE_DIRS})add_executable(main main.cpp)target_link_libraries(main ${OpenCV_LIBS})OpenCV ML模块包含K近邻(KNN)、支持向量机(SVM)、决策树、随机森林、Boosting等多种算法。这些算法可用于分类、回归等任务。对于图像识别初学者,我们推荐从KNN入手,因其原理简单、易于调试。
我们将使用OpenCV自带的MNIST简化版数据集(digits.png),训练一个KNN模型来识别手写数字。
#include <opencv2/opencv.hpp>#include <opencv2/ml.hpp>using namespace cv;using namespace cv::ml;int main() { // 加载数据集(OpenCV自带的digits.png) Mat img = imread("digits.png", IMREAD_GRAYSCALE); if (img.empty()) { std::cerr << "无法加载图像!" << std::endl; return -1; } // 将图像分割为5000个数字(每个20x20) int h = img.rows / 50; // 50行 int w = img.cols / 100; // 100列 Mat data, labels; for (int i = 0; i < 50; ++i) { for (int j = 0; j < 100; ++j) { Mat digit = img(Rect(j * 20, i * 20, 20, 20)); digit = digit.reshape(1, 1); // 展平为1x400 data.push_back(digit); labels.push_back((int)(i / 5)); // 每5行为同一数字(0-9) } } // 转换为浮点型 data.convertTo(data, CV_32F); labels.convertTo(labels, CV_32S); // ... // 创建KNN模型 Ptr<KNearest> knn = KNearest::create(); knn->setDefaultK(5); // 训练模型 knn->train(data, ROW_SAMPLE, labels); // ... // 使用部分数据作为测试集 Mat test_data = data.rowRange(0, 1000); Mat test_labels = labels.rowRange(0, 1000); int correct = 0; for (int i = 0; i < test_data.rows; ++i) { Mat sample = test_data.row(i); float response = knn->findNearest(sample, 5); if ((int)response == test_labels.at<int>(i, 0)) correct++; } double accuracy = (double)correct / test_data.rows * 100; std::cout << "准确率: " << accuracy << "%" << std::endl; return 0;}通过本教程,你已经掌握了如何使用C++ OpenCV机器学习完成一个完整的图像分类项目。OpenCV的ML模块虽不如深度学习框架强大,但对于轻量级应用、嵌入式设备或学习基础概念非常实用。希望这篇OpenCV新手教程能为你打开计算机视觉的大门!
提示:完整代码及digits.png可在OpenCV官方samples/cpp目录中找到。
本文由主机测评网于2025-12-18发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/2025129726.html