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