提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
OpenCV(Open Source Computer Vision Library)是一款开源的计算机视觉和机器学习软件库。它提供了一套全面的工具,用于图像和视频处理、计算机视觉以及机器学习。
图像处理: OpenCV提供了广泛的图像处理功能,涵盖了从基本操作到高级计算机视觉和图像处理任务的广泛范围,包括调整大小、裁剪、旋转、阈值处理、滤波和形态学操作等。这些操作对于操作和增强图像至关重要。
以下是一些常见的图像基本操作函数:
cv::resize
cv::resize函数用于改变图像的尺寸。它的基本语法如下:
cv::resize(src, dst, cv::Size(width, height), interpolation);
其中:
src 是输入图像。
dst 是输出图像。
cv::Size(width, height) 指定目标图像的宽度和高度。
interpolation 是插值方法,例如 cv::INTER_LINEAR(双线性插值)等。
案例
#include <opencv2/opencv.hpp>
int main() {
// 读取图像
cv::Mat inputImage = cv::imread("input_image.jpg");
if (inputImage.empty()) {
std::cerr << "Error: Unable to load the input image." << std::endl;
return -1;
}
// 调整图像大小
cv::Mat resizedImage;
cv::resize(inputImage, resizedImage, cv::Size(640, 480), cv::INTER_LINEAR);
// 保存调整大小后的图像
cv::imwrite("resized_image.jpg", resizedImage);
return 0;
}
cv::cvtColor
cv::cvtColor函数用于在不同的颜色空间之间进行转换。它的基本语法如下:
cv::cvtColor(src, dst, conversionCode);
其中:
src 是输入图像。
dst 是输出图像。
conversionCode 是颜色空间转换的代码,例如 cv::COLOR_BGR2GRAY(BGR到灰度)。
案例
#include <opencv2/opencv.hpp>
int main() {
// 读取彩色图像
cv::Mat colorImage = cv::imread("color_image.jpg");
if (colorImage.empty()) {
std::cerr << "Error: Unable to load the color image." << std::endl;
return -1;
}
// 转换为灰度图像
cv::Mat grayscaleImage;
cv::cvtColor(colorImage, grayscaleImage, cv::COLOR_BGR2GRAY);
// 保存灰度图像
cv::imwrite("grayscale_image.jpg", grayscaleImage);
return 0;
}
cv::split 和 cv::merge
cv::split 和 cv::merge函数用于在多通道图像中分离通道或将单通道图像合并为多通道图像。它的基本语法如下:
// 分离通道
cv::Mat channels[3];
cv::split(colorImage, channels);
// 合并通道
cv::Mat mergedImage;
cv::merge(channels, 3, mergedImage);
在这里,split 将多通道图像分离为各个通道,而 merge 将各通道图像合并为多通道图像。
案例
#include <opencv2/opencv.hpp>
int main() {
// 读取彩色图像
cv::Mat colorImage = cv::imread("color_image.jpg");
if (colorImage.empty()) {
std::cerr << "Error: Unable to load the color image." << std::endl;
return -1;
}
// 分离通道
cv::Mat channels[3];
cv::split(colorImage, channels);
// 合并通道
cv::Mat mergedImage;
cv::merge(channels, 3, mergedImage);
// 保存分离和合并通道后的图像
cv::imwrite("split_channels.jpg", mergedImage);
return 0;
}
cv::Rect 和 ROI
图像裁剪是通过定义感兴趣区域(ROI,Region of Interest)来提取图像的一部分。在OpenCV中,可以使用cv::Rect来指定矩形区域,然后通过在图像上进行索引来提取该区域。
cv::Rect函数用于裁剪图像。它的示例代码如下:
cv::Rect roiRect(100, 50, 300, 200); // (x, y, width, height)
cv::Mat roi = inputImage(roiRect);
在这个示例中,(100, 50) 是感兴趣区域的左上角坐标,300 是宽度,200 是高度。
然后,通过将roiRect作为索引传递给输入图像,提取了感兴趣区域。
案例
#include <opencv2/opencv.hpp>
int main() {
// 读取图像
cv::Mat inputImage = cv::imread("input_image.jpg");
if (inputImage.empty()) {
std::cerr << "Error: Unable to load the input image." << std::endl;
return -1;
}
// 定义感兴趣区域 (ROI)
cv::Rect roiRect(100, 50, 300, 200); // (x, y, width, height)
// 提取ROI
cv::Mat roi = inputImage(roiRect);
// 保存裁剪后的图像
cv::imwrite("cropped_image.jpg", roi);
return 0;
}
cv::getRotationMatrix2D 和 cv::warpAffine
图像旋转是通过计算旋转矩阵,并使用cv::warpAffine函数应用变换来实现的。
cv::getRotationMatrix2D用于计算旋转矩阵,然后cv::warpAffine将该矩阵应用到图像上。
cv::getRotationMatrix2D 和 cv::warpAffine函数用于图像旋转。它的示例代码如下:
cv::Point2f center(inputImage.cols / 2.0, inputImage.rows / 2.0);
double angle = 45.0;
cv::Mat rotationMatrix = cv::getRotationMatrix2D(center, angle, 1.0);
cv::Mat rotatedImage;
cv::warpAffine(inputImage, rotatedImage, rotationMatrix, inputImage.size());
在这个示例中,center 是旋转中心的坐标,angle 是旋转角度,1.0 是缩放因子。
cv::getRotationMatrix2D计算了旋转矩阵,然后cv::warpAffine将该矩阵应用到输入图像上
案例
#include <opencv2/opencv.hpp>
int main() {
// 读取图像
cv::Mat inputImage = cv::imread("input_image.jpg");
if (inputImage.empty()) {
std::cerr << "Error: Unable to load the input image." << std::endl;
return -1;
}
// 定义旋转中心和角度
cv::Point2f center(inputImage.cols / 2.0, inputImage.rows / 2.0);
double angle = 45.0;
// 计算旋转矩阵
cv::Mat rotationMatrix = cv::getRotationMatrix2D(center, angle, 1.0);
// 应用旋转变换
cv::Mat rotatedImage;
cv::warpAffine(inputImage, rotatedImage, rotationMatrix, inputImage.size());
// 保存旋转后的图像
cv::imwrite("rotated_image.jpg", rotatedImage);
return 0;
}
cv::flip
图像镜像是通过使用cv::flip函数实现的,该函数可对图像进行水平或垂直翻转。
cv::flip函数用于改变图像镜像。它的代码示例如下:
cv::Mat mirroredImage;
cv::flip(inputImage, mirroredImage, 1); // 参数为1表示水平翻转
在这个示例中,cv::flip函数将inputImage水平翻转,并将结果保存在mirroredImage中。
参数 1 表示水平翻转,如果是 0 则表示垂直翻转,负值表示同时在水平和垂直方向翻转。
案例
#include <opencv2/opencv.hpp>
int main() {
// 读取图像
cv::Mat inputImage = cv::imread("input_image.jpg");
if (inputImage.empty()) {
std::cerr << "Error: Unable to load the input image." << std::endl;
return -1;
}
// 水平镜像
cv::Mat mirroredImage;
cv::flip(inputImage, mirroredImage, 1); // 参数为1表示水平翻转
// 保存镜像后的图像
cv::imwrite("mirrored_image.jpg", mirroredImage);
return 0;
}
总结
以上就是OpenCV中的有关于图像的一些基本操作,如有不足之处,还请大家斧正!!!