官方文档链接:https://docs.opencv.org/4.2.0/db/d64/tutorial_load_save_image.html
Note
We assume that by now you know how to load an image using cv::imread and to display it in a window (using cv::imshow ). Read the Load and Display an Image tutorial otherwise.
通过之前的学习,已经学会了使用 cv::imread 加载图像以及使用 cv::imshow 在窗口中显示图像。
目标 (Goals)
In this tutorial you will learn how to:
-
Load an image using cv::imread
-
Transform an image from BGR to Grayscale format by using cv::cvtColor
-
Save your transformed image in a file on disk (using cv::imwrite )
-
使用 cv::imread 加载图像
-
使用 cv::cvtColor 将图片格式从 BGR 转换为灰度图像
-
使用 cv::imwrite 保存图像
代码 (Code)
#include <opencv2/opencv.hpp>
using namespace cv;
int main( int argc, char** argv )
{
char* imageName = argv[1];
Mat image;
image = imread( imageName, IMREAD_COLOR );
if( argc != 2 || !image.data )
{
printf( " No image data \n " );
return -1;
}
Mat gray_image;
cvtColor( image, gray_image, COLOR_BGR2GRAY );
imwrite( "../../images/Gray_Image.jpg", gray_image );
namedWindow( imageName, WINDOW_AUTOSIZE );
namedWindow( "Gray image", WINDOW_AUTOSIZE );
imshow( imageName, image );
imshow( "Gray image", gray_image );
waitKey(0);
return 0;
}
解释 (Explanation)
- 首先先使用 cv::imread 加载图像,具体图像保存了文件名的 imageName 指定,本次加载的是 BGR 图像。
注意:
在 VS 中指定 main 函数的传入参数需要在项目属性中设置,具体做法见此处。
- 下面将加载进来的 BGR 图像转换为灰度图像。OpenCV 定义了一个可以提供直接转换的函数:
cv::cvtColor(image, gray_image, cv::COLOR_BGR2GRAY);
如上所示,cv::cvtColor 需要如下参数:
- 源图像 (image)
- 目标图像 (gray_image),即用于存储转换后的图像的 Mat 变量
- 第三个参数用于指定转换类型。在这里使用的是 cv::COLOR_BGR2GRAY,因为对于彩色图像,使用 cv::imread 有 BGR 默认的通道顺序
- 转换后的灰度图像会在程序运行结束后被内存释放,可以通过函数 cv::imwrite 将图像文件保存起来。
cv::imwrite("../../images/Gray_Image.jpg", gray_image);
此语句将把灰度图像以名为 “gray_image.jpg” 的文件保存在当前位置的上上级文件夹 “images” 中。
- 然后,通过创建两个窗口来输出文件:
namedWindow( imageName, WINDOW_AUTOSIZE );
namedWindow( "Gray image", WINDOW_AUTOSIZE );
imshow( imageName, image );
imshow( "Gray image", gray_image );
- 最后,调用 cv::waitKey(0) 函数是程序永远等待用户按键。
结果 (Result)
运行程序后会得到如下图像结果:
打开文件夹,会看到生成了一个名为 “Gray_Image.jpg” 的新图像文件。