题目要求:打开一张lena.jpg图片,支持滑动条进行blur滤波处理;支持鼠标左键按下画圆圈;对每次进行滑动条的操作,支持按钮点击进行blur、gray、bgr和sobel滤波处理。
分析:
1)创建滑动条函数:createTrackbar(“Lena”, “Lena”, &blurAmount, 30, onChangeTrackBar, &img)和回调函数onChangeTrackBar(int pos, void* srcData);
2)鼠标事件函数:setMouseCallback(“Lena”, onMouseCircle, &img)和回调函数onMouseCircle(int event, int x, int y, int flags, void* srcData);
3)创建按钮函数:createButton(“Blur”, blurCallback, NULL, QT_CHECKBOX, 0)和回调函数void blurCallback(int state, void* userData);
4)考虑先后执行顺序,滑动条和鼠标部分先后,滤波在二者之后,获取当前图像的状态进行处理,考虑传入全局变量;
代码示例:
/*
@File :buttonWithMouse.cpp
@Description: : opencv with qt demo, button, trackbar and mouse action
@Date :2021/12/20 14:53:03
@Author :xxx
@version :1.0
*/
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
// OpenCV includes
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
using namespace cv;
int blurAmount = 15;
Mat img;
bool applyGray=false;
bool applyBlur=false;
bool applySobel=false;
void applyFilters(){
/*
@description : apply gray, blur and sobel filter selected by button state
@param :
None
@Returns :
None
*/
Mat result;
// cope the gobal img to result, do operation on the result
img.copyTo(result);
if(applyGray){
cvtColor(result, result, COLOR_BGR2GRAY);
}
if(applyBlur){
blur(result, result, Size(5,5));
}
if(applySobel){
Sobel(result, result, 0, 1, 1);
}
imshow("Lena", result);
}
// BattonCallback fuctor: (int state, void* userData)
void grayCallback(int state, void* userData)
{
applyGray= true;
applyFilters();
}
void bgrCallback(int state, void* userData)
{
applyGray= false;
applyFilters();
}
void blurCallback(int state, void* userData)
{
applyBlur= (bool)state;
applyFilters();
}
void sobelCallback(int state, void* userData)
{
applySobel= !applySobel;
applyFilters();
}
// trackbar functor: typedef void (*createTrackbar_)(int pos, void* userdata)
void onChangeTrackBar(int pos, void* srcData){
/*
@description : functor for createTrackBar to do blue filter with pos size
@param :
pos: the filter size
srcData: image data
@Returns :
None
*/
if(pos <= 0){
return;
}
Mat desData;
Mat* img = (Mat*) srcData;
// opencv blur filter
blur(*img, desData, Size(pos, pos));
imshow("Lena", desData);
}
// mouse functor: typedef void (*SetMouseCallback_)(int pos, void* userdata)
void onMouseCircle(int event, int x, int y, int flags, void* srcData){
/*
@description : create a circle in image when mouse click down
@param :
event: opencv default mouse event CV_EVENT_MOUSEMOVE 0, CV_EVENT_LBUTTONDOWN 1, ...
x: pos x
y: pos y
flags: opencv default CV_EVENT_FLAG_LBUTTON 1, CV_EVENT_FLAG_RBUTTON 2, ...
srcData: image data
@Returns :
None
*/
// only check left button down event
if(event != EVENT_LBUTTONDOWN){
return;
}
Mat* img = (Mat*) srcData;
circle(*img, Point(x, y), 10, Scalar(0,255,0), 3);
onChangeTrackBar(blurAmount, img);
}
int main( int argc, const char** argv )
{
// init global img
img= imread("../lena.jpg");
// create windows
namedWindow("Lena");
// create Buttons
createButton("Blur", blurCallback, NULL, QT_CHECKBOX, 0);
createButton("Gray",grayCallback,NULL,QT_RADIOBOX, 0);
createButton("RGB",bgrCallback,NULL,QT_RADIOBOX, 1);
createButton("Sobel",sobelCallback,NULL,QT_PUSH_BUTTON, 0);
createTrackbar("Lena", "Lena", &blurAmount, 30, onChangeTrackBar, &img);
setMouseCallback("Lena", onMouseCircle, &img);
// wait app for a key to exit
waitKey(0);
// Destroy the windows
destroyWindow("Lena");
return 0;
}
结果展示