vec3b、vec3f和CV_8UC3、CV_32FC3的含义和掩膜抠图经验

作者:RayChiu_Labloy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处


 目录

vec3b、vec3f等的含义:

CV_8UC3、CV_32FC3等的含义:

掩膜抠图过程中的坑:


vec3b、vec3f等的含义:

格式:CV_(S|U|F)C

解释:

1--bit_depth---比特数---代表8bite,16bites,32bites,64bites---举个例子吧--比如说,如
        如果你现在创建了一个存储--灰度图片的Mat对象,这个图像的大小为宽100,高100,那么,现在这张
        灰度图片中有10000个像素点,它每一个像素点在内存空间所占的空间大小是8bite,8位--所以它对
        应的就是CV_8
2--S|U|F--S--代表---signed int---有符号整形
               U--代表--unsigned int--无符号整形
               F--代表--float---------单精度浮点型
3--C----代表---一张图片的通道数,比如:
         1--灰度图片--grayImg---是--单通道图像
         2--RGB彩色图像---------是--3通道图像
         3--带Alph通道的RGB图像--是--4通道图像

CV_8UC3、CV_32FC3等的含义:

Vec的表示 ---- Vec2b,Vec3b,Vec2s,Vec3s
(1)Vec2b—表示每个Vec2b对象中,存储2个char(字符型)数据
typedef Vec Vec2b; 、
(2)Vec3b—表示每一个Vec3b对象中,存储3个char(字符型)数据,比如用这样的对象,去存储RGB图像中的一个像素点
typedef Vec Vec3b;
(3)Vec4b—表示每一个Vec4b对象中,存储4个字符型数据,用这样的类对象去存储—4通道RGB+Alpha的图像中的像素点
typedef Vec Vec4b;
(4)Vec2s—表示这个类的每一个类对象,存储2个short int(短整型)的数据
typedef Vec Vec2s;
typedef Vec Vec3s;
typedef Vec Vec4s;

Vec的表示—Vec3b Vec3f
8U 类型的 RGB 彩色图像可以使用Vec3b
3 通道 float 类型的矩阵可以使用Vec3f
对于 Vec 对象,可以使用 [ ] 符号如操作数组般读写其元素,

Vec3b color; //用 color 变量描述一种 RGB 颜色
color[0] = 255; //0通道的B 分量
color[1] = 0; //1通道的G 分量
color[2] = 0; //2通道的R 分量

掩膜抠图过程中的坑:

vec3b、vec3f和CV_8UC3、CV_32FC3的含义和掩膜抠图经验_第1张图片

imgSamll是我的彩色三通道原图,每个通道的元素值类型是UNIT8的,mask是我准备的掩膜,本来想用mask来把彩色图对应的ROI区域抠出来,没想到最终输出的dst是三通道的“灰色图效果”

vec3b、vec3f和CV_8UC3、CV_32FC3的含义和掩膜抠图经验_第2张图片

后来发现是初始dst的元素值类型为float的和imgSmall不对应导致。

正确抠图方式:

//输出图像分配内存
	Mat dst = Mat::zeros(imgSmall.size(), CV_8UC3);
	//掩码
	Mat mask = imgThresh;
	//只保留
	for (int r = 0; r < imgSmall.rows; r++)
	{
		for (int c = 0; c < imgSmall.cols; c++)
		{
			if (mask.at(r, c) == 255)
			{
				dst.at(r, c)[0] = imgSmall.at(r, c)[0];
				dst.at(r, c)[1] = imgSmall.at(r, c)[1];
				dst.at(r, c)[2] = imgSmall.at(r, c)[2];
			}
		}
	}

【如果对您有帮助,交个朋友给个一键三连吧,您的肯定是我博客高质量维护的动力!!!】

你可能感兴趣的:(机器视觉,图像处理,计算机视觉,opencv,图像处理)