C++ OpenCV Mat对象中的奇怪像素值
我试图从OpenCVC++ 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::
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。马特