OpenCV----GUI设计示例

题目要求:打开一张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;
}

结果展示
RGB 按钮
Sobel 按钮

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值