OpenCV4.5.5学习笔记(五):图像的载入、显示和输出的学习(imread,imshow,namedwindow,imwrite,createTrackbar与SetMouseCallback)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

笔者本科时候有幸接触了OpenCV3.2.0版本的学习,后因考研压力不得不暂时停下学习的脚步,现在考研任务结束了,未来的导师也是从事的该方向,笔者又开始了新一轮的学习。回来发现OpenCV已经出到了4.5.5版本,遂重新下载新版本并决定记录这一学习历程。由于笔者水平有限,可能有错误之处还请诸位大佬多多包涵并烦请指出,让我们一起学习,共同进步。
首先需要说明的是:我是按着毛星云前辈编写的OpenCV3编程入门进行学习的,我会尽力把星云前辈的程序转成符合OpenCV4.5.5版本的。毛星云前辈于2021年12月11日不幸过世,他是我非常敬仰的一位业内大佬,我也是看他的书才开始接触OpenCV。


一、图像的载入:imread()函数

这个函数的作用是从文件中加载图像
在OpenCV官方文档中是这么写的:
Mat cv::imread ( const String & filename,
int flags = IMREAD_COLOR
)
Python:
cv.imread( filename[, flags] ) -> retval

函数 imread()从指定文件加载图像并返回。如果无法读取图像(由于缺少文件、权限不正确、格式不受支持或无效),则该函数返回一个空矩阵(Mat::data ==NULL )。
第一个参数填我们需要载入的图片路径名。 目前,支持以下文件格式:
Windows 位图 - .bmp、.dib(始终支持)
JPEG 文件 - .jpeg、.jpg、*.jpe
JPEG 2000 文件 - *.jp2
便携式网络图形 - *.png
WebP - .webp
便携式图像格式 - .pbm、.pgm、
.ppm .pxm、.pnm(始终支持)
PFM 文件 - *.pfm
Sun rasters - .sr、.ras(始终支持)
TIFF 文件 - .tiff、.tif
OpenEXR 图像文件 - *.exr
Radiance HDR - .hdr、.pic(始终支持)
GDAL 支持的栅格和矢量地理空间数据
第二个参数填载入标识。即加载图像的颜色类型:
IMREAD_COLOR:如果设置,则始终将图像转换为 3 通道 BGR 彩色图像。
这里与星云前辈在书中写的有略微不同(版本问题),曾经版本第二个参数默认值自带为1,现在默认是IMREAD_COLOR


二、图像的显示:imshow()函数

这个函数的作用是用于指定窗口显示一幅图像
在OpenCV官方文档中是这么写的:
void cv::imshow ( const String & winname,
InputArray mat
)
Python:
cv.imshow( winname, mat ) -> None

函数 imshow 在指定的窗口中显示图像。如果窗口是使用cv::WINDOW_AUTOSIZE标志创建的,则图像以其原始大小显示,但仍受屏幕分辨率的限制。否则,将缩放图像以适合窗口。该函数可以缩放图像,具体取决于其深度:
如果图像是 8 位无符号的,则按原样显示。
如果图像是 16 位无符号的,则像素除以 256。即取值范围 [0,255*256] 映射到 [0,255]。
如果图像是 32 位或 64 位浮点,则像素值乘以 255。即值范围 [0,1] 映射到 [0,255]。
由于所需变换的模糊性,不再处理 32 位整数图像。使用特定于图像上下文的自定义预处理转换为 8 位无符号矩阵。
如果使用 OpenGL 支持创建窗口,则cv::imshow也支持ogl::Buffer、ogl::Texture2D和cuda::GpuMat作为输入。
如果在此函数之前没有创建窗口,则假定使用cv::WINDOW_AUTOSIZE创建一个窗口。
如果需要显示大于屏幕分辨率的图像,则需要在 imshow 之前调用 namedWindow("", WINDOW_NORMAL)。
第一个参数填是窗口的名称第二个参数填显示图像的名称


三、创建窗口:namedwindow()函数

这个函数的作用是用于创建一个窗口
在OpenCV官方文档中是这么写的:
void cv::namedWindow ( const String & winname,
int flags = WINDOW_AUTOSIZE
)
Python:
cv.namedWindow( winname[, flags] ) -> None

