-
本篇博客的主要内容是对官方OpenCV教程的翻译、总结与理解,并记录自己在学习过程中的心得体会。
-
官方教程地址:https://docs.opencv.org/4.3.0/db/d64/tutorial_load_save_image.html
阅读这篇博客之前,需要先掌握a如何使用cv::imread来读取图像和使用cv::imshow来显示图像,这些内容在上一篇博客中都有提到。
目标
- 使用cv::imread方法加载图像。
- 使用cv::cvtColor方法将BGR色彩空间的图像转化为灰度图像。
- 使用cv::imwrite方法将转换后的图像保存到本地磁盘中。
源代码
#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
" );
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;
}
解释
先使用cv::imread方法加载图像,imageName存储的是从控制台输入的图像路径,在这个例子中,假设输入的图像的色彩空间为BGR。
将图像从BGR色彩空间转换到灰度格式,可以直接使用OpenCV提供的API方法来完成这个转换操作。
cvtColor( image, gray_image, COLOR_BGR2GRAY );
这个函数有三个参数:
- image是一个Mat对象,作为输入图像/原始图像(src)
- gray_image也是一个Mat对象,用来存储转换之后的灰度图像(dst)。
- 最后一个参数指定了转换发生在哪两种色彩空间之间,按照目标的要求,这里需要设置为COLOR_BGR2GRAY(使用cv::imread读取彩色图像时,BGR为默认通道顺序)。
因为这里使用了opencv2/opencv.hpp所以看不出来,cv::cvtColor方法属于opencv2/imgproc.hpp头文件,如果还是使用上一次的头文件这里会报错,提示找不到方法。
最后一个参数自OpenCV 4.0.0以来就由CV_BGR2GRAY改为了COLOR_BGR2GRAY。
我们现在有了一张新的灰度图像,如果关闭程序,内存将自动释放,这张灰度图像也会随之丢失,所以需要使用一个与cv::imread相似的方法——cv::imwrite方法,用来将灰度图像存储到本地磁盘中。
imwrite(“ ../../images/Gray_Image.jpg”,gray_image);
这句话能够将灰度图像保存在当前目录的二级父目录下的images文件夹中,文件名为Gray_Image.jpg。
最后我们需要看看图像是否被正确的转换了,创建两个窗口来显示原始图像和新图像。
namedWindow( imageName, WINDOW_AUTOSIZE );
namedWindow( "Gray image", WINDOW_AUTOSIZE );
imshow( imageName, image );
imshow( "Gray image", gray_image );
最后使用waitKey方法,让程序永久等待直到任一按键被按下。
结果
实现功能非常简单,不做演示了。
- 运行程序时,显示了一张彩色图像和一张灰度图像。
- 在对应的文件路径下,得到了存储的灰度图像。
END