1

3 チャネルの画像でヒストグラム逆投影を実行しようとすると、次のエラーが発生します。

OpenCV エラー: histPrepareImages、ファイル ../modules/imgproc/src/histogram.cpp、行 148 でアサーションが失敗しました (j < nimages)

失敗するコード:

cv::Mat _refImage; //contains reference image of type CV_8UC3
cv::Mat output;    //contains image data of type CV_8UC3
int histSize[] = {16, 16, 16};
int channels[] = {0, 1, 2};
const float hRange[] = {0.f, 256.f};
const float* ranges[] = {hRange, hRange, hRange};
int nChannels = 3;

cv::Mat hist;
cv::calcHist(&_refImage, 1, channels, cv::noArray(), hist, nChannels, histSize, ranges);

cv::calcBackProject(&output, 1, channels, hist, output, ranges);    //This line causes assertion failure

単一チャネルのイメージでほぼ同じコードを実行すると機能します。ドキュメントによると、マルチチャンネル画像もサポートされています。このコードが機能しないのはなぜですか?

4

1 に答える 1

3

簡単な答えは、ドキュメントには記載されてcv::calcBackProject() いませんが、インプレース操作をサポートしていないということです。

説明

OpenCV ソースを掘り下げると、次のスニペットが得られます。

void calcBackProject( const Mat* images, int nimages, const int* channels,
                         InputArray _hist, OutputArray _backProject,
                         const float** ranges, double scale, bool uniform )
{
    //Some code...

    _backProject.create( images[0].size(), images[0].depth() );
    Mat backProject = _backProject.getMat();
    assert(backProject.type() == CV_8UC1);
    histPrepareImages( images, nimages, channels, backProject, dims, hist.size, ranges,
                      uniform, ptrs, deltas, imsize, uniranges );
    //More code...
}

問題の原因となる行は次のとおりです。

_backProject.create( images[0].size(), images[0].depth() );

ソースと宛先が同じ場合、入力画像データを再割り当てします。images[0].depth()これは、型指定子CV_8Uと数値的に等価CV_8UC1です。したがって、データは単一チャンネルの画像として作成されます。

これは問題です。これはhistPrepareImages、入力イメージに 3 つのチャネルがあることをまだ想定しており、アサーションがスローされるためです。

解決

幸いなことに、回避策は簡単です。出力パラメーターは、次のように入力とは異なる必要があります。

cv::Mat result;
cv::calcBackProject(&output, 1, channels, hist, result, ranges);
于 2013-05-30T16:06:57.093 に答える