0

私はまだヒストグラムの計算を理解しようとしています。他の投稿で述べたように、公式のチュートリアルと私の本のチュートリアルを理解するのに苦労していました。

私がタンカーしているチュートリアルはここにあります: http://docs.opencv.org/doc/tutorials/imgproc/histograms/histogram_calculation/histogram_calculation.html

特に計算されたヒストグラムが描かれている部分を読むのに本当に苦労しました。これには、分割、正規化、hist_w と hist_h の値などの説明なしに与えられた値、およびすべての複雑な線関数が含まれます。

そこで、学んだことを単純な方法で書き、ヒストグラムの動作とその様子を確認することにしました。これは私が書いたものです:

int _tmain(int argc, _TCHAR* argv[])
{
Mat src, dst, final;

src = imread("c:\\car.jpg", 0);

int histsize = 256;
float range[] = {0, 256};
const float* histrange = { range };

bool uniform = true; bool accumulate = false;

calcHist(&src, 1, 0, Mat(), dst, 1, &histsize, &histrange, uniform, accumulate);

for(int h= 0; h<histsize; h++)
{
    float value = dst.at<float>(h);

    line(final, Point(h,(histsize-1)), Point(h, value), Scalar(0,0,0));
}

namedWindow("meh",CV_WINDOW_AUTOSIZE);
imshow("meh", final);
waitKey(0);


return 0;

}

画像はグレースケールで読み込まれるため、分割する必要はありません。そして、単純に calcHist が適用され、それを描画するために line 関数が使用されました。

ただし、呼び出し時に未処理の例外エラーが発生します。これは、単純化された回線機能が原因であると考えています。オンラインのチュートリアルのように、座標の計算は複雑すぎます。

しかし、私はこれがうまくいくはずだと思ったので、説明させてください。最初のループでは h は 0 になるので、座標は になります(0,255) and (0,[value of histogram at 0])。同様に、2 番目のループでは座標は になり(1,255) and (1,[value of histogram at 0])ます。

これは、理論的にはヒストグラムが正しいことです。それはうまくいくはずです..なぜそうではないのですか?

編集:: で壊れますimshow("meh", final);

4

0 に答える 0