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);
}