Opencv中实用的工具--------createTrackbar

Opencv中实用的工具--------createTrackbar

在对物体进行处理时,常常我们会为确定一个最合适的阈值而头秃,但是自从我们有了createTrackbar函数,不仅解决了这一难题,而且图像识别将有趣了起来。

先上代码

int createTrackbar(
conststring& trackbarname, //轨迹条的名字
conststring& winname, //滑动空间用于依附的图像窗口的名称
int* value, //滑块的位置,初始化阈值。
int count, //滑块可以达到的最大位置(滑块最小的位置的值始终为0)
TrackbarCallback onChange=0,//指向回调函数的指针
void* userdata=0); //用户传给回调函数的数据,用来处理轨迹条事件。

其中需要注意的是,在选用第二个参数时,名字要与 namedWindow 函数创建窗口的名称一样!!!!

这样才能显示出来。不然它会run都一个你怎么找也找不到的地方。

以下是实战

void callback(int th, void* data)
{
	Mat src = *((Mat*)data);//强制转换

	Mat dst;

	threshold(src, dst, th, 255, THRESH_BINARY);
	imshow("bar", dst);
}

int main()
{
	Mat srcMat;
	Mat gryMat;

	int lowth = 30;
	int maxth = 255;

	srcMat = imread("picture.png");

	cvtColor(srcMat, gryMat, COLOR_BGR2GRAY);

	namedWindow("bar", WINDOW_AUTOSIZE);
	imshow("bar", gryMat);

	createTrackbar("threshold", "bar", &lowth, maxth, callback, &gryMat);
	waitKey(0);

}

原图
请添加图片描述

效果图
请添加图片描述

当然,在网上也看了别人的一些代码,我发现,如果调用回调函数,可能会使得代码运行很慢,而且会增加代码的复杂程度。所以以下又优化掉回调函数的代码。

int thresholdValue = 128;

int main() {
    Mat src = imread("picture.png" );
	Mat gryMat;

    namedWindow("Binary Image");
	cvtColor(src,gryMat,COLOR_BGR2GRAY);

    createTrackbar("Threshold", "Binary Image", &thresholdValue, 255);

    while (1) {         //循环轮询滑动条

        Mat binaryImage;
        threshold(gryMat, binaryImage, thresholdValue, 255, THRESH_BINARY);

        imshow("Binary Image", binaryImage);
        waitKey(1);// 每帧延时 1 毫秒,如果不延时,图像将无法显示

    }


    return 0;
}

简单点说就是

用namedwindow创建好一个窗口,再往上面加上滑动条及其参数(名字,窗口名字,初始值,极值)

然后再利用循环,在循环内部对图像操作,来达成不需要调用回调函数的效果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值