opencv--基本常用函数【1】

加载图像

  • 函数原型

    imread()
    Mat cv :: imread(const String& 	文件名,   //要加载的文件的名称
    					INT flags =IMREAD_COLOR   //可以采用cv :: ImreadModes值的标志
  • 功能
    从文件加载图像。
    函数imread从指定文件加载图像并返回它。如果无法读取图像(由于文件丢失,权限不正确,格式不受支持或无效),该函数返回一个空矩阵(Mat :: data == NULL)。

  • 目前,支持以下文件格式:

    1. Windows位图 - * .bmp,* .dib(始终支持)
    2. JPEG文件 - * .jpeg,* .jpg,*。jpe(参见“ 注释”部分)
    3. JPEG 2000文件 - * .jp2(参见注释部分)
    4. 便携式网络图形 - * .png(参见“ 注释”部分)
    5. WebP - * .webp(参见Notes部分)
    6. 便携式图像格式 - * .pbm,* .pgm,* .ppm * .pxm,* .pnm(始终支持)
    7. 太阳栅格 - * .sr,* .ras(始终支持)
    8. TIFF文件 - * .tiff,* .tif(参见注释部分)
    9. OpenEXR图像文件 - * .exr(参见注释部分)
    10. Radiance HDR - * .hdr,* .pic(始终支持)
    11. Gdal支持的栅格和矢量地理空间数据
  • 注意

    1. 该函数通过内容而不是文件扩展名确定图像的类型
    2. 在彩色图像的情况下,解码图像将具有以BGR顺序存储的通道。
    3. 在Microsoft Windows * OS和MacOSX *上,默认使用随OpenCV映像(libjpeg,libpng,libtiff和libjasper)附带的编解码器。因此,OpenCV始终可以读取JPEG,PNG和TIFF。在MacOSX上,还可以选择使用本机MacOSX图像阅读器。但请注意,由于MacOSX中嵌入了色彩管理,目前这些原生图像加载器会为图像提供不同的像素值。
    4. 在Linux ,BSD风格和其他类似Unix的开源操作系统上,OpenCV寻找随操作系统映像提供的编解码器。安装相关软件包(不要忘记开发文件,例如,“Debian *和Ubuntu *中的”libjpeg-dev“)以获得编解码器支持或打开CMake中的OPENCV_BUILD_3RDPARTY_LIBS标志。
    5. 如果您在CMake和IMREAD_LOAD_GDAL中将WITH_GDAL标志设置为true 以加载图像,则将使用GDAL驱动程序以通过支持以下格式来解码图像:Raster,Vector。
    6. 如果EXIF信息嵌入在图像文件中,则将考虑EXIF方向,因此除非传递IMREAD_IGNORE_ORIENTATION标志,否则图像将相应地旋转。

创建一个命名的OpenCV窗口

  • 函数原型
    namedWindow()
    void cv :: namedWindow(const String& 	winname,//窗口标题中窗口的名称,可用作窗口标识符
    						INT flags =WINDOW_AUTOSIZE //窗户的标志。支持的标志是;(cv :: WindowFlags)
  • 功能
    创建一个窗口。
  1. 名为Window的函数创建了一个窗口,可用作图像和轨迹栏的占位符。创建的窗口由其名称引用。
  2. 如果已存在具有相同名称的窗口,则该函数不执行任何操作。
  3. 您可以调用cv :: destroyWindow或cv :: destroyAllWindows来关闭窗口并取消分配任何相关的内存使用情况。对于一个简单的程序,您实际上不必调用这些函数,因为退出时操作系统会自动关闭应用程序的所有资源和窗口。

在OpenCV窗口中显示图像

  • 函数原型

    imshow()
    void cv :: imshow(const String& 	winname, //窗口名称
    					InputArray 	mat           //要显示的图像
  • 功能
    在指定的窗口中显示图像。

    1. 如果窗口是使用cv :: WINDOW_AUTOSIZE标志创建的,则图像将以原始大小显示,但仍然受到屏幕分辨率的限制。
    2. 否则,缩放图像以适合窗口。

    该功能可能会缩放图像,具体取决于其深度:

    1. 如果图像是8位无符号,则按原样显示。
    2. 如果图像是16位无符号或32位整数,则像素除以256.即值范围[0,255 * 256]被映射到[0,255]。
    3. 如果图像是32位或64位浮点,则像素值乘以255.即值范围[0,1]映射到[0,255]。
    4. 如果窗口是使用OpenGL支持创建的,cv :: imshow也支持ogl :: Buffer,ogl::Texture2D和cuda :: GpuMat作为输入。
  • 注意
    如果在此函数之前未创建窗口,则假定使用cv :: WINDOW_AUTOSIZE创建窗口
    如果需要显示大于屏幕分辨率的图像,则需要在imshow之前调用namedWindow(“”,WINDOW_NORMAL)。

    此函数后面应跟有cv :: waitKey函数,该函数显示指定毫秒的图像。否则,它将不显示图像。

    1. waitKey(0)将无限显示窗口,直到任何按键(适用于图像显示)
    2. waitKey(25)将显示一个25毫秒的帧,之后显示将自动关闭。(如果你把它放在一个循环中来阅读视频,它将逐帧显示视频)

将图像从BGR转换为灰度格式

  • 函数原型

    cvtColor()
    void cv :: cvtColor	(	InputArray 	src,    //输入图像:8位无符号,16位无符号(CV_16UC ...)或单精度浮点
    						OutputArray 	dst,//	输出与src相同大小和深度的图像
    						INT 	code,       //颜色空间转换代码
    						INT 	dstCn =0    //目标图像中的通道数; 如果参数为0,则从src和代码自动导出通道数
  • 功能
    将图像从一个颜色空间转换为另一个颜色空间。

    该函数将输入图像从一个颜色空间转换为另一个颜色空间。在从RGB颜色空间转换到的情况下,应明确指定通道的顺序(RGB或BGR)。请注意,OpenCV中的默认颜色格式通常称为RGB,但它实际上是BGR(字节相反)。因此,标准(24位)彩色图像中的第一个字节将是8位蓝色分量,第二个字节将为绿色,第三个字节将为红色。然后第四个,第五个和第六个字节将是第二个像素(蓝色,然后是绿色,然后是红色),依此类推。

  • R,G和B通道值的常规范围是:
    CV_8U图像为0到255
    CV_16U图像为0到65535
    CV_32F图像为0到1

    在线性变换的情况下,范围无关紧要。
    但是在非线性变换的情况下,应将输入RGB图像归一化到适当的值范围以获得正确的结果,例如,对于RGB L * u * v *变换。
    例如,如果您有一个32位浮点图像直接从8位图像转换而没有任何缩放,那么它将具有0…255值范围而不是函数假定的0…1。因此,在调用cvtColor之前,首先需要缩小图像:
    img * = 1./255;
    cvtColor(img,img,COLOR_BGR2Luv);

  • 注意
    如果将cvtColor与8位图像一起使用,转换将丢失一些信息。对于许多应用程序,这不会引人注意,但建议在需要全范围颜色的应用程序中使用32位图像,或者在操作之前转换图像然后转换回来。

    如果转换添加了alpha通道,则其值将设置为相应通道范围的最大值:CV_8U为255,CV_16U为65535,CV_32F为1。

将转换后的图像保存在磁盘上的文件中

  • 函数原型

    imwrite()
    bool cv :: imwrite(const String&  filename,  //文件名。
    					InputArray 	img, //要保存的图片
    					const std :: vector <int>&params =std::vector< int >()  //特定格式的参数编码
  • 功能
    将图像保存到指定的文件。
    函数imwrite将图像保存到指定的文件。基于文件扩展名选择图像格式(有关扩展名列表,请参阅cv :: imread)
    使用此功能时,只能保存8位(或PNG,JPEG 2000和TIFF情况下的16位无符号(CV_16U))单通道或3通道(带’BGR’通道顺序)图像。

    如果格式,深度或通道顺序不同,请使用Mat :: convertTo和cv :: cvtColor在保存之前进行转换。或者,使用通用FileStorage I / O函数将图像保存为XML或YAML格式。

    使用此功能可以使用Alpha通道存储PNG图像。为此,创建8位(或16位)4通道图像BGRA,其中alpha通道最后。完全透明的像素应将alpha设置为0,完全不透明的像素应将alpha设置为255/65535。

实例:

#include"opencv2/opencv.hpp"
using namespace cv;
int main() {
	Mat pic1,pic2;
	pic1 = imread("D:/2.jpg", IMREAD_GRAYSCALE);//加载灰度图片
	pic2 = imread("D:/2.jpg", IMREAD_COLOR);    //加载彩色图片
	
	namedWindow("pic1", WINDOW_AUTOSIZE);//不可以手动更改窗口的大小
	imshow("pic1", pic1);
	
    namedWindow("pic2",WINDOW_NORMAL);   //可以手动更改窗口的大小
	//imshow("pic2", pic2);

	Mat pic11,pic111, pic22;
	
	cvtColor(pic2, pic11, CV_BGR2GRAY);//转化成灰色图片
	imwrite("D:/test/pic11.png", pic11);
	//imshow("pic2", pic11);

	//HSL 表示 hue(色相)、lightness(亮度)、saturation(饱和度)
	cvtColor(pic2, pic111, CV_BGR2HLS);
	//imshow("pic2", pic111);
	imwrite("D:/test/pic111.jpg", pic111);
	
	//HSV 表示 hue(色相)、saturation(饱和度)、value(色调) 
	cvtColor(pic2, pic22, CV_BGR2HSV);//原图不可以是灰色图像
	imshow("pic2", pic22);
	imwrite("D:/test/pic2.jpg", pic22);
	
	waitKey(0);
    return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41498261/article/details/83830499