Scalar数据类型

首先单词scalar的意思是标量,但是我们经常可以看到Scalar是包含多个值的,很像是一个向量,这是怎么回事呢?很是让人感觉困惑。先收起我们的困惑,首先来看看,Scalar的定义:

  1. typedef struct Scalar  
  2. {  
  3.     double val[4];  
  4. }Scalar;  
可以看到,Scalar是一个由长度为4的数组作为元素构成的结构体,Scalar最多可以存储四个值,没有提供的值默认是0。

使用:

Scalar常用的使用场景如下:

  1. Mat M(7,7,CV_32FC2,Scalar(1,3));  

上面的代码表示:创建一个2通道,且每个通道的值都为(1,3),深度为32,7行7列的图像矩阵。CV_32F表示每个元素的值的类型为32位浮点数,C2表示通道数为2,Scalar(1,3)表示对矩阵每个元素都赋值为(1,3),第一个通道中的值都是1,第二个通道中的值都是3.

实例1:

  1. #include <iostream>  
  2. #include <opencv2/highgui/highgui.hpp>  
  3. #include <opencv2/core/core.hpp>  
  4. #include <opencv2/imgproc/imgproc.hpp>  
  5. #include <stdio.h>  
  6. using namespace std;  
  7. using namespace cv;  
  8. void scalar_demo1(){  
  9.     Mat M(4,4,CV_32FC2,Scalar(1,3));  
  10.     cout<<M<<endl;  
  11. }  
  12. void scalar_demo2(){  
  13.     Mat M(4,4,CV_32FC3,Scalar(1,2,3));  
  14.     cout<<M<<endl;  
  15. }  
  16. void scalar_demo3(){  
  17.     Mat M(4,4,CV_32FC4,Scalar(1,2,3));  
  18.     cout<<M<<endl;  
  19. }  
  20. int main(void)  
  21. {  
  22.     //resize_img();  
  23.     //convert_color_space();  
  24.     scalar_demo1();  
  25.     cout<<"**********************************"<<endl;  
  26.     scalar_demo2();  
  27.     cout<<"**********************************"<<endl;  
  28.     scalar_demo3();  
  29.     return 0;  
  30. }  


运行以上代码输出如下,可以发现最后一个矩阵是4通道的,但是我们在初始化的时候只给出了三个通道的值,所以第四个通道的值都默认为0。


实例2:

  1. #include <iostream>  
  2. #include <opencv2/highgui/highgui.hpp>  
  3. #include <opencv2/core/core.hpp>  
  4. #include <opencv2/imgproc/imgproc.hpp>  
  5. #include <stdio.h>  
  6. using namespace std;  
  7. using namespace cv;  
  8.   
  9. void scalar_demo4(){  
  10.     Mat blue_m(256,256,CV_8UC3,Scalar(255,0,0));  
  11.     Mat green_m(256,256,CV_8UC3,Scalar(0,255,0));  
  12.     Mat red_m(256,256,CV_8UC3,Scalar(0,0,255));  
  13.     imshow("Blue",blue_m);  
  14.     waitKey(0);  
  15.     imshow("Green",green_m);  
  16.     waitKey(0);  
  17.     imshow("Red",red_m);  
  18.     waitKey(0);  
  19.       
  20. }  
  21. int main(void)  
  22. {  
  23.     scalar_demo4();  
  24.     return 0;  

### Python中的scalar类型 在Python中,scalar类型通常指的是不可再分的基本数据类型,例如整数(int)、浮点数(float)、布尔值(bool)和字符(str中的单个字符)。这些类型的值具有不可分割的特性,即它们不能再被划分为更小的组成部分[^1]。例如,整数5是一个scalar对象,它不能被进一步拆分成更小的数字单位。scalar类型在Python中扮演着基础数据单位的角色,是构建更复杂数据结构的基石。 与non-scalar类型(如列表、元组、字典等)不同,scalar类型的值是独立且不可再分的。例如,一个列表可以包含多个元素,每个元素本身可以是另一个列表或scalar值,而scalar值则不具备这种可分解性。这种特性使得scalar值在内存中通常占用固定大小的空间,并且可以直接参与数学运算、逻辑判断等操作。 在某些库(如NumPy)中,scalar类型有更明确的定义和实现。例如,NumPy中的scalar类型(如`numpy.int32`、`numpy.float64`)与数组类型(如`ndarray`)相对应,用于表示单个数值[^2]。这些scalar类型与Python原生的int、float等类型在行为上相似,但提供了更精确的控制和更高效的数值运算能力。 ### scalar类型与ndarray的关系 在NumPy中,scalar类型与`ndarray`(多维数组)类型之间存在紧密联系。`ndarray`中的每个元素都是一个scalar值,且所有元素的类型必须一致。这种设计使得`ndarray`能够以高效的内存布局存储大量数据,并支持快速的数值运算。例如,一个`ndarray`可以包含多个`numpy.int32`类型scalar值,这些值在内存中以连续的方式存储,并且可以通过索引访问。 ```python import numpy as np a = np.array([1, 2, 3], dtype=np.int32) print(a[0]) # 输出 scalar 值 1 ``` ### scalar类型的使用场景 scalar类型在编程中具有广泛的应用场景: - **数值计算**:scalar值是数学运算的基本单位,如加法、减法、乘法和除法。 - **逻辑判断**:布尔类型scalar值常用于条件判断和流程控制。 - **图像处理**:在OpenCV等图像处理库中,scalar可以表示颜色值,如四元组(B, G, R, A)表示像素的颜色[^3]。 - **数据建模**:scalar值常用于表示模型中的参数、权重或状态。 ### scalar类型的限制 尽管scalar类型具有高效性和简洁性,但它们也有一定的局限性。例如,scalar值不能直接表示复杂的数据结构,如矩阵或张量。在这种情况下,需要使用`ndarray`或其他容器类型来组织多个scalar值。此外,scalar值的不可变性在某些情况下可能会限制其灵活性,特别是在需要动态修改数据的场景中。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值