namedWindow 函数创建一个窗口,可以用作图像和轨迹栏的占位符。创建的窗口由它们的名称引用。
如果已存在同名窗口,则该函数不执行任何操作。
您可以调用cv::destroyWindow或cv::destroyAllWindows来关闭窗口并取消分配任何相关的内存使用。对于一个简单的程序,您实际上不必调用这些函数,因为应用程序的所有资源和窗口在退出时都会由操作系统自动关闭。
第一个参数填窗口标题中的窗口名称
第二个参数填窗口的标志,默认为WINDOW_AUTOSIZE ,支持的标志是:(cv::WindowFlags),下面是这个标志的说明:

标志名称 作用
WINDOW_NORMAL 用户可以调整窗口大小(无约束)/也用于将全屏窗口切换到正常大小
WINDOW_AUTOSIZE 用户无法调整窗口大小,大小受显示图像的限制
WINDOW_OPENGL 支持OpenGL的窗口
WINDOW_FULLSCREEN 将窗口更改为全屏
WINDOW_FREERATIO 图像尽可能多地消耗(无比例限制)
WINDOW_KEEPRATIO 图像的比例无变化
WINDOW_GUI_EXPANDED 状态栏和工具栏
WINDOW_GUI_NORMAL 旧版本(好像是)

四、输出图像到文件:imwrite()函数

这个函数的作用是将图像保存到指定文件
在OpenCV官方文档中是这么写的:
bool cv::imwrite ( const String & filename,
InputArray img,
const std::vector< int > & params = std::vector< int >()
)
Python:
cv.imwrite( filename, img[, params] ) -> retval

函数 imwrite 将图像保存到指定文件。图像格式是根据文件扩展名选择的(有关扩展名列表,请参阅cv::imread)。通常,使用此功能只能保存 8 位单通道或 3 通道(具有“BGR”通道顺序)图像,但以下情况除外:
在 PNG、JPEG 2000 和 TIFF 格式的情况下,可以保存 16 位无符号 (CV_16U) 图像
32 位浮点 (CV_32F) 图像可以保存为 PFM、TIFF、OpenEXR 和 Radiance HDR 格式;3 通道 (CV_32FC3) TIFF 图像将使用 LogLuv 高动态范围编码(每像素 4 字节)保存
使用此功能可以保存带有 Alpha 通道的 PNG 图像。为此,请创建 8 位(或 16 位)4 通道图像 BGRA,Alpha 通道位于最后。完全透明的像素应该将 alpha 设置为 0,完全不透明的像素应该将 alpha 设置为 255/65535
可以以 TIFF 格式保存多个图像
如果不支持图像格式,图像将被转换为 8 位无符号 (CV_8U) 并以这种方式保存。
第一个参数是目标文件的名称第二个参数是要保存的图像或图像第三个参数是以特定格式保存的参数编码


五、创建滑动条:createTrackbar()函数

这个函数的作用是用于创建一个轨迹栏并将其附加到指定的窗口
在OpenCV官方文档中是这么写的:
int cv::createTrackbar ( const String & trackbarname,
const String & winname,
int * value,
int count,
TrackbarCallback onChange = 0,
void * userdata = 0
)

函数 createTrackbar 创建具有指定名称和范围的轨迹条(滑块或范围控件),将变量值分配为与轨迹条同步的位置,并指定在轨迹条位置变化时调用的回调函数onChange。创建的轨迹栏显示在指定的窗口中。
第一个参数是创建的轨迹栏的名称
第二个参数是将用作已创建轨迹栏的父级的窗口的名称
第三个参数是指向一个整数变量的可选指针,其值反映了滑块的位置
第四个参数是滑块的最大位置。最小位置始终为 0
第五个参数是指向每次滑块改变位置时要调用的函数的指针
第六个参数是按原样传递给回调的用户数据


六、鼠标的操作:SetMouseCallback()函数

这个函数的作用是设置指定窗口的鼠标处理程序
在OpenCV官方文档中是这么写的:
void cv::setMouseCallback ( const String & winname,
MouseCallback onMouse,
void * userdata = 0
)

第一个参数是窗口的名称
第二个参数是鼠标事件的回调函数
第三个参数是传递给回调的可选参数


总结

今天学习了六个常用的基本函数,也是OpenCV中最常用的几个函数之一

猜你喜欢

转载自blog.csdn.net/qq_43264167/article/details/124228566