c++ - 来自 OpenCV Mat 对象的奇怪像素值

标签 c++ opencv rgb pixel scalar

我正在尝试从 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, %i\n", vec[0], vec[1], vec[2]);
cv::Scalar sca = stroke.at<cv::Scalar>(0, 0);
printf("sca: %5.1f, %5.1f, %5.1f\n", 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] << " ";

顾名思义(如 here 所示)标量是单个单位而不是 vector 单位。这可能会与显示的文档混淆 here .但是如果你必须将你的值作为 cv::Scalar 类型,你可以做什么,你可以将每个 vec3b 索引分配给它自己的标量。即:

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

关于c++ - 来自 OpenCV Mat 对象的奇怪像素值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26149961/

相关文章:

c++ - 使用 Floyd-Warshall 查找所有最短路径和距离

c++ - Windows 中的堆随机化

python - 2 个 ArUco 标记平面之间的角度

jquery - 如何使用 jQuery 获取元素的框阴影颜色?

javascript - 如何使用 HTML5 canvas 生成彩虹圈?

c++ - 从派生类访问基类公共(public)成员

c++ - 在 C++ 中处理复合异步函数

python - 从 RGB 转换为 LAB 色彩空间——是否了解 L*A*B* 值的范围?

c++ - 问题乘以 Mat 矩阵

python - RGB循环Python