1

だから私はopencvの学習を続けており、ヒストグラム関数に苦労しています。私は calcist 関数を明確に理解しており、コードはそこまで機能しますが、その描画は理解できません。

line 関数を使用して 2 点間の線を作成することはわかっていますが、与えられた点の座標は本当に混乱します。

ここにあるオンライン チュートリアルに従っています: http://docs.opencv.org/doc/tutorials/imgproc/histograms/histogram_calculation/histogram_calculation.htmlまた、OpenCV クックブック バージョン 2 に従っています。

オンライン チュートリアルによる線の計算は、次のようにステップ 7 にあります。

 for( int i = 1; i < histSize; i++ )
  {
      line( histImage, Point( bin_w*(i-1), hist_h - cvRound(b_hist.at<float>(i-1)) ) ,
                       Point( bin_w*(i), hist_h - cvRound(b_hist.at<float>(i)) ),
                       Scalar( 255, 0, 0), 2, 8, 0  );
      line( histImage, Point( bin_w*(i-1), hist_h - cvRound(g_hist.at<float>(i-1)) ) ,
                       Point( bin_w*(i), hist_h - cvRound(g_hist.at<float>(i)) ),
                       Scalar( 0, 255, 0), 2, 8, 0  );
      line( histImage, Point( bin_w*(i-1), hist_h - cvRound(r_hist.at<float>(i-1)) ) ,
                       Point( bin_w*(i), hist_h - cvRound(r_hist.at<float>(i)) ),
                       Scalar( 0, 0, 255), 2, 8, 0  );
  }

正直なところ、512 と 400 が選択された理由について、それと hist_h と hist_w の値を理解するのに苦労しました。

そこで、これについて本を調べたところ、同じ問題が次のように取り組まれていることがわかりました。

// Compute histogram first
cv::MatND hist= getHistogram(image);
// Get min and max bin values
double maxVal=0;
double minVal=0;
cv::minMaxLoc(hist, &minVal, &maxVal, 0, 0);
// Image on which to display histogram
cv::Mat histImg(histSize[0], histSize[0], 
CV_8U,cv::Scalar(255));
// set highest point at 90% of nbins
int hpt = static_cast<int>(0.9*histSize[0]);
// Draw a vertical line for each bin 
for( int h = 0; h < histSize[0]; h++ ) {
float binVal = hist.at<float>(h);
int intensity = static_cast<int>(binVal*hpt/maxVal);
// This function draws a line between 2 points 
cv::line(histImg,cv::Point(h,histSize[0]),
cv::Point(h,histSize[0]-intensity),
cv::Scalar::all(0));
}
return histImg;
}

ここで2番目の点の座標は cv::Point(h,histSize[0]-intensity)私が理解していないものです。なぜそれから強度をマイナスするのですか?

これは本当にばかげた質問かもしれませんが、申し訳ありませんが、ここで指定された座標を理解していません..十分な例をグーグルで検索しましたが、これを解決するための助けが見つかりませんでした.

だから、私がここで求めているのは、どちらかの方法で与えられた座標系を誰かに説明してもらえないかということです。本当にありがたいです。

ありがとうございました

PS また、ここで histsize = 256 であることに注意したいと思います

4

1 に答える 1

1

2番目のコード例について話します。

OpenCV では、座標系は左上から始まります。したがって、マトリックスのエントリ 0,0 は左上、0,(cols-1) は右上、(rows-1),0 は左下、(rows-1),(cols- 1) 右下。

人間は、ヒストグラムが画像の下から始まることを期待しています。それを達成するには、座標を否定し、0 ではなく (rows-1) から開始します。この例では、rows == histsize[0].

コードにバグがあります:

座標…,histsize[0]が無効です! 行列の行は から0までhistsize[0] - 1!

于 2012-10-19T22:51:45.397 に答える