使用OpenCV在C++中进行图像处理:调整大小(resize)和裁剪(crop)
在现代计算机图形学和计算机视觉中,调整图像大小(resize)和裁剪(crop)是基础操作。无论您是在开发照片处理应用程序、人脸识别系统,还是仅仅想为神经网络准备图像,都离不开这些功能。本文将详细介绍如何使用强大的OpenCV库在C++语言中执行resize和crop操作。
为什么选择OpenCV?
OpenCV(开源计算机视觉库)是计算机视觉任务的事实标准。它采用C/C++编写,提供了数百种优化算法。对于resize和crop操作,我们只需要几个函数,但它们的性能和灵活性使OpenCV成为理想的选择。
您可以通过包管理器(例如vcpkg install opencv或brew install opencv)安装OpenCV,或者从源代码编译。安装细节不在本文讨论范围内,但假设您已经配置好了包含该库的项目。
准备工作:加载图像
在进行任何操作之前,需要先加载图像。在OpenCV中,使用imread()函数完成:
#include <opencv2/opencv.hpp>#include <iostream>
using namespace cv;using namespace std;
int main() { // 加载图像 Mat image = imread("input.jpg"); if (image.empty()) { cerr << "图像加载失败!" << endl; return -1; } cout << "原始图像尺寸: " << image.cols << " x " << image.rows << endl; return 0;}该函数返回一个Mat(矩阵)类型的对象。如果文件未找到或损坏,image.empty()将返回true。
在C++中调整图像大小(resize)
OpenCV中的resize()函数允许将图像缩放到任意尺寸。它支持多种插值方法,这些方法会影响结果的质量。
resize语法
void resize(InputArray src, OutputArray dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR);- src — 原始图像。
- dst — 结果图像。
- dsize — 新尺寸(宽度,高度)。可以显式指定,也可以通过
fx和fy计算得出。 - fx — 宽度缩放因子(如果dsize = Size())。
- fy — 高度缩放因子。
- interpolation — 插值方法。主要选项:
INTER_NEAREST— 最近邻插值(速度快,但有伪影)。INTER_LINEAR— 双线性插值(默认,平衡性好)。INTER_CUBIC— 双三次插值(速度较慢,但质量更高)。INTER_AREA— 用于缩小图像(像素区域关系)。
示例1:缩小到固定尺寸
Mat resized;Size newSize(300, 200); // 宽度300,高度200resize(image, resized, newSize, 0, 0, INTER_AREA);imwrite("resized_fixed.jpg", resized);cout << "调整大小后的尺寸: " << resized.cols << " x " << resized.rows << endl;示例2:按比例缩放2倍
Mat scaled;resize(image, scaled, Size(), 0.5, 0.5, INTER_LINEAR);imwrite("scaled_half.jpg", scaled);如果指定dsize = Size(),则新尺寸根据公式计算:dsiz