一:分离和合并颜色通道
split函数,将一个多通道数组分离成几个单通道数组。函数原型:
C++: void split(const Mat& src, Mat*mvbegin);
C++: void split(InputArray m,OutputArrayOfArrays mv);
- 第一个参数,InputArray类型的m或者const Mat&类型的src,填我们需要进行分离的多通道数组。
- 第二个参数,OutputArrayOfArrays类型的mv,填函数的输出数组或者输出的vector容器。
用法:
split(srcImage, channels);//srcImage为读取的图像
merge函数,merge()函数的功能是split()函数的逆向操作,将多个数组组合合并成一个多通道的数组。函数原型:
C++: void merge(const Mat* mv, size_tcount, OutputArray dst)
C++: void merge(InputArrayOfArrays mv,OutputArray dst)
- 第一个参数,mv,填需要被合并的输入矩阵或vector容器的阵列,这个mv参数中所有的矩阵必须有着一样的尺寸和深度。
- 第二个参数,count,当mv为一个空白的C数组时,代表输入矩阵的个数,这个参数显然必须大于1.
- 第三个参数,dst,即输出矩阵,和mv[0]拥有一样的尺寸和深度,并且通道的数量是矩阵阵列中的通道的总数。
用法:
merge(channels, srcImage);
二:创建轨迹条——createTrackbar函数
函数原型:
C++: int createTrackbar(conststring& trackbarname, conststring& winname,
int* value, int count, TrackbarCallback onChange=0,void* userdata=0);
- 第一个参数,const string&类型的trackbarname,表示轨迹条的名字,用来代表我们创建的轨迹条。
- 第二个参数,const string&类型的winname,填窗口的名字,表示这个轨迹条会依附到哪个窗口上,即对应namedWindow()创建窗口时填的某一个窗口名。
- 第三个参数,int* 类型的value,一个指向整型的指针,表示滑块的位置。并且在创建时,滑块的初始位置就是该变量当前的值。
- 第四个参数,int类型的count,表示滑块可以达到的最大位置的值。PS:滑块最小的位置的值始终为0。
- 第五个参数,TrackbarCallback类型的onChange,首先注意他有默认值0。这是一个指向回调函数的指针,每次滑块位置改变时,这个函数都会进行回调。并且这个函数的原型必须为void XXXX(int,void*);其中第一个参数是轨迹条的位置,第二个参数是用户数据(看下面的第六个参数)。如果回调是NULL指针,表示没有回调函数的调用,仅第三个参数value有变化。
- 第六个参数,void*类型的userdata,他也有默认值0。这个参数是用户传给回调函数的数据,用来处理轨迹条事件。如果使用的第三个参数value实参是全局变量的话,完全可以不去管这个userdata参数。
小示例:
createTrackbar("对比度:", "【效果图窗口】",&g_nContrastValue,
300,ContrastAndBright );
获取当前轨迹条的位置——getTrackbarPos函数:
C++: int getTrackbarPos(conststring& trackbarname, conststring& winname);
- 第一个参数,const string&类型的trackbarname,表示轨迹条的名字。
- 第二个参数,const string&类型的winname,表示轨迹条的父窗口的名称。
拓展:
//按下“q”键时,程序退出
while(char(waitKey(1)) != 'q') {}