1

请问有人能解释一下javacv中cvScalar(double d, double d1, double d2, double d3)方法的四个参数的含义吗?

如何在 cvScalar 中表示黑色?

4

2 回答 2

8

cvScalar 只是一个方便的容器,可以容纳 1、2、3 或 4 个浮点值。
此类元组中数据的含义留给 cvScalar 的用户。
例如,它们可用于保存平面中的点(2 元组)、矩形(4 元组)、RGB 颜色(3 元组)、3D 世界中的点(3 元组)等。 cvScalar 系统地实现为 4 元组,未使用的值设置为 0。

要回答关于 RGB 颜色黑色的问题:

cvScalar cBlack = new cvScalar(0, 0, 0, 0);
// BEWARE: the params for the cvScalar constructor are not in RGB order
//         it is:   new cvScalar(blue, green, red, unused)
//  note how the 4th scalar is unused.

或者,您可以使用 CV_RGB() 便捷方法,如下所示:

CvScalar cBlack = CV_RGB(0, 0, 0);
// here the CV_RGB() arguments are in Red, Green, Blue order.

编辑:因为上面的例子是黑色的,因此所有颜色分量都具有相同的值,因此无法证明存储在 CvScalar 中的 RGB 分量的顺序与传统的红色、绿色、蓝色顺序相反。
便捷方法的CV_RGB()参数是传统的 RGB 顺序,但是 cvScalar 中的存储是按照 Blue、Green、Red 的顺序。
换句话说,CV_RGB 的定义如下:

public static CvScalar CV_RGB(double r, double g, double b) {
    return cvScalar(b, g, r, 0);
}

或者另外说,cvScalar(0, 1, 130, 0)相当于CV_RGB(130, 1, 0),即红色,带有一点绿色。

除了 CV_RGB(),当使用 cvScalars 来获取颜色值时,使用cvScalar.Red(), cvScalar.Blue(),cvScalar.Green()方法来提取单个组件可能很方便,而不必担心这些组件存储在哪里。该类还包括一些用于每种常见颜色的静态实例: cvScalar.GRAYcvScalar.YELLOWcvScalar.BLUE

于 2012-10-19T05:58:23.520 回答
1

cvScalar 是一个由 4 个双精度数组成的通用数组。数据类型通常用于表示像素值,例如:

CvScalar blue = CV_RGB(64, 64, 255);

其余的双精度值在构造函数中设置为 0,其取值少于 4 个。

cvGet2D 是另一个以 CvScalar 形式返回像素值的函数

读取单个像素的最简单方法是使用 cvGet2D() 函数

CvScalar cvGet2D(const CvArr*, int row, int col);

此函数采用三个参数:指向数据容器 (CVArr*) 的指针以及行和列位置的数组索引。数据容器可以是 IplImage 结构。像素的最上一行是 row=0,最下一行是 row=height-1。

cvGet2D() 函数返回一个 C 结构体 CvScalar,定义为

typedef struct CvScalar { double val[4]; } CvScalar;

每个通道的像素值在 val[i] 中。对于灰度图像,val[0] 包含像素 > 亮度。其他三个值设置为 0。对于三通道 BGR 图像,blue=val[0]、>green=val[1] 和 red=val[2]。

http://www.cognotics.com/opencv/servo_2007_series/part_1/page_4.html

于 2012-10-19T05:58:14.220 回答