opencv学习笔记03-鼠标回调与trackbar

Posted (⊃・ᴥ・)つ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv学习笔记03-鼠标回调与trackbar相关的知识,希望对你有一定的参考价值。

opencv 简易笔记 3--鼠标回调与 trackbar

1.设置鼠标回调函数

import cv2
import numpy

def mouse_callback(event, x, y, flags, userdata):
    if event == 1:
        print(event, x, y, flags, userdata)

# 窗口命名
cv2.namedWindow("mouse", cv2.WINDOW_NORMAL)
# 设置鼠标回调函数
a = cv2.setMouseCallback("mouse", mouse_callback, "userdata")
# 显示窗口
img = numpy.zeros((500, 500, 3), numpy.uint8)
while True:
    cv2.imshow("mouse", img)
    key = cv2.waitKey(0)
    # 销毁
    if key & 0xFF == ord("q"):
        cv2.destroyAllWindows()
        break

简单说明一下代码逻辑,首先需要定义一个鼠标回调函数,即 mouse_callback(event, x, y, flags, userdata),该函数原型应为:

#void on_Mouse(int event, int x, int y, int flags, void* param);
def mouse_callback(event, x, y, flags, userdata):
    print(event, x, y, flags, userdata)

其中,像event,flags均有定义:

1.1 setMouseCallback(winname,callback,para) -> None

(1) winname: 即窗口名字
(2) callback: 需要设置的回调函数
(3) para: 参数,暂定,这个 param 是 onMouse 和 setMouseCallback 之间的参数通信接口。

2.trackBar 介绍

import cv2
import numpy


def callback(any):
    pass


# 窗口命名
cv2.namedWindow("trackbar", cv2.WINDOW_NORMAL)
cv2.createTrackbar("R", "trackbar", 20, 255, callback)
cv2.createTrackbar("G", "trackbar", 20, 255, callback)
cv2.createTrackbar("B", "trackbar", 20, 255, callback)
# 显示窗口
img = numpy.zeros((500, 500, 3), numpy.uint8)
while True:
    # 获取当前trackbar的值
    r = cv2.getTrackbarPos("R", "trackbar")
    g = cv2.getTrackbarPos("G", "trackbar")
    b = cv2.getTrackbarPos("B", "trackbar")
    print(type(r))
    # 改变背景图片颜色
    img[:] = [b, g, r]
    cv2.imshow("trackbar", img)
    key = cv2.waitKey(10)
    # 销毁
    if key & 0xFF == ord("q"):
        cv2.destroyAllWindows()
        break

2.1 createTrackbar(trackbarName,windowName,value,count,onchange) ->

(1) trackbarName: trackbar 名字
(2) windowName: 窗口名字
(3) value: trackbar 当前值
(4) count: trackbar 最大值
(5) onchange: 一个回调函数,在值改变时触发

2.2 getTrackbarPos() -> (int)pos

(1) trackbarName: trackbar 名字
(2) windowName: 窗口名字

OpenCV 轨迹条Trackba应用

Trackbar介绍

opencv提供了一种称为轨迹条或滑动条(Trackbar)的控件工具,能够直观的改变出现处理时的参数,实时看到更改这些参数时对于图像处理结果的影响。

Trackbar API

createTrackbar()函数

OpenCV 提供的 GUI 库在(highgui.h)里

createTrackbar()函数用来创建一个可以调节输入变量值的滑动条,并将改控件依附于指定的窗口上。在使用时需要和一个回调函数配合使用。其原型如下:

CV_EXPORTS int createTrackbar(
	const string& trackbarname, 
	const string& winname,
	int* value, 
	int count,
	TrackbarCallback onChange = 0,
	void* userdata = 0
);

其各个参数含义如下:

  • trackname: 滑动条名字
  • winname: 想要把该滑动条依附到的窗口名字,在程序中可能该窗口名称由namedWindow()声明。
  • value: 创建滑动条时,滑动条的初始值
  • count: 滑动条的最大值,即所有滑动条的数据变动都要在0-count之间,滑动条最小值为0
  • onChange= 0 : 这是指的回调函数,每次滑动条数据变化时都对该函数进行回调
  • userdata= 0 : 这个是用户传给回调函数的数据,用来处理滑动条数值变动。如果在创建滑动条时,输入value实参是全局变量,则本参数userdata可使用默认值0.

Trackbar案例

代码示例1:混合图像透明度变换显示

效果展示:

代码如下:

#include <iostream>
#include <stdio.h>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>

using namespace std;
using namespace cv;

//声明全局变量
const int g_nTrackbarMaxValue = 100;		// 滑动条最大值
int g_nTrackbarValue;						// 滑动条对应的值
double g_dAlphaValue;						// 第一幅图权重
double g_dBetaValue;						// 第二幅图权重
Mat g_srcImage1, g_srcImage2, g_distImage;

