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创建好一个窗口,再往上面加上滑动条及其参数(名字,窗口名字,初始值,极值)
然后再利用循环,在循环内部对图像操作,来达成不需要调用回调函数的效果。