从0开始学习opencv(二)-highGui初步
HighGui界面初步
图像的载入
imread函数,用在读取图像到Mat矩阵,可以看下官方注释
- 这个函数从指定文件加载图片返回,如果图片无法读取,就会返回空矩阵(Mat::data == null),支持如下格式
- windows位图,*.bmp, *.dib
- JPEG文件,*.jpeg, *.jpg, *.jpe
- JPEG2000文件,*.jp2
- 便携式文件格式,*.pbm, *.pgm, *.ppm *.pxm, *.pnm
- Sun rasters光栅文件,*.sr, *.ras
- TIFF文件,*.tiff, *.tif
- OpenEXR图片文件,*.exr
- HDR文件,*.hdr, *.pic
- 栅格和矢量地理空间数据
- 第二个参数,载入标识,指定一个加载图片的颜色类型,自带的默认值为1。也就是三通道BGR。
- flag>0 返回一个三通道的彩色图像
- flag=0 返回灰度图像
- flag<0 返回包含alpha通道加载图像
1 | enum ImreadModes { |
1 |
|
1 | Mat img = imread("a.jpg", 2 | 4); //载入无损源图像 |
图像的显示
imshow函数,用在指定界面显示图像
- 如果窗口使用cv::WINDOW_AUTOSIZE创建,会显示原始大小(还是会受限屏幕),否则会将图片缩放适合窗口。缩放图像取决于深度:
- 8位无符号,显示图像原来样子
- 16位无符号或32位整型,用像素值除以256,值在 [0,255]
- 如果图像是32位或64位浮点型,像素乘以255,[0,1] 映射到[0,255]
- 如果窗口创建,设定了支持openGL,imshow 还支持 ogl::Buffer , ogl::Texture2D 和
cuda::GpuMat 作为输入. - 如果你需要显示图像大于屏幕,在imshow前需要调用namedWindow(“”, WINDOW_NORMAL).
1 |
|
InputArray类型
1 | typedef const _InputArray& InputArray; |
_InputArray在core.hpp头文件里面
1 | //////////////////////// Input/Output Array Arguments ///////////////////////////////// |
- 如果你看到使用InputArray,可以当成
Mat
,Matx
,vector<T>
等
创建窗口namedWindow()函数
上面说过,简单显示不需要调用,如果需要用到窗口则需要用到.
- 如果窗口名已经存在,则不做任何处理
- 调用 cv::destroyWindow 或 cv::destroyAllWindows 关闭窗口 释放内存空间。如果是简单程序,退出时,资源会被系统释放掉
1 | /** @brief Creates a window. |
- 第二个参数flags,窗口标识
- WINDOW_NORMAL,用户可以改变窗口大小
- WINDOW_AUTOSIZE,窗口自动适应显示图像,无法手动改变
- WINDOW_OPENGL, 支持openGL
- WINDOW_FULLSCREEN, 全屏
1 | //! Flags for cv::namedWindow |
输出图像到文件:imwrite()
函数会写入到指定文件,图像格式基于拓展名。只有8位单通道或者3通道BGR图像可以使用这个函数写入,
16位无符号图像可以保存PNG, JPEG 2000, and TIFF 格式
32位浮点可以保存TIFF, OpenEXR, and Radiance HDR格式;3通道TIFF图像可以使用LogLuv高动态范围编码(每像素4字节)保存
可以保存带有alpha通道的PNG图像。8或16位的4通道BGRA图像(最后一个通道是alpha通道)。把alpha设置为0就是透明像素,完全不透明像素应将alpha设置为255/65535
如果格式、通道、深度不同,用Mat::convertTo 和 cv::cvtColor转换或者使用通用文件存储I/O
函数将图像保存为XML或YAML格式
1 | /** @brief Saves an image to a specified file. |
- 第一个参数filename,文件名需要带拓展名
- 第二个参数输入一个矩阵Mat
- 第三个参数是为特定格式保存的参数编码。有默认值,一般不需要填。
- JPEG格式图片,这个参数0-100(CV_IMWRITE_JPEG_QUALITY),默认95
- PNG格式,压缩级别0-9(CV_IMWRITE_PNG_COMPRESSION),数值越大表明更小尺寸更长压缩时间,默认3
- PPM,PGM或PBM,表示二进制格式标示(CV_IMWRITE_PXM_BINARY),参数0-1,默认1
1 | enum |
滑动条创建和使用
创建滑动条,这个函数通过指定名字和范围来创建一个滑动条。
- 第一个参数trackbarname,滑动条名字
- 第二个参数winname,滑动条要依附的窗口名
- 第三个参数value,指针,表示滑块的位置
- 第四个参数count,表示滑块可以到达的最大位置
- 第五个参数onChange,指向回调函数的指针,每次滑块改变位置都会回调该函数
- 第一个参数是滑块条的位置
- 第二个参数是用户数据
1
2
3
4
5/** @brief Callback function for Trackbar see cv::createTrackbar
@param pos current position of the specified trackbar.
@param userdata The optional parameter.
*/
typedef void (*TrackbarCallback)(int pos, void* userdata);- 用户数据指针将会被传递到滑块回调函数
1 | /** @brief Creates a trackbar and attaches it to the specified window. |
- 获取当前滑动条位置.
- 第一个参数指定要获取的滑动条名
- 第二个参数指定滑块归属的窗口名
1 | /** @brief Returns the trackbar position. |
鼠标操作。
1
2
3
4
5
6
7/** @brief Sets mouse handler for the specified window
@param winname Name of the window.
@param onMouse Callback function for mouse events. See OpenCV samples on how to specify and use the callback.
@param userdata The optional parameter passed to the callback.
*/
CV_EXPORTS void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0);第一个参数,窗口名
第二个参数onMouse,鼠标事件回调函数
- 事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15//! Mouse Events see cv::MouseCallback
enum MouseEventTypes {
EVENT_MOUSEMOVE = 0, //!< indicates that the mouse pointer has moved over the window.
EVENT_LBUTTONDOWN = 1, //!< indicates that the left mouse button is pressed.
EVENT_RBUTTONDOWN = 2, //!< indicates that the right mouse button is pressed.
EVENT_MBUTTONDOWN = 3, //!< indicates that the middle mouse button is pressed.
EVENT_LBUTTONUP = 4, //!< indicates that left mouse button is released.
EVENT_RBUTTONUP = 5, //!< indicates that right mouse button is released.
EVENT_MBUTTONUP = 6, //!< indicates that middle mouse button is released.
EVENT_LBUTTONDBLCLK = 7, //!< indicates that left mouse button is double clicked.
EVENT_RBUTTONDBLCLK = 8, //!< indicates that right mouse button is double clicked.
EVENT_MBUTTONDBLCLK = 9, //!< indicates that middle mouse button is double clicked.
EVENT_MOUSEWHEEL = 10,//!< positive and negative values mean forward and backward scrolling, respectively.
EVENT_MOUSEHWHEEL = 11 //!< positive and negative values mean right and left scrolling, respectively.
};1
2
3
4
5
6
7
8
9//! Mouse Event Flags see cv::MouseCallback
enum MouseEventFlags {
EVENT_FLAG_LBUTTON = 1, //!< indicates that the left mouse button is down.
EVENT_FLAG_RBUTTON = 2, //!< indicates that the right mouse button is down.
EVENT_FLAG_MBUTTON = 4, //!< indicates that the middle mouse button is down.
EVENT_FLAG_CTRLKEY = 8, //!< indicates that CTRL Key is pressed.
EVENT_FLAG_SHIFTKEY = 16,//!< indicates that SHIFT Key is pressed.
EVENT_FLAG_ALTKEY = 32 //!< indicates that ALT Key is pressed.
};
1
2
3
4
5
6
7
8
9/** @brief Callback function for mouse events. see cv::setMouseCallback
@param event one of the cv::MouseEventTypes constants.
@param x The x-coordinate of the mouse event.
@param y The y-coordinate of the mouse event.
@param flags one of the cv::MouseEventFlags constants.
@param userdata The optional parameter.
*/
typedef void (*MouseCallback)(int event, int x, int y, int flags, void* userdata);- 第三个参数是传递给回调的用户数据指针