openCV(2)-creatTrackbar()函数及回调函数

  • 在openCV 中没有按钮,所以我们会经常用到滑动条的功能,用到滑动条,就会遇到这两个东西。creatTrackbar()函数和回调函数的概念。
  • creatTrackbar()
int createTrackerbar(
const string& trackerbarname, //创建滑动条的名字
const string winname, //所在窗口的名字
int* value, //一个指向整型的指针,表示滑块的位置,在创建时,滑块的初始位置就是该变量当前的值。
int count, //滑块可以达到的最大位置的值。滑块最小位置的值始终为0
TrackbarCallback onChange=0, //这个参数和回调函数有关,这是一个指向回调函数地址的指针,当滑动条上位置改变的时候,回调函数就会再次执行,
void* userdata=0//用户传给回调函数的数据,用来处理轨迹条事件。如果使用的value实参是全局变量,可以不去管userdata参数。
);
  • 回调函数
    回调函数里会处理并显示图片,就是每次滑动条滑块被用户拖动一个位置,creatTrackbar()中value值会变化,而且会访问并执行回调函数一次,回调函数里有对图片的相关操作,以及显示操作,所以没动一次滑块,图片显示效果就会不同。这就是拖动滑块代码的执行过程。
    下面分享一个代码,
    注意全局变量的声明和回调函数的固定格式:void
    函数名(int, void*);
/*
功能:画出canny边缘检测的边缘
*/
#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++)
    {
        //Scalar color(rand() & 255, rand() & 255, rand() & 255);
        drawContours(draw, Contours, i, Scalar(255,255,255), 1, 8, Hierarchy);
    }
    imshow("轮廓图", draw);
}
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页