OpenCV4(C++)—— 创建窗口滑动条来调参

文章目录

  • 创建滑动条 —— createTrackbar


创建滑动条 —— createTrackbar

createTrackbar是OpenCV中的一个函数,用于创建一个可调节的滑动条(Trackbar),以便在图像处理过程中实时调整参数

 int cv::createTrackbar(const String & trackbarname,  // 滑动条的名称,作为字符串传递
                        const String & winname,  // 滑动条的窗口名称,通常是显示图像的窗口名称
                        int * value,  // 指向整数变量的指针,该指针指向的值反映滑块的位置,创建后,滑块位置由此变量定义
                        int  count,  // 滑动条的最大取值
                        TrackbarCallback onChange = 0,  // 回调函数:每次滑块更改位置时要调用的函数的指针
                        void * userdata = 0  // 传递给回调函数的可选参数
                            )
其中回调函数的定义如下:
  void onChange(int value, void* userdata)   // void* userdata 参数是可选的
  {
    // 滑动条值发生变化时执行的操作
  }

可以看到,回调函数是可选参数,当默认为0时,则只更新value,要进行的操作在后面定义

例:二值化,选择参数阈值作为滑动条

#include 
#include  
using namespace std;

int main()
{
    cv::Mat image = cv::imread("C:/Users/Opencv/temp/lena.png");

    if (image.empty()) {
        cout << "打开图片失败" <<endl;
        return -1;
    }

    cv::namedWindow("img");
    cv::imshow("img", image);
    int value = 128;

    cv::createTrackbar("阈值", "img", &value, 255);

    while (true)
    {
        cv::Mat thrseImg;
        cv::threshold(image, thrseImg, value, 255, cv::THRESH_BINARY);
        cv::imshow("img", thrseImg);  // 注意:窗口的名字要和之前的一样
        //cv::imshow("取不同名字时", thrseImg);  

        char key = cv::waitKey(10);
        if (key == 27 || key == 'q')
        {
            break;
        }
    }
    
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

OpenCV4(C++)—— 创建窗口滑动条来调参_第1张图片OpenCV4(C++)—— 创建窗口滑动条来调参_第2张图片

注:上述代码中,如果while循环里imshow展示的窗口名字跟之前不同,则会新开这个窗口作为滑动结果窗口,如下图所示,在原图img中滑动数值,原图不会改变,改变的是另一个窗口。


使用回调函数,来简化上述代码

#include 
#include  

using namespace std;

void callback(int value, void*);
cv::Mat image ,thrseImg;   // 定义成全局变量,才能同时在回调函数中调用

int main()
{
    image = cv::imread("C:/Users/jutze/ljw_C++/Opencv/temp/lena.png");

    if (image.empty()) {
        cout << "打开图片失败" <<endl;
        return -1;
    }

    cv::namedWindow("img");
    cv::imshow("img", image);

    int value = 128;

    cv::createTrackbar("阈值", "img", &value, 255, callback);
    
    cv::waitKey(0);
    cv::destroyAllWindows();
    return 0;
}

static void callback(int value, void*)
{
    cv::threshold(image, thrseImg, value, 255, cv::THRESH_BINARY);
    cv::imshow("img", thrseImg);
}

此外,OpenCV还提供了鼠标响应函数setMouseCallback()和键盘响应函数setKeyboardCallback(),通过在指定窗口进行鼠标点击或键盘按键,来触发回调函数,执行相关操作。但感觉实际使用的场景比较少,以后遇到再说吧。

你可能感兴趣的:(opencv,c++,opencv)