广告

C++怎么用OpenCV进行图像处理?从读取到显示的完整入门教程

准备工作与环境搭建

1.1 安装OpenCV与工具链

要开始使用 C++ 进行图像处理,首要任务是获取 OpenCV 和工具链。OpenCV 提供跨平台的核心函数库,包含 imreadimshowcvtColorresize 等常用接口。确保 C++ 编译器OpenCV 版本兼容。

在 Linux、Windows、macOS 下的安装方式略有不同。常见方案包括通过系统包管理器安装、使用预编译的二进制包,或使用构建工具(如 CMake + vcpkg/Conan)来获取 OpenCV。记录下你选取的 安装方式,以便后续构建脚本与依赖管理保持一致。

C++怎么用OpenCV进行图像处理?从读取到显示的完整入门教程

# Ubuntu 及 Debian 系系统
sudo apt-get update
sudo apt-get install -y libopencv-dev
# Windows(示例:使用 vcpkg 安装 OpenCV)
.\vcpkg integrate install
.\vcpkg install opencv

1.2 配置开发环境

推荐使用 CMake 作为跨平台构建系统。创建一个简单的 CMakeLists.txt,在其中明确 find_package(OpenCV REQUIRED)include_directoriestarget_link_libraries,以确保 OpenCV 正确编译和链接。

如果你使用 IDE,如 Visual StudioCLion、或 Qt Creator,请在项目设置中配置好 OpenCV 库的路径,并将头文件路径与库文件路径加入到 包含目录链接库 中,以实现无缝构建。

cmake_minimum_required(VERSION 3.14)
project(OpenCVIntro)
find_package(OpenCV REQUIRED)
add_executable(my_app main.cpp)
target_link_libraries(my_app PRIVATE ${OpenCV_LIBS})
target_include_directories(my_app PRIVATE ${OpenCV_INCLUDE_DIRS})

从读取到显示的完整入门教程

2.1 读取图像

在 OpenCV 的图像处理流程中,第一步通常是使用 cv::imread 读取图像。第二个参数可以控制颜色空间,例如 cv::IMREAD_COLORcv::IMREAD_GRAYSCALE,以满足不同的处理需求。

了解 cv::Mat 的数据结构及内存管理也很重要,因为大图像的存储与传输会影响性能。以下示例展示了如何读取一个彩色图像并做基本的错误处理。

#include <opencv2/opencv.hpp>
#include <iostream>int main(int argc, char** argv) {const std::string path = (argc > 1) ? argv[1] : "test.jpg";cv::Mat img = cv::imread(path, cv::IMREAD_COLOR); // 读取彩色图像if (img.empty()) {std::cerr << "Unable to open image: " << path << std::endl;return -1;}// 继续后续处理return 0;
}

2.2 基本显示

读取到图像后,最直观的操作是通过 cv::imshow 在一个窗口中显示图像,同时需要调用 cv::waitKey 来处理 GUI 事件,否则窗口可能瞬间关闭。

下面的示例演示如何将读取到的图像显示在窗口中并等待用户按键再退出。

#include <opencv2/opencv.hpp>
#include <iostream>int main(int argc, char** argv) {cv::Mat img = cv::imread((argc > 1) ? argv[1] : "test.jpg", cv::IMREAD_COLOR);if (img.empty()) return -1;cv::imshow("显示", img);cv::waitKey(0); // 等待键盘输入return 0;
}

2.3 图像处理基础

OpenCV 提供了丰富的基础图像处理接口,常见操作包括 颜色空间转换 cv::cvtColor缩放 cv::resize、以及绘制形状的函数 cv::rectanglecv::circle 等等。这些操作构成了大多数入门案例的核心步骤。

通过组合这些基本函数,可以实现从简单的颜色空间变换到基本几何绘制的完整流程。以下示例演示了将彩色图像转换为灰度、重采样到新尺寸,并在结果上绘制一个矩形。

#include <opencv2/opencv.hpp>
#include <iostream>int main(int argc, char** argv) {cv::Mat color = cv::imread((argc > 1) ? argv[1] : "test.jpg", cv::IMREAD_COLOR);if (color.empty()) return -1;cv::Mat gray, resized;cv::cvtColor(color, gray, cv::COLOR_BGR2GRAY);cv::resize(color, resized, cv::Size(320, 240));cv::rectangle(resized, cv::Point(10,10), cv::Point(310,230), cv::Scalar(0,255,0), 2);cv::imshow("处理结果", resized);cv::waitKey(0);return 0;
}

2.4 保存结果

在完成处理后,通常需要将结果保存到磁盘,以便后续分析或展示。开放接口 cv::imwrite 支持多种图像格式,使用简单易用。

下面的示例演示如何将处理后的灰度图像保存为 PNG 文件。若保存失败,程序会输出错误信息。

#include <opencv2/opencv.hpp>
#include <iostream>int main() {cv::Mat img = cv::imread("test.jpg", cv::IMREAD_COLOR);if (img.empty()) return -1;cv::Mat gray;cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);bool ok = cv::imwrite("output_gray.png", gray);if (!ok) std::cerr << "保存失败" << std::endl;return ok ? 0 : -1;
}

2.5 简单的完整示例程序

为了给初学者一个完整的起步示例,下面给出一个把彩色图像读取、灰度化、显示并保存的简单程序。该示例将帮助你快速从读取到显示再到保存的完整流程。

#include <opencv2/opencv.hpp>
#include <iostream>int main(int argc, char** argv) {const std::string path = (argc > 1) ? argv[1] : "test.jpg";cv::Mat color = cv::imread(path, cv::IMREAD_COLOR);if (color.empty()) {std::cerr << "无法打开图像: " << path << std::endl;return -1;}cv::Mat gray;cv::cvtColor(color, gray, cv::COLOR_BGR2GRAY);cv::Mat display;cv::resize(color, display, cv::Size(640, 480));cv::imshow("彩色图像", display);cv::imshow("灰度图像", gray);cv::waitKey(0);bool saved = cv::imwrite("output_gray.png", gray);return saved ? 0 : -1;
}

广告

后端开发标签