2017-9-15Opencv 杂
Mat::at()的具体含义。指的是三通道。(0),(1),(2)分别表示BGR;
Vector<Mat>结构的使用。将Mat类型的数据转化成了具有多个单通道的容器?
灰度图的具体含义。和单通道的区别。灰度图即是单通道图,表示只有一个通道有值,那此时不应该是显示为这个通道的颜色吗?
Mat bw = threshval < 128 ? (img < threshval) : (img > threshval);这里的用法 img 是一个Mat的对象,由于Mat重载了operator.因此 img<threshval) 的意思是二值化。
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参数。
这里是一个相互的过程,第五个参数是用户自己写的函数,结构要求传入两个参数,其中第一个为进度条目前位置,可用做在用户函数中使用,第二个参数为用户传入的参数,可以不传入。传入的方式就是写在第六个参数上。
图像像素的访问方式
为了访问图像的每一个像素,我们使用这样的语法: image.at<Vec3b>(y,x)[c]
其中,y是像素所在的行, x是像素所在的列, c是R、G、B(对应0、1、2)其中之一。
因为我们的运算结果可能超出像素取值范围(溢出),还可能是非整数(如果是浮点数的话),所以我们要用saturate_cast对结果进行转换,以确保它为有效值。
图片的亮度和对比度的调整(像素点操作,分别对三个通道进行的操作)g(i,j)=a*f(i,j)+b;其中a可以提高对比度,b可以提高亮度。