OpenCV学习二十七:两种通过 createTrackbar 实现对同一函数中多参数实时调用改变的方法

本文介绍使用OpenCV库中的Canny函数进行边缘检测,并通过两种不同方法实现实时调整Canny函数中的高低阈值。方法一是直接在主函数中创建多个createTrackbar函数;方法二是先创建一个createTrackbar函数,再通过该函数调用第二个createTrackbar函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

createTrackbar 中关于跳动参数的那个变量是指针类型,说明是通过地址改变原变量的值,因此不需要 createTrackbar 中调用的函数体传入该改变的变量,只需要实时计算并显示结果即可。因此基于这个思路写出两种对 Canny 函数中两个阈值实时调控更改的方法。


方法一:主函数中创建多个 createTrackbar 函数。

#include <opencv2/opencv.hpp>  
#include <stdio.h>  
#include <stdlib.h>  
#include <iostream>

using namespace cv;  
using namespace std;  

char file[] = "lemon.jpg";
char windowName[] = "result";
int val1 = 50;
int val2 = 150;
int max_val = 50*2.5;
Mat img, out;

void move_val1(int, void*);
void move_val2(int, void*);

int main(int argc, char** argv)  
{  
	img = imread(file, -1);
	pyrDown(img, img, Size(img.cols/2, img.rows/2));
	pyrDown(img, img, Size(img.cols/2, img.rows/2));
	pyrDown(img, img, Size(img.cols/2, img.rows/2));
	imshow("img", img);

	namedWindow(windowName, 1);
	createTrackbar("test_1", windowName, &val1, 255, move_val1);
	createTrackbar("test_2", windowName, &val2, 255, move_val2);
	move_val2(0, 0);
	move_val1(0, 0);

	waitKey();
	return 1;
}  

void move_val1(int, void*)
{
	Canny(img, out, val1, val2, 3, false);
	imshow(windowName, out);
}

void move_val2(int, void*)
{
	Canny(img, out, val1, val2, 3, false);
	imshow(windowName, out);
}


方法二:主体函数调用一个 createTrackbar 函数以及一个 createTrackbar 函数调用的方法,再通过该方法调用第二个 createTrackbar 函数。

#include <opencv2/opencv.hpp>  
#include <stdio.h>  
#include <stdlib.h>  
#include <iostream>

using namespace cv;  
using namespace std;  

char file[] = "lemon.jpg";
char windowName[] = "result";
int val1 = 50;
int val2 = 150;
int max_val = 50*2.5;
Mat img, out;

void move_val1(int, void*);
void move_val2(int, void*);

int main(int argc, char** argv)  
{  
	img = imread(file, -1);
	pyrDown(img, img, Size(img.cols/2, img.rows/2));
	pyrDown(img, img, Size(img.cols/2, img.rows/2));
	pyrDown(img, img, Size(img.cols/2, img.rows/2));
	imshow("img", img);

	namedWindow(windowName, 1);
	createTrackbar("test_1", windowName, &val1, 255, move_val1);
	move_val1(0, 0);

	waitKey();
	return 1;
}  

void move_val1(int, void*)
{
	createTrackbar("test_2", windowName, &val2, 255, move_val2);
	move_val2(0, 0);
}

void move_val2(int, void*)
{
	Canny(img, out, val1, val2, 3, false);
	imshow(windowName, out);
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值