为什么cv :: circle()只在某个RGB值的3D矩阵上显示?

时间:2012-12-17 16:37:02

标签: c++ opencv

我看到一些我没想到的奇怪行为。在CV_64FC3类型的纯白色矩阵(3个通道,浮点值)上,我画了一个彩色圆圈。意外的行为是圆圈实际上只显示某些RGB值。以下是我的程序的两种不同颜色的示例输出:

printing a red circle

printing a gray circle

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

#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();
}

1 个答案:

答案 0 :(得分:5)

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

  

如果图像是32位浮点,则像素值相乘   也就是说,值范围[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();
}

结果:

screenshot

UPD。

  1. 不要使用循环来填充矩阵。 Mat :: zeros(),Mat :: ones()和上面例子中的构造函数看起来好多了.U
  2. 使用特殊的cv :: MatXY类型来防止错误类型的运行时错误。