HighGUI图形用户界面
1. 图像的载入imread()函数
Mat imread(const string& filename, int flags=1 );
- 第一个参数,const string&类型的filename,填我们需要载入的图片路径名。
- 第二个参数,int类型的flags,为载入标识,它指定一个加载图像的颜色类型。
flags存在两种取值方式:
a) 枚举类型取值
- CV_LOAD_IMAGE_UNCHANGED= -1:这个标识在新版本中被废置了,忽略。
- CV_LOAD_IMAGE_GRAYSCALE= 0:如果取这个标识的话,始终将图像转换成灰度图。
- CV_LOAD_IMAGE_COLOR= 1:如果取这个标识的话,始终将图像转换成彩色图。
- CV_LOAD_IMAGE_ANYDEPTH= 2:如果取这个标识的话,若载入的图像的深度为16位或者32位,就返回对应深度的图像,否则,就转换为8位图像再返回。
- CV_LOAD_IMAGE_ANYCOLOR= 4
注:如果想要载入最真实的图像,选择CV_LOAD_IMAGE_ANYDEPTH |CV_LOAD_IMAGE_ANYCOLOR。
b) int整型取值
- flags >0返回一个3通道的彩色图像。
- flags =0返回灰度图像。
- flags <0返回包含Alpha通道的加载的图像。
2. 图像的显示imshow()函数
void imshow(const string& winname,InputArray mat);
- 第一个参数,const string&类型的winname,填需要显示的窗口标识名称。
- 第二个参数,InputArray类型的mat,填需要显示的图像。
imshow 函数用于在指定的窗口中显示图像。如果窗口是用CV_WINDOW_AUTOSIZE(默认值)标志创建的,那么显示图像原始大小。否则,将图像进行缩放以适合窗口。而imshow 函数缩放图像,取决于图像的深度:
- 如果载入的图像是8位无符号类型(8-bit unsigned),就显示图像本来的样子。
- 如果图像是16位无符号类型(16-bit unsigned)或32位整型(32-bit integer),便用像素值除以256。也就是说,值的范围是[0,255 x 256]映射到[0,255]。
- 如果图像是32位浮点型(32-bitfloating-point),像素值便要乘以255。也就是说,该值的范围是[0,1]映射到[0,255]。
3. 创建窗口namedWindow()函数
void namedWindow(conststring& winname,
int flags=WINDOW_AUTOSIZE);
- 第一个参数,const string&型的name,即填被用作窗口的标识符的窗口名称。
- 第二个参数,int 类型的flags,窗口的标识,可以填如下的值:
- WINDOW_NORMAL设置了这个值,用户便可以改变窗口的大小(没有限制)
- WINDOW_AUTOSIZE如果设置了这个值,窗口大小会自动调整以适应所显示的图像,并且不能手动改变窗口大小。
- WINDOW_OPENGL 如果设置了这个值的话,窗口创建的时候便会支持OpenGL。
我们可以调用destroyWindow()或者destroyAllWindows()函数来关闭窗口,并取消之前分配的与窗口相关的所有内存空间。但话是这样说,其实对于代码量不大的简单小程序来说,我们完全没有必要手动调用上述的destroyWindow()或者destroyAllWindows()函数,因为在退出时,所有的资源和应用程序的窗口会被操作系统会自动关闭。
4. 输出图像到文件imwrite()函数
bool imwrite(const string& filename,
InputArray img,
const vector<int>& params=vector<int>() );
- 第一个参数,const string&类型的filename,填需要写入的文件名就行了,带上后缀,比如,“123.jpg”这样。
- 第二个参数,InputArray类型的img,一般填一个Mat类型的图像数据就行了。
- 第三个参数,constvector<int>&类型的params,表示为特定格式保存的参数编码,它有默认值vector<int>(),所以一般情况下不需要填写。
5. 创建滑动条createTrackbar()函数
int createTrackbar(conststring&trackbarname,
conststring& winname,
int* value,
int count,
TrackbarCallback onChange=0,
void* userdata=0);
- 第一个参数,const string&类型的trackbarname,表示轨迹条的名字,用来代表我们创建的轨迹条。
- 第二个参数,const string&类型的winname,填窗口的名字,表示这个轨迹条会依附到哪个窗口上,即对应namedWindow()创建窗口时填的某一个窗口名。
- 第三个参数,int* 类型的value,一个指向整型的指针,表示滑块的位置。并且在创建时,滑块的初始位置就是该变量当前的值。
- 第四个参数,int类型的count,表示滑块可以达到的最大位置的值。PS:滑块最小的位置的值始终为0。
- 第五个参数,TrackbarCallback类型的onChange,首先注意他有默认值0。这是一个指向回调函数的指针,每次滑块位置改变时,这个函数都会进行回调。并且这个函数的原型必须为
voidXXXX(int,void*);
- 第一个参数是轨迹条的位置,
- 第二个参数是用户数据(看下面的第六个参数)。如果回调是NULL指针,表示没有回调函数的调用,仅第三个参数value有变化。
- 第六个参数,void*类型的userdata,他也有默认值0。这个参数是用户传给回调函数的数据,用来处理轨迹条事件。如果使用的第三个参数value实参是全局变量的话,完全可以不去管这个userdata参数。
获取当前轨迹条的位置函数
int getTrackbarPos(conststring& trackbarname, conststring& winname);
- 第一个参数,const string&类型的trackbarname,表示轨迹条的名字。
- 第二个参数,const string&类型的winname,表示轨迹条的父窗口的名称。
6. 鼠标操作setMouseCallback()函数
void setMousecallback(conststring& winname,
MouseCallback onMouse,
void* userdata=0)
- winname:窗口的名字
- onMouse:鼠标响应函数,回调函数。指定窗口里每次鼠标时间发生的时候,被调用的函数指针。这个函数的原型应该为void on_Mouse(int event, int x, int y, int flags,void* param);
- userdate:传给回调函数的参数
void on_Mouse(intevent, int x, int y, int flags, void* param);
- event是 CV_EVENT_*变量之一
- u CV_EVENT_MOUSEMOVE 0 //滑动
- u CV_EVENT_LBUTTONDOWN 1 //左键点击
- u CV_EVENT_RBUTTONDOWN 2 //右键点击
- u CV_EVENT_MBUTTONDOWN 3 //中键点击
- u CV_EVENT_LBUTTONUP 4 //左键放开
- u CV_EVENT_RBUTTONUP 5 //右键放开
- u CV_EVENT_MBUTTONUP 6 //中键放开
- u CV_EVENT_LBUTTONDBLCLK 7 //左键双击
- u CV_EVENT_RBUTTONDBLCLK 8 //右键双击
- u CV_EVENT_MBUTTONDBLCLK 9 //中键双击
- x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系)
- flags是CV_EVENT_FLAG的组合
- u CV_EVENT_FLAG_LBUTTON 1 //左鍵拖曳
- u CV_EVENT_FLAG_RBUTTON 2 //右鍵拖曳
- u CV_EVENT_FLAG_MBUTTON 4 //中鍵拖曳
- u CV_EVENT_FLAG_CTRLKEY 8 //(8~15)按Ctrl不放事件
- u CV_EVENT_FLAG_SHIFTKEY 16 //(16~31)按Shift不放事件
- u CV_EVENT_FLAG_ALTKEY 32 //(32~39)按Alt不放事件
- param是用户定义的传递到setMouseCallback函数调用的参数。