Use o controle deslizante] [opencv

deslizante opencv em uso

O controle deslizante é um controle opencv pode usar o mouse para controlar a posição do cursor, de modo a interagir com o programa de imagem. conteúdo deslizante consiste em duas partes, nomeadamente a criação de cursores e uma função de retorno.

A função de retorno é geralmente não chamar diretamente o programa principal, mas quando há eventos especiais irá desencadear esta função, como na barra de rolagem quando mudamos o valor do tempo, pode desencadear uma função de retorno para produzir alguns resultados.

A definição da função deslizante


int cv::createTrackbar	(	const String & 	trackbarname,
const String & 	winname,
int * 	value,
int 	count,
TrackbarCallback 	onChange = 0,
void * 	userdata = 0 
)	
  • O primeiro argumento: trackbarname é uma variável do tipo string, ou seja, aparece o nome do controle deslizante do lado esquerdo da barra
  • O segundo parâmetro: winname é uma variável do tipo string, para explicar a adsorvida controle deslizante na qual janela
  • O terceiro parâmetro: o tipo é um registros ponteiro int para o valor atual do controle deslizante, esse valor será passado para a chamada de retorno
  • O quarto parâmetro: variável de contagem do tipo int é o valor máximo para explicar o controle deslizante
  • O quinto parâmetro: é um ponteiro de função, que utilizada para ilustrar a operação, quando a função é chamada como a chamada de retorno
  • Sexto parâmetro: um ponteiro do tipo void *, pode representar qualquer tipo de ponteiro, o seu papel é o de passar dados para a função de retorno. Se você usar variáveis ​​são variáveis ​​globais, você não pode usar esse argumento, especificamente, como para transmitir dados, será descrito mais tarde.

definição de função de retorno de chamada

A função de retorno de chamada é uma função do nosso costume, mas deve atender aos requisitos de formato, é um tipo de retorno void, e o cinto e int vazio dois tipos de variáveis, tal formato é necessária. int a posição do cursor para receber a terceira função de parâmetro, nula posição para receber cursores do sexto parâmetro, a transferência de dados entre o cursor e a função de retorno pode ser alcançado por estes dois parâmetros.

void MyFunction(int , void*)
{
}

Exemplos da utilização do cursor

Exemplos desta combinação Mao Xingyun "entrada de programação Opencv3" mudou um pouco a pouco, para obter instruções sobre como fazer a função de retorno de chamada pode receber o controle deslizante de dados. Este exemplo usa void * dentro de alguns dos conhecimentos relevantes, podem ser encontrados https://blog.csdn.net/Lee_Shuai/article/details/53193436 este artigo para entender o conhecimento relevante.

//这个例子的功能是,我们要将两幅图片进行线性混合,通过滑动条来控制线性混合的比例
//这里要注意的是,用于线性混合的两张图片大小必须是一样的,否则无法成功
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;

class MyPicture
    //定义了一个类,用来作为滑动条的第六个参数进行传递数据,而没有使用全局变量的方式进行
{
public:
    double alpha;//线性混合的alpha值
    double beta;//线性混合的beta值
    Mat m1, m2;//用于存放用于线性混合的两张图片
    const int Max=100;//滑动条的最大值

    MyPicture(double aplha, double beta, Mat m1, Mat m2) :alpha(alpha), beta(beta), m1(m1), m2(m2) {}
    //构造函数,并且使用初始化列表的方法进行变量的初始化

};
void Track(int nowValue, void* p)//回调函数
{
    MyPicture mp = *(MyPicture*)p; //将void*类型的指针变成我们需要的类型,接受参数
    Mat m3;//线性混合的最后的输出结果
    double gamma = 0.0;//线性混合的参数
    mp.alpha = 1.0 * nowValue / mp.Max;
    mp.beta = 1 - mp.alpha;
    addWeighted(mp.m1, mp.alpha, mp.m2, mp.beta, gamma, m3);//线性混合
     //线性混合的公式为 输出图片m3 = m1*alpha + m2*beta + gamma; 
    imshow("window", m3);
}

int main()
{
    int nowValue = 100; //用于记录滑动条的当前数值
    Mat m1 = imread("1.jpg");//用于线性混合的第一张图
    Mat m2 = imread("2.jpg");//用于线性混合的第二张图
    MyPicture mp(1.0, 0.0, m1, m2);//初始化函数
    Track(nowValue, &mp);//初始化图片显示
    string TrackName = "透明值100";
    namedWindow("window", WINDOW_NORMAL);
    createTrackbar(TrackName, "window", &nowValue, mp.Max, Track, &mp);//创建滑动条
    waitKey(0);



    return 0;
}

Claro, você também pode usar um método de variável global de acordo com o método de livro, não há necessidade de construir um novo ponteiro para passar parâmetros.

Exemplos da utilização do método de variáveis ​​globais para alcançar o controle deslizante também está escrito aqui, você pode ver juntos

#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;

//全局变量,滑动条
const int Max = 100;
int g_nowValue;
double alpha;
double beta;

//全局变量,图片
Mat m1, m2, m3;

void Track(int, void*)
{
	alpha = (double)g_nowValue / Max;
	beta = 1 - alpha;
	addWeighted(m1, alpha, m2, beta, 0.0, m3);
	imshow("1", m3);
}
int main()
{
	m1 = imread("1.jpg");
	m2 = imread("2.jpg");
	g_nowValue = 70;
	Track(g_nowValue,0);

	namedWindow("1");
	string TrackName = "透明度100";
		
	createTrackbar(TrackName, "1", &g_nowValue, Max, Track);
	waitKey(0);


	return 0;
}

Publicado 14 artigos originais · ganhou elogios 1 · vista 506

Acho que você gosta

Origin blog.csdn.net/qq_41741344/article/details/104319793
Recomendado
Clasificación