首页 文章

跟踪栏在opencv中无法正常工作

提问于
浏览
0

我在opencv(c)中编写了一个程序来操作相机属性 . 我试图使用“轨迹栏”来模糊我的相机显示 . 代码正在运行,但在某些条件下 . 当我使用鼠标点击改变“轨迹栏”的位置时,它可以工作 . 但是,如果我试图滑动轨道栏,它会给我一个错误,如下所述 .

enter image description here

这是我的代码

#include <iostream>
#include <opencv2/opencv.hpp>


using namespace std;
using namespace cv;

Mat image, image_blurred;
int slider=5;
float sigma=0.3 *((slider - 1)*0.5 - 1) +0.8;

void on_Trackbar(int,void *)
{
     int k_size = max(1,slider);
    //k_size = k_size%2 == 0 ? k_size+1 : k_size;
    setTrackbarPos("kernel","Blur window",3);
    sigma=0.3 *((slider - 1)*0.5 - 1) +0.8;
    GaussianBlur(image,image_blurred,Size(3,3),sigma);
}
int main()
{
    Mat img;

    VideoCapture cap(0);
    if(!cap.isOpened())
    {
        cout<<"Camera is not successfully opened"<<endl;
        return -1;
    }
    namedWindow("original image",CV_WINDOW_AUTOSIZE);
    namedWindow("Blur Image",CV_WINDOW_AUTOSIZE);

    while(!char(waitKey(30)=='q') && cap.isOpened())
    {
            cap>>img;
            GaussianBlur(img,image_blurred,Size(slider,slider),sigma);
            createTrackbar("kernel","Blur Image",&slider,21,on_Trackbar);
            imshow("Blur Image",image_blurred);
            imshow("original image",img);
    }

    destroyAllWindows();
    return 0;


}

请提供您宝贵的意见 . 提前致谢!! .

1 回答

  • 1

    在while循环中,您将无效值传递给 GaussianBlur ,因为 slider 也可以是偶数 .

    你可以纠正这个引入一个新的变量 int kernel_size = 2*slider+1 . slider now是内核的半径, kernel_size 保证是奇数 .

    此外,您不需要在回调函数中调用 GaussianBlur ,因为它已在主循环中调用 . 回调的唯一目标是更新 kernel_sizesigma 的值 .

    此代码将按预期工作:

    #include <iostream>
    #include <opencv2/opencv.hpp>
    
    using namespace std;
    using namespace cv;
    
    Mat image, image_blurred;
    int slider = 0;
    int kernel_size = 3;
    float sigma = 0.3 *((kernel_size - 1)*0.5 - 1) + 0.8;
    
    void on_Trackbar(int, void *)
    {
        kernel_size = 2 * slider + 1;
        sigma = 0.3 *((kernel_size - 1)*0.5 - 1) + 0.8;
    }
    int main()
    {
        Mat img;
    
        VideoCapture cap(0);
        if (!cap.isOpened())
        {
            cout << "Camera is not successfully opened" << endl;
            return -1;
        }
        namedWindow("original image", CV_WINDOW_AUTOSIZE);
        namedWindow("Blur Image", CV_WINDOW_AUTOSIZE);
        createTrackbar("kernel", "Blur Image", &slider, 21, on_Trackbar);
    
        while (!char(waitKey(30) == 'q') && cap.isOpened())
        {
            cap >> img;
            GaussianBlur(img, image_blurred, Size(kernel_size, kernel_size), sigma);
            imshow("Blur Image", image_blurred);
            imshow("original image", img);
        }
    
        destroyAllWindows();
        return 0;
    }
    

相关问题