OpenCV学习笔记(19)关于CV_8UC1,CV_8UC2等参数

2024-09-02 19:32

本文主要是介绍OpenCV学习笔记(19)关于CV_8UC1,CV_8UC2等参数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载自 http://blog.csdn.net/maweifei/article/details/51221259

(一)Mat矩阵(图像容器)创建时CV_8UC1,CV_8UC2等参数详解

1--Mat不但是一个非常有用的图像容器类,同时也是一个通用的矩阵类
2--创建一个Mat对象的方法很多,我们现在先看一下Mat矩阵/图像容器类在OpenCv中的有关源代码:

    3--使用Mat图像容器类创建Mat类的对象
    //! default constructorMat();//! constructs 2D matrix of the specified size and type// (_type is CV_8UC1, CV_64FC3, CV_32SC(12) etc.)Mat(int rows, int cols, int type);Mat(Size size, int type);//! constucts 2D matrix and fills it with the specified value _s.Mat(int rows, int cols, int type, const Scalar& s);Mat(Size size, int type, const Scalar& s);//! constructs n-dimensional matrixMat(int ndims, const int* sizes, int type);Mat(int ndims, const int* sizes, int type, const Scalar& s);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

4--使用Matlab风格的函数创建或者初始化Mat类的对象
//! Matlab-style matrix initializationstatic MatExpr zeros(int rows, int cols, int type);static MatExpr zeros(Size size, int type);static MatExpr zeros(int ndims, const int* sz, int type);static MatExpr ones(int rows, int cols, int type);static MatExpr ones(Size size, int type);static MatExpr ones(int ndims, const int* sz, int type);static MatExpr eye(int rows, int cols, int type);static MatExpr eye(Size size, int type);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

  5--我们可以看见,创建Mat矩阵/图像容器类的很多构造方法或者其他成员方法在创建Mat对象的时候,都需要指定type--所创建图像/矩阵的类型6--那么类型是什么呢?OpenCv的源代码中说了一句:
    (_type is CV_8UC1, CV_64FC3, CV_32SC(12) etc.)
  • 1
  • 2
  • 1
  • 2

  7--同样,我们通过转到定义法,看一下CV_8UC1,CV_64FC3等这些宏到底是什么,OpenCv的源代码显示如下(源代码在在types_c.h中):
#define CV_CN_MAX     512
#define CV_CN_SHIFT   3
#define CV_DEPTH_MAX  (1 << CV_CN_SHIFT)#define CV_8U   0
#define CV_8S   1
#define CV_16U  2
#define CV_16S  3
#define CV_32S  4
#define CV_32F  5
#define CV_64F  6
#define CV_USRTYPE1 7#define CV_MAT_DEPTH_MASK       (CV_DEPTH_MAX - 1)
#define CV_MAT_DEPTH(flags)     ((flags) & CV_MAT_DEPTH_MASK)#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
#define CV_MAKE_TYPE CV_MAKETYPE#define CV_8UC1 CV_MAKETYPE(CV_8U,1)
#define CV_8UC2 CV_MAKETYPE(CV_8U,2)
#define CV_8UC3 CV_MAKETYPE(CV_8U,3)
#define CV_8UC4 CV_MAKETYPE(CV_8U,4)
#define CV_8UC(n) CV_MAKETYPE(CV_8U,(n))#define CV_8SC1 CV_MAKETYPE(CV_8S,1)
#define CV_8SC2 CV_MAKETYPE(CV_8S,2)
#define CV_8SC3 CV_MAKETYPE(CV_8S,3)
#define CV_8SC4 CV_MAKETYPE(CV_8S,4)
#define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))#define CV_16UC1 CV_MAKETYPE(CV_16U,1)
#define CV_16UC2 CV_MAKETYPE(CV_16U,2)
#define CV_16UC3 CV_MAKETYPE(CV_16U,3)
#define CV_16UC4 CV_MAKETYPE(CV_16U,4)
#define CV_16UC(n) CV_MAKETYPE(CV_16U,(n))#define CV_16SC1 CV_MAKETYPE(CV_16S,1)
#define CV_16SC2 CV_MAKETYPE(CV_16S,2)
#define CV_16SC3 CV_MAKETYPE(CV_16S,3)
#define CV_16SC4 CV_MAKETYPE(CV_16S,4)
#define CV_16SC(n) CV_MAKETYPE(CV_16S,(n))#define CV_32SC1 CV_MAKETYPE(CV_32S,1)
#define CV_32SC2 CV_MAKETYPE(CV_32S,2)
#define CV_32SC3 CV_MAKETYPE(CV_32S,3)
#define CV_32SC4 CV_MAKETYPE(CV_32S,4)
#define CV_32SC(n) CV_MAKETYPE(CV_32S,(n))#define CV_32FC1 CV_MAKETYPE(CV_32F,1)
#define CV_32FC2 CV_MAKETYPE(CV_32F,2)
#define CV_32FC3 CV_MAKETYPE(CV_32F,3)
#define CV_32FC4 CV_MAKETYPE(CV_32F,4)
#define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))#define CV_64FC1 CV_MAKETYPE(CV_64F,1)
#define CV_64FC2 CV_MAKETYPE(CV_64F,2)
#define CV_64FC3 CV_MAKETYPE(CV_64F,3)
#define CV_64FC4 CV_MAKETYPE(CV_64F,4)
#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

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

    9--通过上面的讲解,现在,我们解读一下OpenCv的源代码:
