0

私はこのウェブサイトを初めて使用します。投稿に間違いがあった場合はお知らせください。javacv でのヒストグラムの計算と描画に関していくつか質問があります。以下は、私が検索したいくつかの情報に基づいて作成したコードです。

私が得るこのエラーがあります: OpenCV エラー: One of Arguments' values is out of range (index is out of range) in unknown function, file ......\src\opencv\modules\core\src\array .cpp、1691 行目

private CvHistogram getHistogram(IplImage image) {//get histogram data, input has been converted to grayscale beforehand 


    IplImage[] hsvImage1 = {image};
    //bins and value-range
    int numberOfBins = 256;
    float minRange = 0.0f;
    float maxRange = 255.0f;
    // Allocate histogram object
    int dims = 1;
    int[] sizes = new int[]{numberOfBins};
    int histType = CV_HIST_ARRAY;
    float[] minMax = new float[]{minRange, maxRange};
    float[][] ranges = new float[][]{minMax};
    CvHistogram hist = cvCreateHist(dims, sizes, histType, ranges, 1); 
    cvCalcHist(hsvImage1, hist, 0, null);
    return hist;
}

private IplImage DrawHistogram(CvHistogram hist, IplImage image) {//draw histogram
    int scaleX = 1;
    int scaleY = 1;
    int i;
    float[] max_value = {0};
    int[] int_value = {0};
    cvGetMinMaxHistValue(hist, max_value, max_value, int_value, int_value);//get min and max value for histogram

    IplImage imgHist = cvCreateImage(cvSize(256, image.height() ),IPL_DEPTH_8U,1);//create image to store histogram
    cvZero(imgHist);
    CvPoint pts = new CvPoint(5);

    for (i = 0; i < 256; i++) {//draw the histogram 
        float value = opencv_legacy.cvQueryHistValue_1D(hist, i);
        float nextValue = opencv_legacy.cvQueryHistValue_1D(hist, i + 1);

        pts.position(0).x(i * scaleX).y(image.height() * scaleY);
        pts.position(1).x(i * scaleX + scaleX).y(image.height() * scaleY);
        pts.position(2).x(i * scaleX + scaleX).y((int)((image.height() - nextValue * image.height() /max_value[0]) * scaleY));
        pts.position(3).x(i * scaleX).y((int)((image.height() - value * image.height() / max_value[0]) * scaleY));
        pts.position(4).x(i * scaleX).y(image.height() * scaleY);
        cvFillConvexPoly(imgHist, pts.position(0), 5, CvScalar.RED, CV_AA, 0);
    }
    return imgHist;
}

下部にあるいくつかのリンクを検索してみましたが、それぞれの言語が異なるため、Java に正しく変換したかどうかわかりません。正直なところ、疑問に思うことはほとんどありません。次のようなアドバイスを提供できれば幸いです。

  1. float[] max_value = {0}; // インターネットを参照したところ、 cvGetMinMaxHistValue() の構文エラーを取得するのに役立ちました。論理エラーが発生するかどうかはわかりません

  2. pts.position(3).x(i * scaleX).y((int)((image.height() - 値 * image.height() / max_value[0]) * scaleY)); // int を入れて、pts が認識する型にダウンキャストします。もう 1 つ、max_value[0] は 0 です。除算による論理エラーが発生するのではないかと考えています。

使用したリンク:

4

2 に答える 2

0

あなたのエラーはこの部分にあります:

for (i = 0; i < 256; i++) {//draw the histogram 
    float value = opencv_legacy.cvQueryHistValue_1D(hist, i);
    float nextValue = opencv_legacy.cvQueryHistValue_1D(hist, i + 1);

使用するi+1と、範囲外のエラーが発生します。それを修正するには、 foruntilを使用できます。255

お役に立てば幸いです。GL

于 2013-06-27T13:34:43.700 に答える
0

//この public CvHistogram getHistogram(IplImage image) を使用 {//入力は事前にグレースケールに変換されているヒストグラム データを取得

IplImageArray hsvImage1 = splitChannels(image);
//bins and value-range
int numberOfBins = 256;
float minRange = 0.0f;
float maxRange = 255.0f;
// Allocate histogram object
int dims = 1;
int[] sizes = new int[]{numberOfBins};
int histType = CV_HIST_ARRAY;
float[] minMax = new float[]{minRange, maxRange};
float[][] ranges = new float[][]{minMax};

CvHistogram hist = cvCreateHist(dims, sizes, histType, ranges, 1); 
cvCalcHist(hsvImage1, hist, 0, null);
return hist;

}

private IplImageArray splitChannels(IplImage hsvImage) {
    CvSize size = hsvImage.cvSize();
    int depth = hsvImage.depth();
    IplImage channel0 = cvCreateImage(size, depth, 1);
    IplImage channel1 = cvCreateImage(size, depth, 1);
    IplImage channel2 = cvCreateImage(size, depth, 1);
    cvSplit(hsvImage, channel0, channel1, channel2, null);
    return new IplImageArray(channel0, channel1, channel2);
}
于 2013-03-22T19:43:59.460 に答える