OpenCV图像的加载、显示
OpenCV图像的加载、显示
Mat类是OpenCV里使用广泛的一个类,使用它可以轻松的用几行代码实现图像的加载、显示。
先上代码:
// OpenCV_self.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
#include <opencv2\opencv.hpp>
int main()
{
cv::Mat img;
img = cv::imread("F:/openCV/images/juice.jpg"); // 读取图像
if (img.empty()) // 判断是否读取成功
{
std::cout << "导入图像失败!";
std::cin.get(); // 读取错误时,为了能在控制台dos窗口看到输出的信息,而不是一闪而过
return -1;
}
else
{
std::cout << "导入图像成功!";
}
cv::imshow("result", img); // 显示图像
cv::waitKey(0); // 一直显示图像直到摁下任意键
}
执行结果如下图所示:
imread函数
imread函数的主要作用从一个文件加载图像。
imread函数从一个指定文件读取图像,并返回一个Mat对象,如果图像不能被读取(可能文件路径不对,没有读取权限、不支持的图像格式、错误的图像格式等原因),函数返回一个空的矩阵( Mat::data==NULL )。我们可以用Mat类的empty()函数去判断是否读取到图像。
CV_EXPORTS_W Mat imread( const String& filename, int flags = IMREAD_COLOR );
-
参数1 filename, 读取的图片文件名。
-
参数2 flags, 一个读取标记,值从cv::ImreadModes获取,用于选择读取图片的方式,默认值为IMREAD_COLOR,flag值的设定与用什么颜色格式读取图片有关
-
返回值,Mat 对象, 返回读取的图像,
目前OpenCV4.4中支持的图像格式如下:
-
Windows bitmaps - *.bmp, *.dib (一直支持)
-
JPEG files - *.jpeg, *.jpg, *.jpe (详情见下面Note 部分)
-
JPEG 2000 files - *.jp2 (详情见下面Note 部分)
-
Portable Network Graphics - *.png (详情见下面Note 部分)
-
WebP - *.webp (详情见下面Note 部分)
-
Portable image format - *.pbm, *.pgm, *.ppm *.pxm, *.pnm (一直支持)
-
PFM files - *.pfm (详情见下面Note 部分)
-
Sun rasters - *.sr, *.ras (一直支持)
-
TIFF files - *.tiff, *.tif (详情见下面Note 部分)
-
OpenEXR Image files - *.exr (详情见下面Note 部分)
-
Radiance HDR - *.hdr, *.pic (一直支持)
-
Raster and Vector geospatial data supported by GDAL (详情见下面Note 部分)
@注意
-
函数是通过文件内容得到图像的格式,而不是文件的扩展名决定的,也就是说你把JPEG文件改成.png扩展名,读出来的还是JPEG文件类型。所以说修改文件后缀名来改变文件类型是错误的。
-
彩色图像数据,通道数据是以 B G R顺序存放的。.
-
使用IMREAD_GRAYSCALE时,其使用的是内建的灰度转换方式,如果可用的话,其输出结果可能与cvtColor()输出的结果不同。
-
在Microsoft Windows操作系统和苹果的 MacOS操作系统中, OpenCV 图像编解码默认使用(libjpeg,libpng, libtiff, and libjasper),所以在MacOSX中还有一个选择使用本地的MacOSX 图像阅读器,但是注意的是由于MacOSX内置的颜色管理,当前本地的图像加载器给出的是不同的像素值。
-
对于 Linux*, BSD flavors和其他类似于Unix的开源操作系统,OpenCV寻找系统提供的编码器,安装相关的包(开发包,例如, 在Debian*和 Ubuntu 中的"libjpeg-dev")来获得编码支持,或者在CMake中选中OPENCV_BUILD_3RDPARTY_LIBS标志,自己去编译这些开发包。
-
当你设置WITH_GDAL标志为true,并且使用 IMREAD_LOAD_GDAL去加载图像,GDAL驱动将会被使用去解码图像,支持以下格式:
-
如果图像文件包含EXIF信息, EXIF的 orientation (照片的方向)参数将会被考虑在内。图像可以根据这个参数对应的旋转。除非标志 IMREAD_IGNORE_ORIENTATION和 IMREAD_UNCHANGED被传递(大概是不让旋转)。
-
使用IMREAD_UNCHANGED标志来保持PFM图像的浮点值.
-
像素数缺省值必须小于,限制可以通过系统变量OPENCV_IO_MAX_IMAGE_PIXELS来设置。
imshow函数
imshow函数功能就是在指定的窗口显示一个图像。
函数原型:
CV_EXPORTS_W void imshow(const String& winname, InputArray mat);
-
参数1 winname 窗口名字.
-
参数2 mat 显示图像的Mat对象.
如果窗口创建时使用了cv::WINDOW_AUTOSIZE 标志,图像以他的原始大小显示, 但是他仍受屏幕分辨率的限制。 否则, 图像将会被按比例缩放去适应窗口。函数可以缩放图像,依赖图像的深度:
-
如果图像是8位无符号整型,显示的也是8位无符号整型。
-
如果图像是 16位无符号整型 或32位整型,像素数被256整除. 也就是说取值区间从 [0,255*256] 映射到 [0,255].
-
如果图像是32位或64位浮点数, 像素值会被乘以255. 也就是说值区间从 [0,1] 映射到 [0,255].
如果窗口创建时支持OpenGL , cv::imshow 也支持 ogl::Buffer , ogl::Texture2D 和cuda::GpuMat 作为输入。
如果窗口没有在使用本函数前创建,假定使用标志cv::WINDOW_AUTOSIZE创建窗口.
如果你需要显示一个图像大于屏幕的分辨率,你需要在imshow之前调用 namedWindow("", WINDOW_NORMAL) .
@注意
本函数后面应该跟着cv::waitKey 函数来显示指定毫秒数显示时间的图像,否则将不会显示图像,例如, waitKey(0) 将会一直显示显示图像直到摁下键盘任意键,(这个适合显示图像). waitKey(25) 将会显示一帧图像25 毫秒, 然后显示就会自动关闭. (如果你把他放到一个循环里去读视频,他将会一帧一帧的显示视频)。
@注意
[仅限Windows] 摁 Ctrl+C 组合键复制图像到剪切板.
[仅限Windows] 摁Ctrl+S 组合键将会显示一个对话框去保存图像。