免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
OpenCVのは非常に使いやすいでツールを提供- スライダー(トラックバーを)、それが存在するウインドウに取り付けられています。
createTrackbar()関数
この機能の効果は:私たちのために特定の名前とスコープを持つトラックバーを作成するには、変数の位置や軌道同期を指定するだけでなく、トラックバーは、コールバック関数を呼び出すための場所を変更したときに、コールバック関数のonChangeを指定します。
int createTrackbar(const string& trackbarname, const string& winname,
int* value, int count, TrackbarCallback onChange = 0, void* userdata = 0);
パラメータ説明
- パラメータ1:スライダーの名前。
- パラメータ2:ウィンドウの名前、その上に作成されたスライダを窓に取り付けられるようにします。
- パラメータ3:スライダーの位置を示しています。あなたが作成すると、スライダの初期位置は、変数の現在の値です。
- パラメータ4:スライダーの最大スライド位置を表します。最小スライダーは常に0です。
- パラメータ5:TrackbarCallbackタイプのonChange、それはデフォルト値の0を持っています。これは、コールバック関数へのポインタで、毎回スライダーの位置の変化は、コールバック関数は次のようになります。そして、これは(void *型のint、)関数のプロトタイプボイドXXXXXでなければなりません。
- パラメータ6:void *型のタイプのユーザデータは、それはまた、デフォルト値の0を持っています。このパラメータは、コールのスライダーを処理するためのコールバック関数に渡されたユーザデータです。あなたは、グローバル変数は、三番目のパラメータ値の引数をされて使用している場合は、このユーザデータのパラメータを管理することができません。
コールバック:関数が呼び出されて、関数ポインタです。私たちは、ポインタを取る場合(アドレス)関数が別の関数にパラメータとして渡されるポインタは、それが指す関数を呼び出すために使用されている場合、それはコールバック関数と呼ばれています。コールバック関数が直接側と呼ばれて達成するのに役立ちますが、別の発呼者特定のイベントまたは状態がイベントまたは条件に応答するために、発生したとき。
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
#define WINDOW_NAME "example" //为窗口标题定义的宏
const int g_nMaxAlphaValue = 100;//Alpha值的最大值
int g_nAlphaValueSlider;//滑动条对应的变量
double g_dAlphaValue;
double g_dBetaValue;
//声明存储图像的变量
Mat g_srcImage1;
Mat g_srcImage2;
Mat g_dstImage;
//-----------------------------------【on_Trackbar( )函数】--------------------------------
// 描述:响应滑动条的回调函数
//------------------------------------------------------------------------------------------
void on_Trackbar( int, void* )
{
//求出当前alpha值相对于最大值的比例
g_dAlphaValue = (double) g_nAlphaValueSlider/g_nMaxAlphaValue ;
//则beta值为1减去alpha值
g_dBetaValue = ( 1.0 - g_dAlphaValue );
//根据alpha和beta值进行线性混合
addWeighted( g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);
//显示效果图
imshow( WINDOW_NAME, g_dstImage );
}
int main( int argc, char** argv )
{
//加载图像 (两图像的尺寸需相同)
g_srcImage1 = imread("1.jpg");
g_srcImage2 = imread("2.jpg");
if( !g_srcImage1.data ) { printf("读取第一幅图片错误,请确定目录下是否有imread函数指定图片存在~! \n"); return -1; }
if( !g_srcImage2.data ) { printf("读取第二幅图片错误,请确定目录下是否有imread函数指定图片存在~!\n"); return -1; }
//设置滑动条初值为70
g_nAlphaValueSlider = 70;
//创建窗体
namedWindow(WINDOW_NAME, 1);
//在创建的窗体中创建一个滑动条控件
char TrackbarName[50];
sprintf( TrackbarName, "value %d", g_nMaxAlphaValue ); //把g_nMax以定义好的格式写到TrackbarName数组中
createTrackbar( TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar );
//结果在回调函数中显示
on_Trackbar( g_nAlphaValueSlider,0);
//按任意键退出
waitKey(0);
return 0;
}
getTrackbarPos()関数:バーの現在のトラック位置を取得します。
printf("获取当前轨迹条的位置:%d\n",getTrackbarPos(TrackbarName, WINDOW_NAME) );