//【1】CV_8UC1---则可以创建----8位无符号的单通道---灰度图片------grayImg
#define CV_8UC1 CV_MAKETYPE(CV_8U,1)
#define CV_8UC2 CV_MAKETYPE(CV_8U,2)
//【2】CV_8UC3---则可以创建----8位无符号的三通道---RGB彩色图像---colorImg 
#define CV_8UC3 CV_MAKETYPE(CV_8U,3)
//【3】CV_8UC4--则可以创建-----8位无符号的四通道---带透明色的RGB图像 
#define CV_8UC4 CV_MAKETYPE(CV_8U,4)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

(二)Mat矩阵图像容器类创建Mat类对象常用的几种方法:

1)使用Mat矩阵图像容器类的构造函数创建Mat类对象
    //【1】载入原始图像1.jpgMat srcImg=imread("1.jpg",1);//【2】创建一个和原始图像srcImg高和宽一致的8位无符号单通道的灰度图片容器,并且初始化图片为白色255Mat grayImg(srcImg.rows,srcImg.cols,CV_8UC1,Scalar(255));
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4
2)为已经存在的IplImage指针创建信息头
    //【1】声明IplImg指针IplImg* imgTopDown; //【2】将图片加载到内存中imgTopDown=cvLoadImage("1.jpg", CV_LOAD_IMAGE_GRAYSCALE);//【3】为已经存在的imgTopDown指针创建信息头//【4】转换IplImage*--->MatMat mtx(imgTopDown);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
3)利用Create()函数创建Mat矩阵图像容器类的对象
    //【1】载入原始图像1.jpgMat srcImg=imread("1.jpg",1);//【2】创建一个和原始图像srcImg高和宽一致的8位无符号单通道的灰度图片容器,并且初始化图片为白色255Mat dstImg.create(srcImg.rows,srcImg.cols,CV_8UC1);
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4
4)使用Matlab风格的函数创建Mat矩阵图形容器类的对象
    //! Matlab-style matrix initializationstatic MatExpr zeros(int rows, int cols, int type);static MatExpr zeros(Size size, int type);static MatExpr zeros(int ndims, const int* sz, int type);static MatExpr ones(int rows, int cols, int type);static MatExpr ones(Size size, int type);static MatExpr ones(int ndims, const int* sz, int type);static MatExpr eye(int rows, int cols, int type);static MatExpr eye(Size size, int type);//【1】载入原始图像1.jpgMat srcImg=imread("1.jpg",1);//【2】创建一个和原始图像srcImg高和宽一致的8位无符号单通道的灰度图片容器,并且初始化图片为白色255Mat dstImg=Mat::zeros(srcImg.rows,srcImg.cols,CV_8UC3);Mat dstImg=Mat::ones(srcImg.rows,srcImg.cols,CV_8UC3);Mat dstImg=Mat::eye(srcImg.rows,srcImg.cols,CV_8UC3);

这篇关于OpenCV学习笔记(19)关于CV_8UC1,CV_8UC2等参数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1130860

相关文章

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

详解Spring Boot接收参数的19种方式

《详解SpringBoot接收参数的19种方式》SpringBoot提供了多种注解来接收不同类型的参数,本文给大家介绍SpringBoot接收参数的19种方式,感兴趣的朋友跟随小编一起看看吧... 目录SpringBoot接受参数相关@PathVariable注解@RequestHeader注解@Reque

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

java如何调用kettle设置变量和参数

《java如何调用kettle设置变量和参数》文章简要介绍了如何在Java中调用Kettle,并重点讨论了变量和参数的区别,以及在Java代码中如何正确设置和使用这些变量,避免覆盖Kettle中已设置... 目录Java调用kettle设置变量和参数java代码中变量会覆盖kettle里面设置的变量总结ja

spring 参数校验Validation示例详解

《spring参数校验Validation示例详解》Spring提供了Validation工具类来实现对客户端传来的请求参数的有效校验,本文给大家介绍spring参数校验Validation示例详... 目录前言一、Validation常见的校验注解二、Validation的简单应用三、分组校验四、自定义校

SpringBoot中Get请求和POST请求接收参数示例详解

《SpringBoot中Get请求和POST请求接收参数示例详解》文章详细介绍了SpringBoot中Get请求和POST请求的参数接收方式,包括方法形参接收参数、实体类接收参数、HttpServle... 目录1、Get请求1.1 方法形参接收参数 这种方式一般适用参数比较少的情况,并且前后端参数名称必须

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;