我在opencv(c)中编写了一个程序来操作相机属性 . 我试图使用“轨迹栏”来模糊我的相机显示 . 代码正在运行,但在某些条件下 . 当我使用鼠标点击改变“轨迹栏”的位置时,它可以工作 . 但是,如果我试图滑动轨道栏,它会给我一个错误,如下所述 .
这是我的代码
#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 回答
在while循环中,您将无效值传递给
GaussianBlur
,因为slider
也可以是偶数 .你可以纠正这个引入一个新的变量
int kernel_size = 2*slider+1
.slider
now是内核的半径,kernel_size
保证是奇数 .此外,您不需要在回调函数中调用
GaussianBlur
,因为它已在主循环中调用 . 回调的唯一目标是更新kernel_size
和sigma
的值 .此代码将按预期工作: