前言
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阈值