在OpenCv中,使用Mat存图像,有专门的数据类型
一般的图像文件格式使用的是 Unsigned 8bits吧,CvMat矩阵对应的参数类型就是
CV_8UC1,CV_8UC2,CV_8UC3。 其中 U代表 Unsigned 无符号、C代表CvMat 后面的数字代表通道数
(最后的1、2、3表示通道数,譬如RGB3通道就用CV_8UC3)
而float 是32位的,对应CvMat数据结构参数就是:CV_32FC1,CV_32FC2,CV_32FC3...
double是64bits,对应CvMat数据结构参数:CV_64FC1,CV_64FC2,CV_64FC3等。
7.OpenCV 源代码中的定义:
typedef Vec <uchar, 2> Vec2b;
Vec2b—表示每个Vec2b对象中,可以存储2个char(字符型)数据
Vec3b—表示每一个Vec3b对象中,可以存储3个char(字符型)数据,比如可以用这样的对象,去存储RGB图像中的
Vec4b—表示每一个Vec4b对象中,可以存储4个字符型数据,可以用这样的类对象去存储—4通道RGB+Alpha的图
遍历方法就是 用 at 其中现需要 把模板类T 变成Vec4b
for (int i = 0; i < img.rows; i++) {
for (int j = 0; j < img.cols; j++) {
//Mat::at()取值或改变某点的像素值比较耗时,可以采用Mat的模板子类Mat_<T>
//Mat类中的at方法作用:用于获取图像矩阵某点的值或改变某点的值。
double temp = img.at<Vec4b>(i, j)[3] / 255.0;
mat.at<Vec4b>(i, j)[0] = (1 - temp)*back_img.at<Vec4b>(i, j)[0] + temp *img.at<Vec4b>(i, j)[0];
mat.at<Vec4b>(i, j)[1] = (1 - temp)*back_img.at<Vec4b>(i, j)[1] + temp *img.at<Vec4b>(i, j)[1];
mat.at<Vec4b>(i, j)[2] = (1 - temp)*back_img.at<Vec4b>(i, j)[2] + temp *img.at<Vec4b>(i, j)[2];
mat.at<Vec4b>(i, j)[3] = (1 - temp)*back_img.at<Vec4b>(i, j)[3] + temp *img.at<Vec4b>(i, j)[3];
}
}