5

我看到了一些我没想到的奇怪行为。在类型的纯白色矩阵CV_64FC3(3 个通道,浮点值)上,我正在绘制一个彩色圆圈。出乎意料的行为是该圆圈实际上仅针对某些 RGB 值显示。这是我的程序的两种不同颜色的示例输出:

打印一个红色圆圈

打印一个灰色圆圈

显然,灰色圆圈不见了。我的问题:为什么?我怎样才能让它出现?下面是我在一个可以运行的小程序中的示例代码。

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

void main()
{
    const unsigned int diam = 200;
    cv::namedWindow("test_window");
    cv::Mat mat(diam, diam, CV_64FC3);

    // force assignment of each pixel to white.
    for (unsigned row = 0; row < diam; ++row)
    {
        for (unsigned col = 0; col < diam; ++col)
        {
            mat.at<cv::Vec3d>(row, col)[0] = 255;
            mat.at<cv::Vec3d>(row, col)[1] = 255;
            mat.at<cv::Vec3d>(row, col)[2] = 255;
        }
    }

    // big gray circle.
    cv::circle(mat, cv::Point(diam/2, diam/2), (diam/2) - 5, CV_RGB(169, 169, 169), -1, CV_AA);

    cv::imshow("test_window", mat);
    cv::waitKey();
}
4

1 回答 1

5

您正在使用浮点矩阵类型。来自 opencv文档

如果图像是 32 位浮点,则像素值乘以 255。即取值范围 [0,1] 映射到 [0,255]。

这是工作代码:

#include <opencv2/opencv.hpp>

void main()
{
    const unsigned int diam = 200;
    cv::namedWindow("test_window");
    // force assignment of each pixel to white.
    cv::Mat3b mat = cv::Mat3b(diam, diam, cv::Vec3b(255,255,255));

    // big gray circle.
    cv::circle(mat, cv::Point(diam/2, diam/2), (diam/2) - 5, CV_RGB(169, 169, 169), -1, CV_AA);

    cv::imshow("test_window", mat);
    cv::waitKey();
}

结果:

截屏

更新。

  1. 不要使用循环填充矩阵。上面示例中的 Mat::zeros()、Mat::ones() 和构造函数看起来要好得多。U
  2. 使用特殊的 cv::MatXY 类型来防止错误类型的运行时错误。
于 2012-12-17T16:55:31.613 回答