0

3チャンネル画像のヒストグラムをプロットしようとしましたが、「opencv_tut.exeの0x752e812fで未処理の例外:Microsoft C ++例外:メモリ位置0x0019ef5cでcv::Exceptionが発生しました。」このエラーが発生し続けます。デバッグすらできず、アセンブリに入り続けます。

問題は、ヒストグラムの線画部分にあり、他の部分は問題なく機能します。

コードは次のとおりです。

void colorHistogram(){

Mat image = imread("c:/aaa.jpg");
vector<Mat> bgr_planes;
split(image, bgr_planes);

if(!image.data){

    cout<<"No image"<<endl;

}

int histSize = 256;
float range[] = {0, 256};
const float* histRange = {range};

Mat b_hist, g_hist, r_hist;

calcHist(&bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRange, true, false);
calcHist(&bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRange, true, false); 
calcHist(&bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, true, false); 

int hist_w = 512;
int hist_h = 400;

int bin_w = cvRound((double) hist_w/histSize);

Mat histImage(hist_h, hist_w, CV_8UC3, Scalar(0,0,0));

normalize(b_hist, b_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
normalize(g_hist, g_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());

for(int i=0; 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  );

}

namedWindow("Histogram", CV_WINDOW_AUTOSIZE);
imshow("Histogram", histImage);

}

4

1 に答える 1

0

おそらく、わがままなポインタか、割り当てられたメモリの範囲を超えています。以前のコードが正しいと思い込まないでください。このような問題は、早期に発生し、後でのみ発生する場合があります。

いずれにせよ、ここでコードを変更したようです:http: //docs.opencv.org/doc/tutorials/imgproc/histograms/histogram_calculation/histogram_calculation.html

主な違いは、forループが0からhistSizeになり、forループが1からhistSizeになることです。このインデックスはループ内の配列の位置を計算するために使用されるので、それがあなたの問題だと思います。

于 2013-03-07T14:23:30.103 に答える