opencv:滑动条与鼠标操作

1059 篇文章 285 订阅

滑动条的创建和使用

滑动条(Trackbar)是OpenCV动态调节参数的一种很好用的工具,它依附于窗口存在

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


#define WINDOW_NAME "【滑动条的创建&线性混合示例】"        //为窗口标题定义的宏
const int g_nMaxAlphaValue = 100;//Alpha值的最大值
int g_nAlphaValueSlider;//滑动条对应的变量
double g_dAlphaValue;
double g_dBetaValue;

//声明存储图像的变量
Mat g_srcImage1;
Mat g_srcImage2;
Mat g_dstImage;



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("/home/oceanstar/桌面/1.jpg");
    g_srcImage2 = imread("/home/oceanstar/桌面/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, "透明值 %d", g_nMaxAlphaValue );

    createTrackbar( TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar );

    //结果在回调函数中显示
    on_Trackbar( g_nAlphaValueSlider, 0 );

    //按任意键退出
    waitKey(0);

    return 0;
}

在这里插入图片描述
在这里插入图片描述

创建滑动条createTrackbar


@param    trackbarname    轨迹栏的名称。
@param    winname         这个滑动条依附到哪个窗口上
@param    value           滑块的位置。
@param    count           当滑块到最大位置时的值。 最小位置始终为0。
@param    onChange        默认值是0。 
                         它是滑块位置改变时的回调函数。
                         如果回调是空指针,不调用回调,只更新值。
                         如果不是空指针,这个函数的原型必须是void Foo(intvoid\*);
                               其中第一个参数是trackbar位置
                               第二个参数是用户数据(见下一个参数)。   
                             
@param   userdata        默认值是0。 这个参数是用户传给回调函数的数据,用来处理轨迹条事件。如果第三个参数value是全局变量,就不用管这个参数
CV_EXPORTS int createTrackbar(const String& trackbarname, const String& winname,
                              int* value, int count,
                              TrackbarCallback onChange = 0,
                              void* userdata = 0);

getTrackbarPos

/*
 * 功能:  获取轨迹条位置
 * param:  trackbarname    轨迹条名称
 * 			winname         父窗口名称
*/
CV_EXPORTS_W int getTrackbarPos(const String& trackbarname, const String& winname);

鼠标操作

功能:使用鼠标在窗口画随机颜色的矩形

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


#define WINDOW_NAME "【程序窗口】"        //为窗口标题定义的宏
void on_MouseHandle(int event, int x, int y, int flags, void* param);
void DrawRectangle( cv::Mat& img, cv::Rect box );
void ShowHelpText( );

Rect g_rectangle;
bool g_bDrawingBox = false;//是否进行绘制
RNG g_rng(12345);




int main( int argc, char** argv )
{
    //【0】改变console字体颜色
    system("color 9F");



    //【1】准备参数
    g_rectangle = Rect(-1,-1,0,0);
    Mat srcImage(600, 800,CV_8UC3), tempImage;
    srcImage.copyTo(tempImage);
    g_rectangle = Rect(-1,-1,0,0);
    srcImage = Scalar::all(0);

    //【2】设置鼠标操作回调函数
    namedWindow( WINDOW_NAME );
    setMouseCallback(WINDOW_NAME,on_MouseHandle,(void*)&srcImage);

    //【3】程序主循环,当进行绘制的标识符为真时,进行绘制
    while(1)
    {
        srcImage.copyTo(tempImage);//拷贝源图到临时变量
        if( g_bDrawingBox ) DrawRectangle( tempImage, g_rectangle );//当进行绘制的标识符为真,则进行绘制
        imshow( WINDOW_NAME, tempImage );
        if( waitKey( 10 ) == 27 ) break;//按下ESC键,程序退出
    }
    return 0;
}



//--------------------------------【on_MouseHandle( )函数】-----------------------------
//		描述:鼠标回调函数,根据不同的鼠标事件进行不同的操作
//-----------------------------------------------------------------------------------------------
void on_MouseHandle(int event, int x, int y, int flags, void* param)
{

    Mat& image = *(cv::Mat*) param;
    switch( event)
    {
        //鼠标移动消息
        case EVENT_MOUSEMOVE:
        {
            if( g_bDrawingBox )//如果是否进行绘制的标识符为真,则记录下长和宽到RECT型变量中
            {
                g_rectangle.width = x-g_rectangle.x;
                g_rectangle.height = y-g_rectangle.y;
            }
        }
            break;

            //左键按下消息
        case EVENT_LBUTTONDOWN:
        {
            g_bDrawingBox = true;
            g_rectangle =Rect( x, y, 0, 0 );//记录起始点
        }
            break;

            //左键抬起消息
        case EVENT_LBUTTONUP:
        {
            g_bDrawingBox = false;//置标识符为false
            //对宽和高小于0的处理
            if( g_rectangle.width < 0 )
            {
                g_rectangle.x += g_rectangle.width;
                g_rectangle.width *= -1;
            }

            if( g_rectangle.height < 0 )
            {
                g_rectangle.y += g_rectangle.height;
                g_rectangle.height *= -1;
            }
            //调用函数进行绘制
            DrawRectangle( image, g_rectangle );
        }
            break;

    }
}



//-----------------------------------【DrawRectangle( )函数】------------------------------
//		描述:自定义的矩形绘制函数
//-----------------------------------------------------------------------------------------------
void DrawRectangle( cv::Mat& img, cv::Rect box )
{
    cv::rectangle(img,box.tl(),box.br(),cv::Scalar(g_rng.uniform(0, 255), g_rng.uniform(0,255), g_rng.uniform(0,255)));//随机颜色
}



setMouseCallback

@brief    鼠标变动时的回调函数
@param    winname      窗口的名称。
@         onMouse      指定窗口里面每次鼠标事件发生的时候,被调用的函数指针
@        userparam    用户定义的传递到回调函数的参数,可选,默认值0。

CV_EXPORTS void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值