0%

OpenCV 3.4 Scalar 参数说明,与 CvType 结合使用

我们在学习OpenCV 时,发现在构造 Mat 时,会有2个关键参数,一个 CvType,一个 Scalar。很多人不明白这2个参数的意思,所以在把别人例子拿来使用或自己写的的时候发现这个参数不知道该怎么填。本文就将 Scalar 参数详细的说明下。

Scalar 是一个配合 CvType 使用的参数,如果你不了解 CvType,可以先看看我写的 OpenCV 3.4 读懂 CvType 类型说明 了解什么是图像通道,CvType 的构造。

本文下列实例均是 JAVA 代码,其他语言实现类同

Scalar 构造器

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
public class Scalar {
public double[] val;

public Scalar(double v0, double v1, double v2, double v3) {
this.val = new double[]{v0, v1, v2, v3};
}

public Scalar(double v0, double v1, double v2) {
this.val = new double[]{v0, v1, v2, 0.0D};
}

public Scalar(double v0, double v1) {
this.val = new double[]{v0, v1, 0.0D, 0.0D};
}

public Scalar(double v0) {
this.val = new double[]{v0, 0.0D, 0.0D, 0.0D};
}

public Scalar(double[] vals) {
if (vals != null && vals.length == 4) {
this.val = (double[])vals.clone();
} else {
this.val = new double[4];
this.set(vals);
}

}

.......
}

可以看到有5个构造函数,参数也不复杂,很容易理解。除开 public Scalar(double[] vals) 这个数组入参的构造函数,其他4个构造函数分别是传入1个、2个、3个、4个 double 类型的构造函数,那么这些参数代表什么意思,他的取值范围是什么?

Scalar 参数的含义

Scalar 一定是与 CvType 结合使用的,他代表 CvType 中指定通道的值。如果您不了解 CvType,可以先看看我写的 OpenCV 3.4 读懂 CvType 类型说明 了解什么是图像通道,CvType 的构造。

构造说明:

  1. 构造函数的入参(值)的数量 <= 通道数量 [如果是2通道图像,用4个参数的构造函数,后面2个参数不起作用]
  2. 构造函数的入参(值)的数量 < 通道数量 时,未传入值的通道值为0
  3. 多通道图像时,入参顺序 new Scalar(B,G,R,alpha)

下面来看示例:

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81

import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;

import org.junit.Test;
import org.opencv.core.Size;

public class TestScalar {

/**
* 创建灰色图像
*/
@Test
public void createGrayImage(){
//选择一个单通道类型 CV_8UC1
//单通道下 0 为黑,255为白,取中间值 125 ,灰色。
Mat sourceImage = new Mat(100,100, CvType.CV_8UC1, new Scalar(125));
Imgcodecs.imwrite("savePath/gary-image.png",sourceImage);
}

/**
* 创建蓝色图像
*/
@Test
public void createBlueImage(){
//蓝色为彩色图,所以通道类型为3通道,CV_8UC3
//蓝色是 RGB 中的 B,其RGB值为 R:0 , G:0 , B:255
//Scalar 入参顺序为 new Scalar(B,G,R,A)。
//new Scalar(255) 的意思为 B 通道值为255 ,G、R 值不传递的话,默认为0

Mat sourceImage = new Mat(100,100, CvType.CV_8UC3, new Scalar(255));
Imgcodecs.imwrite("savePath/blue-image.png",sourceImage);
}

/**
* 创建绿色图像
*/
@Test
public void createGreenImage(){
//绿色为彩色图,所以通道类型为3通道,CV_8UC3
//绿色是 RGB 中的 G,其RGB值为 R:0 , G:255 , B:0
//Scalar 入参顺序为 new Scalar(B,G,R,A)。
//new Scalar(0,255) 的意思为 B 通道值为0,G通道值为255,R 值不传递的话,默认为0

Mat sourceImage = new Mat(100,100, CvType.CV_8UC3, new Scalar(0,255));
Imgcodecs.imwrite("savePath/green-image.png",sourceImage);
}

/**
* 创建红色图像
*/
@Test
public void createRedImage(){
//红色为彩色图,所以通道类型为3通道,CV_8UC3
//红色是 RGB 中的 R,其RGB值为 R:255 , G:0 , B:0
//Scalar 入参顺序为 new Scalar(B,G,R,A)。
//new Scalar(0,0,255) 的意思为 B 通道值为 0,G 通道值为 0,R 通道值为 255

Mat sourceImage = new Mat(100,100, CvType.CV_8UC3, new Scalar(0,0,255));
Imgcodecs.imwrite("savePath/red-image.png",sourceImage);

}


/**
* 创建透明图像
*/
@Test
public void createAlphaImage(){
//透明图像为4通道图像,所以通道类型为4通道,CV_8UC4
//创建一个半透明的红色图像来试试
//红色是 RGB 中的 R,其RGB值为 R:255 , G:0 , B:0
//Scalar 入参顺序为 new Scalar(B,G,R,A)。
//new Scalar(0,0,255,125) 的意思为 B 通道值为 0,G 通道值为 0,R 通道值为 255,Alpha 通道值为125 (255为不透明,0为全透明会忽略所有的 RGB 颜色)

Mat sourceImage = new Mat(100,100, CvType.CV_8UC4, new Scalar(0,0,255,125));
Imgcodecs.imwrite("savePath/alpha-image.png",sourceImage);
}
}

通过上边的例子,应该已经明白 Scalar 的意思了吧,就是通道的值

Scalar 参数的数据范围

处理 Alpha 通道值为 0~255 ,其他通道取值范围根据图像的位数(Bite)来决定。可以查看OpenCV 3.4 读懂 CvType 类型说明 了解什么是图像通道,CvType 的构造,后面后各 Bite 下通道的取值范围。