です。それで、最初の部分はそれぞれのヒストグラムを計算することです。両方ともすでに(自分自身ではMat
で)分離されているので、OpenCVのcalcHist機能で直接分割する必要はありません。我々が持っているドキュメントによって
:
void calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const float** ranges, bool uniform=true, bool accumulate=false)
だから、実行する必要があります:
cv::Mat histMag, histAng;
// number of bins of the histogram, adjust to your liking
int histSize = 10;
// degrees goes from 0-360 if radians then change acordingly
float rangeAng[] = { 0, 360} ;
const float* histRangeAng = { rangeAng };
double minval, maxval;
// get the range for the magnitude
cv::minMaxLoc(mag, &minval, &maxval);
float rangeMag[] = { static_cast<float>(minval), static_cast<float>(maxval)} ;
const float* histRangeMag = { rangeMag };
cv::calcHist(&mag, 1, 0, cv::NoArray(), histMag, 1, &histSize, &histRangeMag, true, false);
cv::calcHist(&angle, 1, 0, cv::NoArray(), histAng, 1, &histSize, &histRangeAng, true, false);
は今、あなたはhistMag
とhistAng
で見つかった二つのヒストグラムをプロットする必要があります。あなたは大きさのために同じことを行う、または多分変えることができます。これにより
// Draw the histograms for B, G and R
int hist_w = 512; int hist_h = 400;
int bin_w = cvRound((double) hist_w/histSize);
cv::Mat histImage(hist_h, hist_w, CV_8UC3, Scalar(0,0,0));
/// Normalize the result to [ 0, histImage.rows ]
cv::normalize(histAng, histAng, 0, histImage.rows, cv::NORM_MINMAX, -1, Mat());
// Draw the lines
for(int i = 1; i < histSize; i++)
{
cv::line(histImage, cv::Point(bin_w*(i-1), hist_h - cvRound(histAng.at<float>(i-1))) ,
cv::Point(bin_w*(i), hist_h - cvRound(histAng.at<float>(i))),
cv::Scalar(255, 0, 0), 2, 8, 0 );
}
:私は角度のために、それはこのようなものになるだろう、あなたはプロットのラインを持っているコメントで掲示turtorialで
それらが供給された場合にヒストグラムを描画する関数に変換します。ドキュメントで
彼らは我々の場合にそれを適応し、ビンとして四角形を描画するための別のオプションを持って、私たちのようなものを得る:再び
// Draw the histograms for B, G and R
int hist_w = 512; int hist_h = 400;
int bin_w = std::round(static_cast<double>(hist_w)/static_cast<double>(histSize));
cv::Mat histImage(hist_h, hist_w, CV_8UC3, Scalar(0,0,0));
/// Normalize the result to [ 0, histImage.rows ]
cv::normalize(histAng, histAng, 0, histImage.rows, cv::NORM_MINMAX, -1, Mat());
for(int i = 1; i < histSize; i++)
{
cv::rectangle(histImage, cv::Point(bin_w*(i-1), hist_h - static_cast<int>(std::round(histAng.at<float>(i-1)))), cv::Point(bin_w*(i), hist_h),);
}
を、これは中にも大きさのために行うことができます同じ方法。これは非常にシンプルなプロットです。より複雑で美しいプロットが必要な場合は、外部ライブラリを呼び出して計算されたヒストグラム内のデータを渡す必要があります。また、このコードはテストされていないので、タイプミスやエラーが発生する可能性がありますが、何かが失敗した場合は、コメントを書いて解決策を見つけることができます。
私はこれがあなたを助けてくれることを願っています。
[OpenCVチュートリアル](http://docs.opencv.org/2.4/doc/tutorials/imgproc/histograms/histogram_calculation/histogram_calculation.html)を試すと、ヒストグラムを計算しプロットする方法を説明しています。両方の場合に1チャンネルがあるので行列を分割するステップ – api55
@ api55問題は、calHist関数でこれらのパラメータをどこに置くことができるかをマグニチュードと角度をどのように描くことができるかわからないことです。コードを書く時間を少しお与えください。私はopencvの初心者です。ありがとう。 –
私はX軸上の角度とY軸上の大きさを求めたいので、どのようにヒストグラムを使って描くことができますか?できるだけコードを使って指導してください。お気軽に –