//声明回调函数
void on_Trackbar(int, void*);

int main()

	g_srcImage1 = imread("./test2.jpg");
	g_srcImage2 = imread("./test.jpg");

	//判断图像是否加载成功
	if (g_srcImage1.data && g_srcImage2.data)
		cout << "图像加载成功!" << endl << endl;
	else
	
		cout << "图像加载失败!" << endl << endl;
		return -1;
	

	namedWindow("混合后图像", WINDOW_NORMAL);		// 滑动条依附的窗口
	g_nTrackbarValue = 20;							// 设置滑动条初始值

	//在创建的窗体中创建滑动条控件并命名
	char trackBarName[100];

	/*Linux下使用sprintf需要添加头文件"stdio.h"
	 *在Windows下微软一直在推广其安全函数即后缀加上_s
	 *否则会有警告出现
	 *所以本段代码将有两个版本*/
	sprintf(trackBarName, "透明度 %d", g_nTrackbarMaxValue);			// Linux版本语句

	// sprintf_s(trackBarName, "透明度 %d", g_nTrackbarMaxValue);		// Windows版本语句

	createTrackbar(trackBarName, "混合后图像", &g_nTrackbarValue, g_nTrackbarMaxValue, on_Trackbar);

	on_Trackbar(g_nTrackbarValue, 0);           // 结果在回调函数中显示

	waitKey(0);

	return 0;


void on_Trackbar(int, void*)

	//图像融合的权重在0-1之间,转换输入值和权重之间的比例
	g_dAlphaValue = (double)g_nTrackbarValue / g_nTrackbarMaxValue;
	g_dBetaValue = 1.0 - g_dAlphaValue;     // 第二幅图像权重

	//使用addWeighted函数对图像进行线性混合
	addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_distImage);

	imshow("混合后图像", g_distImage);

代码示例2:图像亮度与对比度滑动调整

效果展示:

代码如下:


#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>  

using namespace cv;
using namespace std;


int g_nContrastValue;   //对比度值
int g_nBrightValue;     //亮度值
Mat g_srcImage, g_dstImage;
static void ContrastAndBright(int, void*);

int main()

	//【0】初始化、配置
	// system("color 5F");

	g_srcImage = imread("./test2.jpg");
	if (!g_srcImage.data) 
	
		printf("Oh,damm,读取g_srcImage图像错误!!!!"); 
		return false;
	
	g_dstImage = Mat::zeros(g_srcImage.size(), g_srcImage.type());

	// 设定对比度和亮度的初值
	g_nContrastValue = 80;
	g_nBrightValue = 80;

	namedWindow("【效果图窗口】", 1);

	// 创建轨迹条
	createTrackbar("对比度:",
		"【效果图窗口】",
		&g_nContrastValue,
		300,
		ContrastAndBright);
	createTrackbar("亮  度:",
		"【效果图窗口】",
		&g_nBrightValue,
		200,
		ContrastAndBright);

	// 调用回调函数
	ContrastAndBright(g_nContrastValue, 0);
	ContrastAndBright(g_nBrightValue, 0);

	cout << endl << "嗯,好了,请调整滚动条观察图像效果!!!\\n\\n"
		<< "\\t按下“q”键时,程序退出!!!\\n"
		<< "\\n\\n\\t\\t\\t\\tby";
	
	waitKey(0);
	return 0;



// ContrastAndBright( int, void* ) 描述:改变图像对比度和亮度值的回调函数
static void ContrastAndBright(int, void*)

	// 创建窗口
	namedWindow("【原始图窗口】", 1);

	// 三个for循环,执行   g_dsImage(i,j) =  a*g_srcImage(i,j)  +  b
	for (int y = 0; y < g_srcImage.rows; y++)
	
		for (int x = 0; x < g_srcImage.cols; x++)
		
			for (int c = 0; c < 3; c++)
			
				g_dstImage.at<Vec3b>(y, x)[c] = saturate_cast<uchar>
					((g_nContrastValue*0.01) * (g_srcImage.at<Vec3b>(y, x)[c]) + g_nBrightValue);
			
		
	

	// 显示图像
	imshow("【原始图窗口】", g_srcImage);
	imshow("【效果图窗口】", g_dstImage);


以上是关于opencv学习笔记03-鼠标回调与trackbar的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 轨迹条Trackba应用

OpenCV学习3-----利用鼠标键盘回调函数实现标定人体关节点

Opencv+Python:鼠标作为画笔

OpenCV学习笔记03:缩放裁剪图像与调整图像色调

OpenCV 中的 Gui 特性——4鼠标绘图

2018KW13/3-OpenCV入门-鼠标当作画笔