- 在openCV 中没有按钮,所以我们会经常用到滑动条的功能,用到滑动条,就会遇到这两个东西。creatTrackbar()函数和回调函数的概念。
- creatTrackbar()
int createTrackerbar(
const string& trackerbarname,
const string winname,
int* value,
int count,
TrackbarCallback onChange=0,
void* userdata=0
);
- 回调函数
回调函数里会处理并显示图片,就是每次滑动条滑块被用户拖动一个位置,creatTrackbar()中value值会变化,而且会访问并执行回调函数一次,回调函数里有对图片的相关操作,以及显示操作,所以没动一次滑块,图片显示效果就会不同。这就是拖动滑块代码的执行过程。
下面分享一个代码,
注意全局变量的声明和回调函数的固定格式:void
函数名(int, void*);
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <opencv2/nonfree/nonfree.hpp>
#include<opencv2/legacy/legacy.hpp>
#include <opencv2/opencv_lib.h>
#include <iostream>
using namespace cv;
using namespace std;
Mat srcImage;
Mat grayImage;
int Canny_Threshed = 80;
int Canny_ThreshedMax = 255;
Mat CannyMat_output;
vector<vector<Point>> Contours;
vector<Vec4i> Hierarchy;
void on_ThreshChange(int, void*);
int main()
{
srcImage = imread("1.jpg", 1);
cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);
blur(grayImage, grayImage, Size(3, 3), Point(-1, -1));
namedWindow("原图片", 1);
imshow("原图片", srcImage);
createTrackbar("canny阀值", "原图片", &Canny_Threshed, Canny_ThreshedMax, on_ThreshChange);
on_ThreshChange(0, 0);
waitKey(0);
return 0;
}
void on_ThreshChange(int, void*)
{
Canny(grayImage, CannyMat_output, Canny_Threshed, Canny_Threshed * 2, 3);
imshow("canny", CannyMat_output);
findContours(CannyMat_output, Contours, Hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);
Mat draw = Mat::zeros(CannyMat_output.rows, CannyMat_output.cols, CV_8UC3);
for (int i = 0; i < Contours.size(); i++)
{
drawContours(draw, Contours, i, Scalar(255,255,255), 1, 8, Hierarchy);
}
imshow("轮廓图", draw);
}