目录
在图像处理与计算机视觉领域,OpenCV(Open Source Computer Vision Library)是一个非常强大的工具库。它提供了丰富的函数接口,用于图像的读取、显示、写入及各种复杂的图像处理任务。本文将详细介绍OpenCV中图像读写的基础技术,包括imread
、imshow
和imwrite
函数的使用。
1. 图像读取:imread
函数
在OpenCV中,imread
函数用于从指定文件路径读取图像。其函数原型如下:
Mat imread(const String& filename, int flags = IMREAD_COLOR);
- filename:图像文件的路径,可以是相对路径或绝对路径。
- flags:图像读取的模式,常见的模式包括:
IMREAD_COLOR
:以彩色模式读取图像(默认),图像数据会被转换为3通道的BGR图像。IMREAD_GRAYSCALE
:以灰度模式读取图像,图像数据会被转换为单通道的图像。IMREAD_UNCHANGED
:包括alpha通道的加载图像(如果有的话)。IMREAD_ANYDEPTH
:如果图像文件是16位或32位深度的,则以其原始深度读取图像,而不是默认的8位。IMREAD_ANYCOLOR
:以图像文件本身的颜色格式读取图像。
示例代码
#include <opencv2/opencv.hpp>
#include <iostream>
int main(int argc, char const* argv[]) {
cv::Mat img = cv::imread("test.png", cv::IMREAD_GRAYSCALE);
if (img.empty()) {
std::cout << "图像读取失败!" << std::endl;
return -1;
}
std::cout << "宽度: " << img.cols << std::endl;
std::cout << "高度: " << img.rows << std::endl;
std::cout << "通道数: " << img.channels() << std::endl;
return 0;
}
2. 图像显示:imshow
函数
imshow
函数用于在窗口中显示图像。其函数原型如下:
void imshow(const String& winname, InputArray mat);
- winname:窗口名称,用于指定图像显示的窗口。
- mat:需要显示的图像数据。
需要注意的是,imshow
函数只支持8位灰度图像、8位彩色图像和32位灰度图像(像素值范围0-1)。为了保持图像显示窗口的打开状态,通常与waitKey
函数一起使用。
示例代码
#include <opencv2/opencv.hpp>
#include <iostream>
int main(int argc, char const* argv[]) {
cv::Mat img = cv::imread("test.png", cv::IMREAD_GRAYSCALE);
cv::imshow("Hello", img);
cv::waitKey(0); // 等待用户按键
return 0;
}
3. 图像写入:imwrite
函数
imwrite
函数用于将图像写入文件。其函数原型如下:
bool imwrite(const String& filename, InputArray img, const std::vector<int>& params = std::vector<int>());
- filename:要写入的文件名,包括文件扩展名(如"result.png")。
- img:Mat类型的图像数据。
- params:特定格式的保存参数编码,默认为空。
需要注意的是,并非所有格式的Mat类型数据都能被保存为图片。OpenCV主要支持单通道和3通道的图像,且深度为8bit和16bit无符号。
示例代码
#include <opencv2/opencv.hpp>
#include <iostream>
int main(int argc, char const* argv[]) {
cv::Mat img = cv::imread("test.png", cv::IMREAD_GRAYSCALE);
cv::imwrite("test_copy.png", img);
return 0;
}
总结
本文介绍了OpenCV中图像读写的三个基础函数:imread
、imshow
和imwrite
。通过这些函数,我们可以方便地完成图像的读取、显示和保存操作。掌握这些基础技术是进行更高级图像处理任务的前提。希望本文能帮助读者更好地理解和使用OpenCV进行图像读写。