前言:
为了让摄像头更好的适应现场环境进行识别!然而又不去调摄像头硬件,所以我们就需要通过手动框选来选择识别区域!
这次我们的用的是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);