使用 OpenCV 在 C++ 中进行图像处理:resize 和 crop
在现代应用开发中,尤其是在计算机视觉、网页抓取或媒体文件处理领域,经常需要以编程方式调整图像大小(resize)和裁剪图像(crop)。C++ 语言结合强大的 OpenCV 库为此提供了所有必要的工具。本文将详细讲解如何执行这些操作,哪些参数会影响结果质量,并提供现成的代码示例。
OpenCV 库——C++ 图像处理的事实标准
OpenCV(开源计算机视觉库)是一个跨平台的开源库,包含数百个用于图像和视频处理的优化算法。它使用 C++ 编写,并具有 Python、Java 等语言的绑定。对于 C++ 而言,OpenCV 是性能最高、功能最全面的解决方案。
OpenCV 在 resize 和 crop 任务中的主要优势:
- 高速——所有函数都使用 SIMD 指令和多线程。
- 灵活性——支持多种插值方法(双线性、双三次、Lanczos 等)。
- 便捷性——通过
cv::Mat类处理图像,该类可自动管理内存。
为 C++ 安装 OpenCV
首先需要安装该库。最常见的方法是通过 vcpkg 包管理器或从源代码编译。通过 vcpkg 安装的示例:
git clone https://github.com/Microsoft/vcpkg.gitcd vcpkg./bootstrap-vcpkg.sh./vcpkg install opencv4安装后,在您的 CMakeLists.txt 中链接该库:
find_package(OpenCV REQUIRED)target_link_libraries(your_project ${OpenCV_LIBS})调整图像大小(resize)
cv::resize() 函数允许将原始图像的大小调整为指定的宽度和高度。语法如下:
cv::resize( InputArray src, // 原始图像 OutputArray dst, // 结果图像 Size dsize, // 新尺寸(宽度,高度) double fx = 0, // X 方向缩放比例(如果未指定 dsize) double fy = 0, // Y 方向缩放比例 int interpolation = INTER_LINEAR // 插值方法);interpolation 参数决定了用于计算新像素的算法。主要选项:
INTER_NEAREST——最近邻插值(速度快,但质量低)。INTER_LINEAR——双线性插值(速度与质量的良好平衡)。INTER_CUBIC——双三次插值(质量更高,但速度较慢)。INTER_LANCZOS4——Lanczos 插值(放大时质量最佳)。
使用双三次插值将图像放大 2 倍的示例:
#include <opencv2/opencv.hpp>#include <iostream>
int main() { cv::Mat src = cv::imread("input.jpg"); if (src.empty()) { std::cerr << "无法加载图像" << std::endl; return -1; }
cv::Mat dst; cv::resize(src, dst, cv::Size(), 2.0, 2.0, cv::INTER_CUBIC);
cv::imwrite("output_resized.jpg", dst); std::cout << "图像已放大并保存" << std::endl; return 0;}裁剪图像(crop)
OpenCV 中没有专门的裁剪函数。相反,它使用 感兴趣区域(ROI) 机制——在图像上选择一个矩形区域。这可以通过 () 运算符或 cv::Mat::operator() 方法实现。
裁剪语法