关于cv::imread读取图片类型的初探

问题来源

在处理深度图的时候,在用 cv::imread 读取深度图像时,本以为得到的是单通道图,但实际是三通道图。所以仔细看了一下 cv::imread 函数。

环境

Ubuntu16
Opencv 4.0.0

首先生成单通道和三通道的png图片

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
int main(){
	cv::Mat mat1(480,480,CV_8UC3,cv::Scalar(255,128,0));
	cv::imshow("mat1",mat1);
	cv::Mat mat2(480,480,CV_8UC1,cv::Scalar(128));
	cv::imshow("mat2",mat2);
	cv::imwrite("mat1.png",mat1);
	cv::imwrite("mat2.png",mat2);
	cv::waitKey(0);
	return 1;
}

两张图片,一张三通道图片有颜色,一张单通道图片,无颜色。保存成PNG格式。文件大小分别为2.3KB和1.3KB。
在这里插入图片描述

cv::imread函数及其参数

Mat cv::imread (
	const String & filename, 
	int flags = IMREAD_COLOR 
)

enum cv::ImreadModes{
	IMREAD_UNCHANGED,			//-1   使图像保持原样输出  
	IMREAD_GRAYSCALE,			//0   把图像转成单通道的灰度图输出
	IMREAD_COLOR ,				//1	//把图像转成三通道的rgb图输出
	IMREAD_ANYDEPTH, 			//2   //If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.
	IMREAD_ANYCOLOR	,			//4   //以任何可能的颜色格式读取图像
	IMREAD_LOAD_GDAL, 			//8 	//use the gdal driver for loading the image
	IMREAD_REDUCED_GRAYSCALE_2,	//16	//输出单通道灰度图,并且将图像缩小为原来的1/2
	IMREAD_REDUCED_COLOR_2 ,	//17  //输出三通道的rgb图,并且缩小图像到原来的1/2
	IMREAD_REDUCED_GRAYSCALE_4, //32  //单通道  1/4
	IMREAD_REDUCED_COLOR_4 ,	//33	//三通道  1/4
	IMREAD_REDUCED_GRAYSCALE_8, //64	//单通道  1/8
	IMREAD_REDUCED_COLOR_8 ,	//65	//三通道  1/8
	IMREAD_IGNORE_ORIENTATION 	//128	//do not rotate the image according to EXIF's orientation flag. 
}

对我们有意义的有参数-1,0,1。
而参数IMREAD_COLOR 默认值为1。
下面是一些具体例子而已。

不同参数读取rgb图像

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace std;
int main(){
	cv::Mat mat1 = cv::imread("mat1.png");
	cout<<mat1.type()<<endl;
	cout<<mat1(cv::Range(0,3),cv::Range(0,3))<<endl;

	cv::Mat mat1_0 = cv::imread("mat1.png",0);
	cout<<mat1_0.type()<<endl;
	cout<<mat1_0(cv::Range(0,3),cv::Range(0,3))<<endl;

	cv::Mat mat1_1;
	cv::cvtColor(mat1,mat1_1,cv::COLOR_RGB2GRAY);
	cout<<mat1_1.type()<<endl;
	cout<<mat1_1(cv::Range(0,3),cv::Range(0,3))<<endl;

	return 1;
}

输出

16
[255, 128,   0, 255, 128,   0, 255, 128,   0;
 255, 128,   0, 255, 128,   0, 255, 128,   0;
 255, 128,   0, 255, 128,   0, 255, 128,   0]
0
[104, 104, 104;
 104, 104, 104;
 104, 104, 104]
0
[151, 151, 151;
 151, 151, 151;
 151, 151, 151]

单通道读取不等于直接把图像转为灰度图。

附 cv::Mat.type()

		C1 	C2 	C3 	C4 
CV_8U   0   8   16	24
CV_8S   1   9	17	25
CV_16U  2   10	18	26
CV_16S  3   11	19	27
CV_32S  4   12	20	28
CV_32F  5   13	21	29
CV_64F  6   14	22	30 

不同参数读取单通道图片

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace std;
int main(){

	cv::Mat mat2 = cv::imread("mat2.png");
	cout<<mat2.type()<<endl;
	cout<<mat2(cv::Range(0,3),cv::Range(0,3))<<endl;

	cv::Mat mat2_00 = cv::imread("mat2.png",-1);
	cout<<mat2_00.type()<<endl;
	cout<<mat2_00(cv::Range(0,3),cv::Range(0,3))<<endl;

	cv::Mat mat2_0 = cv::imread("mat2.png",0);
	cout<<mat2_0.type()<<endl;
	cout<<mat2_0(cv::Range(0,3),cv::Range(0,3))<<endl;

	cv::Mat mat2_1 = cv::imread("mat2.png",1);
	cout<<mat2_1.type()<<endl;
	cout<<mat2_1(cv::Range(0,3),cv::Range(0,3))<<endl;


	return 1;
}

输出:

16
[128, 128, 128, 128, 128, 128, 128, 128, 128;
 128, 128, 128, 128, 128, 128, 128, 128, 128;
 128, 128, 128, 128, 128, 128, 128, 128, 128]
0
[128, 128, 128;
 128, 128, 128;
 128, 128, 128]
0
[128, 128, 128;
 128, 128, 128;
 128, 128, 128]
16
[128, 128, 128, 128, 128, 128, 128, 128, 128;
 128, 128, 128, 128, 128, 128, 128, 128, 128;
 128, 128, 128, 128, 128, 128, 128, 128, 128]

