C++ OpenCV Mat对象中的奇怪像素值

C++ OpenCV Mat对象中的奇怪像素值,c++,opencv,rgb,pixel,scalar,C++,Opencv,Rgb,Pixel,Scalar,我试图从OpenCVMat对象中提取像素。当我将它们提取为Vec4b时,效果很好,但当我使用标准的标量(afaik)时,我会得到奇怪的数字。如何使用标量并正确解释数字 用于提取像素(0,0)的代码,一次作为Vec4b,一次作为Scalar(实际上是Scalar\uu): 我期待一些乳黄色,所以我认为Vec3b是正确的。这很有趣: 对于灰度,您通常会使用cv::Scalar如下: Scalar myColor = stroke.at<uchar>(Point(x, y)); std::

我试图从OpenCV
Mat
对象中提取像素。当我将它们提取为
Vec4b
时,效果很好,但当我使用标准的
标量(afaik)时,我会得到奇怪的数字。如何使用标量并正确解释数字

用于提取像素(0,0)的代码,一次作为Vec4b,一次作为Scalar(实际上是Scalar\uu):


我期待一些乳黄色,所以我认为
Vec3b
是正确的。

这很有趣:

对于灰度,您通常会使用
cv::Scalar
如下:

Scalar myColor = stroke.at<uchar>(Point(x, y));
std::cout << myColor.val[0] << std::endl;;
Vec3b myColor = stroke.at<Vec3b>(Point(x, y));
 for(int i = 0; i < 3; i++) std::cout << myColor.val[i] << " ";
顾名思义(如图所示),标量是单个单位,而不是向量单位。这可能会与显示的文档相混淆。但是,如果必须将值作为
cv::Scalar
类型,您可以做的是,只需将每个
vec3b
索引分配给自己的标量。i、 e:

cv::Scalar b = vec[0];
cv::Scalar g = vec[1];
cv::Scalar r = vec[2];

这很有趣:

对于灰度,您通常会使用
cv::Scalar
如下:

Scalar myColor = stroke.at<uchar>(Point(x, y));
std::cout << myColor.val[0] << std::endl;;
Vec3b myColor = stroke.at<Vec3b>(Point(x, y));
 for(int i = 0; i < 3; i++) std::cout << myColor.val[i] << " ";
顾名思义(如图所示),标量是单个单位,而不是向量单位。这可能会与显示的文档相混淆。但是,如果必须将值作为
cv::Scalar
类型,您可以做的是,只需将每个
vec3b
索引分配给自己的标量。i、 e:

cv::Scalar b = vec[0];
cv::Scalar g = vec[1];
cv::Scalar r = vec[2];
要使
.at()
函数正常工作,必须正确指定图像矩阵的组件数据类型。如果不这样做,像素的二进制数据就会被误解,从而得到意外的结果

正确提取像素值后,可以将其转换为所需的任何其他通用
标量类型。通常,您将其转换为
标量
,这实际上是
标量
的别名。转换是通过使用赋值运算符(
=
)隐式完成的

更多详情:

大多数图像矩阵都带有类型代码CV_8UC4(4个通道,红色、绿色、蓝色和alpha)。例如,当您从JPG文件加载彩色图像时,图像矩阵将采用这种格式。
8U
表示“每个通道8位,无符号整数”,而
C4
表示“每个矩阵元素4个通道”。相应的C++类型的元素是<代码>标量符号。您必须将其指定给泛型
.at()
函数才能使其正常工作:

mat.at<Scalar_<uchar>>(y, x)
要使
.at()
函数正常工作,必须正确指定图像矩阵的组件数据类型。如果不这样做,像素的二进制数据就会被误解,从而得到意外的结果

正确提取像素值后,可以将其转换为所需的任何其他通用
标量类型。通常,您将其转换为
标量
,这实际上是
标量
的别名。转换是通过使用赋值运算符(
=
)隐式完成的

更多详情:

大多数图像矩阵都带有类型代码CV_8UC4(4个通道,红色、绿色、蓝色和alpha)。例如,当您从JPG文件加载彩色图像时,图像矩阵将采用这种格式。
8U
表示“每个通道8位,无符号整数”,而
C4
表示“每个矩阵元素4个通道”。相应的C++类型的元素是<代码>标量符号。您必须将其指定给泛型
.at()
函数才能使其正常工作:

mat.at<Scalar_<uchar>>(y, x)

谢谢你提供到目前为止的信息。我只是想坚持一些标准,因为这通常是最好的方式。我读到像素值通常作为标量传递,所以我尝试这样做。如果这不是彩色图像的最佳方式,那么我不应该使用标量。您的上一个示例是否完全否定了标量类包含(颜色)像素的所有信息的想法?因此,在编写本文时,我始终假设
标量
不能用作多维类型。但是仔细阅读文档,我想它最多可以使用4d。但是它确实提到了它是从
vec
类派生的,所以我想如果你想使用它,那就取决于你了。将多维事物称为标量对我来说也是出乎意料的。我想我们必须在OpenCV中处理此类内容。感谢您提供的信息。我只是想坚持一些标准,因为这通常是最好的方式。我读到像素值通常作为标量传递,所以我尝试这样做。如果这不是彩色图像的最佳方式,那么我不应该使用标量。您的上一个示例是否完全否定了标量类包含(颜色)像素的所有信息的想法?因此,在编写本文时,我始终假设
标量
不能用作多维类型。但是仔细阅读文档,我想它最多可以使用4d。但是它确实提到了它是从
vec
类派生的,所以我想如果你想使用它,那就取决于你了。将多维事物称为标量对我来说也是出乎意料的。我猜我们必须在OpenCV中处理这种事情。
stroke
是如何定义的?stroke
是如何定义的?你救了我的命。每一个地方都只说3D图像和Vec3b。马特,你救了我的命。每一个地方都只说3D图像和Vec3b。马特