个人资料,仅供学习使用
学习课程:OpenCV4 C++ 快速入门视频30讲——贾志刚
01 图像读取与显示
opencv知识点:
- 图像存储 - Mat
- 读取图像 - imread()
- 显示图像 - imshow()
- 等待键 - waitKey()
- 销毁所有窗口 - destroyAllWindows()
本课解决的问题:
- 如何加载为灰度图像?
- 如何加载其他情况下的图片?
- 如何使窗口可调大小?
- 如何判断是否读取图像成功?
- 为什么检查图像深度会为1?
1.代码解释
代码解释
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src = imread("D:/Workspace/VS-Project/OpenCV/images/lena.png");
/*
Mat
读进来的图像以矩阵的方式存储
imread()
读取图像
共2个参数
第1个参数 图片路径
第2个参数 色彩标志(默认为1,即彩色图像)
*/
imshow("input", src);
/*
imshow
显示图像
共2个参数
第1个参数 窗口名称
第2个参数 输出对象
*/
waitKey(0);
/*
waitKey
等待键
共1个参数
第1个参数 等待时间(ms)规定0为永远
*/
destroyAllWindows();
/*
destroyAllwindows
销毁所有窗口
无参数
*/
return 0;
}
2.imread()用法
彩色图像
imread
方式加载进来的图像,都会变成“彩色图像”
图像路径后面还有一个带缺省值的参数IMREAD_COLOR = 1
,即加载时总是转化图片为3通道BGR图像
灰度图像
如果我们想显示一张灰度图片,那该怎么办?
我们选择IMREAD_GRAYSCALE
,即可加载成灰度图像
其他情况
透明信息
实际上图像颜色有很多种,比如4通道的图像(BGR+透明通道)。
当png图片有透明通道时,透明通道也是要加载的,怎么办呢?
这时候要选择IMREAD_UNCHANGED
这种方式,这样通道数加载进来便不会被改变
色彩格式/数据类型
比如HSV色彩的图像,浮点数据类型的图像,就要选择如下的格式
IMREAD_ANYCOLOR
- 如hsv色彩的图IMREAD_ANYDEPTH
- 如图像是16位,32位等的时候
3.imshow()用法
当使用imshow
时,默认方式是WINDOW_AUTOSIZE
,产生窗口大小和图像匹配,但无法更改。
所以会遇到这样的问题:图像大,窗口也大,就会超出物理屏幕,该怎么办呢?
这时候我们创建namedWindow
窗口并指定为WINDOW_FREERATIO
或WINDOW_NORMAL
,就可以调整窗口了
imshow的显示问题
要注意的是,imshow显示图像时是不支持透明通道的。
即使我们imread时设置了IMREAD_UNCHANGED
,imshow也无法显示透明的信息,会显示成变成黑色/白色
4.图像判空操作
通常情况下,再读取图像后都会增加一个判空操作,如下所示
当没有判空操作时,有错就会提示一种断言式空,一般是图片路径的问题
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
//路径要根据自己的图片而定
Mat src = imread("D:/Workspace/VS-Project/OpenCV/images/lena.png000",IMREAD_GRAYSCALE);
if (src.empty()) {
printf("could not load image……\n");
return -1;
}
namedWindow("输入窗口", WINDOW_FREERATIO);
imshow("输入窗口", src);
waitKey(0);
destroyAllWindows();
return 0;
}
补充知识
图像深度为“1”的解释
首先介绍一下什么是图像深度(image depth)
比如imread加载进来的图片是3通道的,每个通道1个字节(8bit),3*8=24位,图像深度就是24。
在opencv中,call API src.depth()
检查深度时,不会直接告诉你24位。
因为24位在opencv中只是一个深度的表示,opencv用一个枚举类型来表示它,这个枚举类型的值可能是1。
所以有的时候,检查深度时得到1也不要诧异。
还有,获取某些其他属性时也会出现这种情况,因为opencv规定了很多的枚举数值。
本课所用API查阅
imread()
imshow()
namedWindow()
waitKey()
destroyAllWindows()