鼠标和键盘
下面是使用鼠标绘制矩形的过程
用鼠标绘制矩形。
在这个例子中,鼠标左键被按下,记录起始点(矩形),当鼠标左键被释放后,在起始点和时放点之间绘制一个矩形,如果按下Esc键,则结束程序的运行。
程序代码如下:
#include "opencv2/opencv.hpp"
#include "iostream"
#include "opencv2/highgui/highgui_c.h"
using namespace std;
using namespace cv;
Point pt;
void OnMouse(int event,int x,int y,int flags,void* param)
{
//将param强制转换为Mat指针,*(Mat*)=Mat,就如*(int*)=int一样
Mat img=*(Mat*)param;
switch(event)
{
case CV_EVENT_LBUTTONDOWN://鼠标左键被按下
pt.x=x;
pt.y=y;
break;
case CV_EVENT_LBUTTONUP://鼠标左键被释放
rectangle(img,pt,Point(x,y),Scalar(0,255,0),2,8);//画矩形
break;
default:
break;
}
}
int main(void)
{
Mat img(500,500,CV_8UC3,Scalar(255,255,255));
//创建图像并指定宽、高格式,Scalar设置为白色
namedWindow("mouse",CV_WINDOW_AUTOSIZE);//创建窗口mouse
setMouseCallback("mouse",OnMouse,&img);
//在窗口mouse中加载鼠标事件,并传入img的地址
while(1)
{
imshow("mouse",img);//在窗口mouse中显示绘制的图像
char c=(char)waitKey(10);
if(27==c)//每隔10ms检查Esc键是否被按下
break;//如果Esc键被按下,则结束循环
else
printf("Other Operation\n");
}
return 0;
}
滑动条
OpenCv中的滑动是一种图形化控件,通过鼠标拖动,可以选择需要的取值。下面通过滑动条来实现图像的缩放。
例1-9:利用滑动条实现图像缩放。
在这个例子中,通过滑动条选择不同的值,可以分别对图像进行20%,40%,60%,80%,100%比例的缩放。
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/types_c.h>
#include <opencv2/highgui/highgui_c.h>
using namespace std;
using namespace cv;
int val=1;
Mat srclmage,dstlmage;
void back(int,void*)
{
Size dsize = Size(srclmage.cols*val/5,srclmage.rows*val/5);
dstlmage=Mat(dsize,CV_32S);
resize(srclmage,dstlmage,dsize);
imshow("滑动条",dstlmage);
}
int main()
{
namedWindow("源图像",WINDOW_NORMAL);//WINDOW_NORMAL表示窗口大小可以改变
srclmage=imread("D:/360/lhc.png");
imshow("源图像",srclmage);
namedWindow("滑动条",WINDOW_AUTOSIZE);
createTrackbar("比例20%,40%,%60%,80%,100%","滑动条",&val,5,back);
back(val,0);
waitKey(0);
return 0;
}