OpenCV Mat对象的奇怪像素值
Weird pixel values from OpenCV Mat object
我正在尝试从OpenCV Mat
对象中提取像素。当我将它们提取为Vec4b
时,效果很好,但当我使用标准的Scalar
(afaik)时,我会得到奇怪的数字。如何使用Scalar
并正确解释数字?
用于提取像素(0,0)的代码,一次作为Vec4b
,一次为Scalar
(实际上是Scalar_<double>
):
cv::Vec4b vec = stroke.at<cv::Vec4b>(0, 0);
printf("vec: %i, %i, %in", vec[0], vec[1], vec[2]);
cv::Scalar sca = stroke.at<cv::Scalar>(0, 0);
printf("sca: %5.1f, %5.1f, %5.1fn", sca[0], sca[1], sca[2]);
输出:
vec: 223, 178, 77
sca: -91331626426359316704088074967484318223735050578187982644502863694523413598032925912253837118690612448172200441235555626964757579094862898778997953403371230682094365379726071857064466448183314663075981261984082516073752896735112503485663679145991425485597914964276617645535969580912538709979773360278601728.0, ...
我期待一些乳黄色,所以我认为Vec3b
是正确的。
这很有趣:
对于灰度,您通常会使用cv::Scalar
,如下所示:
Scalar myColor = stroke.at<uchar>(Point(x, y));
std::cout << myColor.val[0] << std::endl;;
对于3-channel
彩色图像,您需要cv::vec3b
,如下所示:
Vec3b myColor = stroke.at<Vec3b>(Point(x, y));
for(int i = 0; i < 3; i++) std::cout << myColor.val[i] << " ";
顾名思义(如图所示),标量是单个单位,而不是矢量单位。这可能会与此处显示的文档混淆。但是,如果必须将您的值作为cv::Scalar
类型,您可以将每个vec3b
索引分配给自己的标量。即:
cv::Scalar b = vec[0];
cv::Scalar g = vec[1];
cv::Scalar r = vec[2];
要使.at<_Tp>()
函数正常工作,必须正确指定图像矩阵的组件数据类型。如果你不这样做,像素的二进制数据会被误解,你会得到意想不到的结果。
正确提取像素值后,可以将其转换为所需的任何其他通用Scalar_<_Tp>
类型。通常,您将其转换为Scalar
,这实际上是Scalar_<double>
的别名。转换是通过使用赋值运算符(=
)隐式完成的。
更多详细信息:
大多数图像矩阵都带有类型代码CV_8UC4
(4个通道,红色、绿色、蓝色和alpha)。例如,当您从JPG文件加载彩色图像时,图像矩阵将采用这种格式。CCD_ 20表示";每个通道8位,无符号整数";并且CCD_ 21表示";每个矩阵元素4个信道";。相应的C++类型的元素是CCD_ 22。您必须将其指定给通用.at<_Tp>()
函数才能使其工作:
mat.at<Scalar_<uchar>>(y, x)
在正确提取Scalar_<uchar>
之后,您可以通过分配自动将其转换为Scalar
(实际上是Scalar_<double>
):
cv::Scalar scalar = mat.at<cv::Scalar_<uchar>>(0, 0);
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 将 cv::Mat 转换为无符号的 int 像素
- 如何从C 中的CV :: MAT图像中有效提取某些像素
- opencv::Mat,从原始数据中获取像素值
- 访问图像像素;MatIterator_<> 和 Mat::at 运算符的比较
- 在本机中访问 MAT 像素
- (OPENCV RC1)什么导致MAT乘法比每像素乘法慢20倍
- 如何计算 OpenCV 中 Mat 的最大像素值
- 如何在 openCV 中修改 cv::Mat 的像素数据
- 使用 Mat::at<Vec3i> Point 未构造正确的像素
- 如何将像素设置为cv::Mat对象中的值
- 在OpenCV中循环通过16位Mat的像素的有效方法
- Opencv Mat的可视化像素
- 如何从Mat变量编辑/读取OpenCv中的像素值
- C++ OpenCV 函数"mat.at<Vec3b>(Point(j, i))"无法生成正确的像素值并崩溃
- 尝试设置cv::Mat的像素值时引发分段错误
- OpenCV Mat对象的奇怪像素值
- OpenCV从Mat图像中获取像素通道值
- 获取uint8 Mat的像素值
- 将cv::Scalar的值设置为opencv中cv::Mat中的一个像素的正确(最佳)方法是什么?