【个人笔记】01 图像读取与显示

个人资料,仅供学习使用
学习课程: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_FREERATIOWINDOW_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查阅

OpenCV 4.6.0 官方文档

imread()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

imshow()

在这里插入图片描述
在这里插入图片描述

namedWindow()

在这里插入图片描述
在这里插入图片描述

waitKey()

在这里插入图片描述
在这里插入图片描述

destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啦啦啦大赛第大所

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值