参数-1和0是期望的输出。
参数1也按照预期进行了复制。
无参数时,参数并非默认-1 。

当我打出默认参数的时候,才注意到我只需要找到默认参数cv::IMREAD_COLOR(见“cv::imread函数及其参数”),而打印出来是1。

遇到的一些情况

以上笔者读取的是自己制作的图片,但在项目中碰到的一张深度图,如图
在这里插入图片描述
(在此显示不太清楚)
在-1参数下读取的type为2,也即是16UC1。
总结起来,在读取图像后,需要确认读取格式和自己预期是否相同。

<think>好的,用户问的是荣耀电脑强制开机的方法。首先,我需要确认用户所说的“强制开机”具体指的是什么情况。通常来说,用户可能遇到电脑无法正常启动的问题,想要通过强制开机来解决问题。不过,在电脑领域,“强制开机”这个术语并不是很标准,可能是用户对某些操作的俗称,比如强制重启、强制关机后再开机,或者是解决无法启动的问题的方法。 接下来,我需要考虑荣耀电脑的不同型号和设计。不同的笔记本型号可能在硬件设计上有细微差别,例如MagicBook系列可能有不同的电源管理方式。因此,回答时需要尽量覆盖通用方法,同时提醒用户注意型号差异。 然后,整理可能的解决方法。首先检查电源问题,比如电池是否有电,适配器是否工作正常。这是最常见的问题,尤其是当电脑完全无反应时。接着是长按电源键强制重启,这是一个通用方法,适用于大多数笔记本电脑,包括荣耀。另外,重置电源管理(EC复位)也是一个常见步骤,可以通过长按电源键或者特定的按键组合来操作。 接下来,可能需要进入BIOS或恢复模式,特别是当系统出现问题时。例如,反复按F2或F10进入BIOS,或者使用恢复选项。此外,如果用户的问题是由于系统崩溃导致的,可能需要更深入的系统恢复步骤,比如使用系统还原点或重装系统。 另外,需要考虑硬件问题,比如内存条接触不良或其他硬件故障。不过,这些步骤可能涉及拆机,对于普通用户来说有一定风险,所以需要谨慎建议,并提醒用户如果不懂操作最好寻求专业帮助。 在整理这些步骤时,需要按照逻辑顺序排列,从简单到复杂,从电源检查到系统恢复,再到可能的硬件问题。同时,注意事项部分也很重要,比如提醒用户备份数据,避免操作不当导致数据丢失,以及保修期内联系官方售后等。 另外,要确保回答符合用户可见层的指引,结构清晰,分步骤说明,帮助用户逐步排查问题。同时,要使用中文,避免使用专业术语过多,保持语言通俗易懂。还要注意LaTeX格式的正确使用,虽然在这个问题中可能不需要太多数学公式,但如果有涉及技术参数的地方需要正确应用格式。 最后,需要验证这些方法的正确性,确保信息准确可靠,比如长按电源键的时间通常是10-15秒,EC复位的具体步骤是否符合荣耀电脑的设计。如果有不确定的地方,建议用户查阅官方手册或联系客服,以避免误导用户。 总结来说,回答需要涵盖可能的故障原因、逐步排查的步骤、不同情况的解决方法以及注意事项,确保用户能够安全有效地尝试解决问题,同时了解何时需要专业帮助。</think>关于荣耀电脑无法正常开机时的强制启动或故障排查方法,以下是分步骤指导: --- ### 一、先确认基础问题 1. **检查电源状态** - 若为笔记本:确保电池电量充足,或连接原装充电器,观察电源指示灯是否亮起。 - 若为台式机:检查电源线连接、插座是否通电。 2. **排除外设干扰** - 拔掉所有外接设备(如U盘、扩展坞、显示器等),仅保留电源线,尝试开机。 --- ### 二、强制重启操作 1. **长按电源键强制关机** - 长按电源键 **10~15秒**,直到电源指示灯熄灭(强制释放残余电量)。 - 等待 **30秒** 后,短按电源键尝试正常开机。 2. **重置电源管理(EC复位)** - 适用于笔记本: - 断开充电器,长按电源键 **40秒以上**(彻底释放主板静电)。 - 重新连接充电器,按电源键开机。 --- ### 三、系统或硬件问题排查 1. **进入BIOS/恢复模式** - 开机时连续按 **F2** 或 **F10**(不同机型可能不同),尝试进入BIOS。 - 若可进入BIOS:说明硬件基本正常,问题可能出在系统或硬盘。 - 若无法进入BIOS:需考虑硬件故障。 2. **系统恢复操作** - 若系统崩溃: - 开机时按 **F9** 或 **F12**(部分机型支持)进入恢复模式。 - 选择“系统还原”或“恢复出厂设置”(注意:会删除用户数据)。 --- ### 四、硬件级处理(谨慎操作) 1. **内存条检测** - 关机后拆开后盖(需工具),拔出内存条,用橡皮擦清理金手指,重新安装。 2. **CMOS电池重置** - 主板上的纽扣电池(CR2032)断电 **5分钟**,重置BIOS设置(需拆机,建议专业人士操作)。 --- ### 五、注意事项 1. **数据安全** - 若硬盘中有重要数据,优先联系专业维修人员,避免操作失误导致数据丢失。 2. **保修政策** - 若设备在保修期内,建议联系荣耀官方售后(电话95030),避免自行拆机影响保修。 --- 通过以上步骤逐步排查,大部分非硬件故障的开机问题可得到解决。如仍无法启动,需送修专业维修点检测主板、电源模块等核心部件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值