前言:
为了让摄像头更好的适应现场环境进行识别!然而又不去调摄像头硬件,所以我们就需要通过手动框选来选择识别区域!
这次我们的用的是QT 的
bool
eventFilter
(
QObject
*
obj
,
QEvent
*
event
);这个函数特别好用,为什么这么说呢,因为你会发现QT的Lable是没有按键信号的,然而通过事件,就可以达到button的功能了!如果用特定的事件函数,你会发现不方便的去找到事件的目标。。。(尤其是在同一个界面中,没有自己编写的控件类)然而事件过滤器却非常方便,所以,何乐而不为呢?这里不在阐述事件过滤器是干嘛的!
先来看下效果!
用 事件过滤器前,我们需要注册一下使用过滤器的类!
ui->label_f->installEventFilter(this);
我们需要一个刷新几何图形的位置函数
void colorhandle::point_Config(short x_ ,short y_ ,double size_ ){
static double temp_size =1;
temp_size+=size_;
double temp_width = IMAGEAREA_RL_WIDTH*temp_size;
double temp_height = IMAGEAREA_HEIGHT*temp_size;
static short Xpos =60,Ypos = 120;
_L_U[0].x =Xpos+ x_; //这里下x,y需要交换
_L_U[0].y =Ypos+ y_;
_L_D[0].x = _L_U[0].x;
_L_D[0].y = temp_height + _L_U[0].y;
_C_U[0].x = temp_width + _L_U[0].x ;
_C_U[0].y = _L_U[0].y;
_C_D[0].x = _C_U[0].x;
_C_D[0].y = _L_D[0].y;
_R_U[0].x = 2 * temp_width + _L_U[0].x;
_R_U[0].y = _L_U[0].y;
_R_D[0].x = _R_U[0].x;
_R_D[0].y = _L_D[0].y;
Xpos += x_;
Ypos += y_;
U_L_area_corner.clear();
U_L_area_corner.push_back(_L_U[0]);
U_L_area_corner.push_back(_C_U[0]);
U_L_area_corner.push_back(_C_D[0]);
U_L_area_corner.push_back(_L_D[0]);
U_R_area_corner.clear();
U_R_area_corner.push_back(_C_U[0]);
U_R_area_corner.push_back(_R_U[0]);
U_R_area_corner.push_back(_R_D[0]);
U_R_area_corner.push_back(_C_D[0]);
}
一下是在colorhandle类中注册的内容
short IMAGEAREA_RL_WIDTH = 140; short IMAGEAREA_HEIGHT = 160; cv::Point _L_U[2]; cv::Point _L_D[2]; cv::Point _C_U[2]; cv::Point _C_D[2]; cv::Point _R_U[2]; cv::Point _R_D[2]; std::vector<cv::Point2f>U_L_area_corner; std::vector<cv::Point2f>U_R_area_corner; void point_Config(short x_ =0,short y_ =0,double size_ =0 );
接下来看事件过滤器函数
short last_X=0, last_Y =0; short dir_x =0,dir_y =0; bool temp_flag =false; double size_step =0.05; bool Magic::eventFilter(QObject *obj,QEvent *event){ if(obj == ui->label_f){ if(event->type() == QEvent::MouseButtonRelease){ temp_flag = false; return true; }else if(event->type() == QEvent::MouseMove){ QMouseEvent *mousevent = static_cast<QMouseEvent*>(event); dir_x =0;dir_y =0; if(temp_flag){ dir_x = mousevent->pos().x()-last_X; dir_y = mousevent->pos().y()-last_Y; } temp_flag =true; last_X = mousevent->pos().x(); last_Y = mousevent->pos().y(); mImage->point_Config(dir_x,dir_y); return true; }else if(event->type() == QEvent::Wheel){ QWheelEvent *wheelevent = static_cast<QWheelEvent*>(event); if(wheelevent->delta()>0){ mImage->point_Config(0,0,0.05); }else{ mImage->point_Config(0,0,-0.05); } return true; }else{ return false; } } return QMainWindow::eventFilter(obj,event); }
由于过滤器自身的事件函数比较简单,所以我们需要重新转换一下事件,达到相应事件相同的效果!
QMouseEvent *mousevent = static_cast<QMouseEvent*>(event);