5

予期していなかった奇妙な動作が見られます。CV_64FC3タイプ(3 チャネル、浮動小数点値)の純白のマトリックスで、色付きの円を描いています。予期しない動作は、円が実際には特定の RGB 値に対してのみ表示されることです。これは、2 つの異なる色に対する私のプログラムのサンプル出力です。

赤い丸を印刷する

灰色の円を印刷する

明らかに、灰色の円がありません。私の質問: なぜですか? そして、どうすればそれを表示できますか?以下は、実行できる小さなプログラムのサンプル コードです。

#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

float マトリックス型を使用しています。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 に答える