VS2010下opencv阈值操作

前言

OpenCV算法是值得单独拿出来学习的,opencv包含很多模块,如Calib3d模块、imgproc图像处理模块、ml机器学习模块等等。今天算是一个开始,学习将opencv中几种阈值操作改变参数动态显示(createTrackbar)

代码可参考博主@IT1995 https://blog.csdn.net/qq78442761/article/details/54312945

我也是跟着博主@IT1995在学习

今天就讲下自己的理解

代码这么写,可以

int main()
{
    Mat src = imread("lena.jpg");
    Mat src1;
    Mat dst;

    namedWindow("原图");
    imshow("原图",src);

    //转换为灰度图

    cvtColor(src,src1,COLOR_RGB2GRAY);

    //阈值操作(二进制阈值)
    threshold(src1,dst,100,255,THRESH_BINARY);

    namedWindow("效果图");
    imshow("效果图",dst);

    waitKey(0);
    return 0;
}

但是也能做很大改进,如下:

#define WINDOW_NAME "效果图"
Mat srcImage,grayImage,dstImage;
int nThresholdValue = 100;
int nThresholdType = 3;

void on_Threshold(int,void*)
{
    threshold(grayImage,dstImage,nThresholdValue,255,nThresholdType);
    imshow(WINDOW_NAME,dstImage);
}

int main()
{
    srcImage = imread("lena.jpg");

  //加个判断
    if (!srcImage.data)
    {
        printf("读取图片失败!\n");
        return -1;
    }

    cvtColor(srcImage,grayImage,COLOR_RGB2GRAY);

    namedWindow(WINDOW_NAME);

    namedWindow("原图");
    imshow("原图",srcImage);


    createTrackbar("模式",WINDOW_NAME,&nThresholdType,4,on_Threshold);
    createTrackbar("参数值",WINDOW_NAME,&nThresholdValue,255,on_Threshold);
    on_Threshold(0,0);

    waitKey(0);
    return 0;
}

其中有点不好理解的就是createTrackbar(),和 on_Threshold(int,void*),此时可以选中createTrackbar,转到定义,就能够看到它的函数原型

int createTrackbar(const string& trackbarname, const string& winname,
                              int* value, int count,
                              TrackbarCallback onChange = 0,
                              void* userdata = 0);

其中第5个参数,在该函数原型(转到highgui.hpp文件中)的上面一行就有定义

 void (CV_CDECL *TrackbarCallback)(int pos, void* userdata); 简化下 void xxx (int , void*)

这就可以理解为什么on_Threshold(int,void*)的形参是这样了,

另外,因为窗口名const string& winname 这里用了全局变量 #define WINDOW_NAME,所以createTrackbar()中最后一个参数userdata可以省略。

最后附上效果图

可以看到模式从0~4变化

选中threshold 转到定义,进到imgproc.hpp文件中

double threshold( InputArray src, OutputArray dst,
                               double thresh, double maxval, int type );

 // ! type of the threshold operation
enum { THRESH_BINARY=CV_THRESH_BINARY, THRESH_BINARY_INV=CV_THRESH_BINARY_INV,
       THRESH_TRUNC=CV_THRESH_TRUNC, THRESH_TOZERO=CV_THRESH_TOZERO,
       THRESH_TOZERO_INV=CV_THRESH_TOZERO_INV, THRESH_MASK=CV_THRESH_MASK,
       THRESH_OTSU=CV_THRESH_OTSU };

可以看到有7种阈值操作,二值化阈值、反二值化阈值、截断、小于thresh阈值的置零.、模板、 OSTU阈值

猜你喜欢

转载自blog.csdn.net/naozhuo0615/article/details/82379755
今日推荐