OpenCV中提供了许多操作图像的函数,但是有时候我们需要直接操作像素来实现我们的功能,这篇文章总结了OpenCV中常见的操作像素的方法。
像素类型
不同的图像有不同的像素类型,不过对于不同的像素类型,需要在模板参数传入不同的值。首先像素的数据类型包括CV_32U,CV_32S,CV_32F,CV_8U,CV_8UC3等,那这些类型都是什么含义呢。第一个数字表示比特数,第二个数字就表示C++中数据类型,如果还有后面两个字符,这两个字符表示通道数。例如对于CV_32U,表示具有32比特的unsigned int类型;对于CV_8UC3,表示具有8比特,并且有三个通道的unsigned char类型。对于这个类型,可以使用type()来获取。
根据这些类型,又可以分为两种,一种单通道的,一种多通道的。单通道的一个像素用一个数值表示即可,而多通道的一个像素需要用多个像素表示,最常用的三通道就需要RGB这三个数值来表示。那具体的通道顺序是什么呢?在OpenCV中,则是按BGR的顺序来存储的,用数字代替就是B用channels[0]来获取,G用channels[1]来获取,R用channels[2]来获取。Opencv的设计者就是这样设计的,记住就好了。
访问像素
cv::Mat有个at()方法,可以访问图像的单个像素,同时at()方法又是一个模板方法,所以在使用的时候需要传入图像像素的类型,而且这个类型不像C++中的运算类型一样可以自动转换,所以必须准确的传入图像元素类型。
对于单通道元素来说,元素类