1

次のコードを使用しようとしています。

    cv::MatND hist;
    cv::Mat image = cv::imread("image.bmp");
    float *range = new float[33];
    int histSize = 32;
    int channel = 0;
    for (int i = 0; i < 33; ++i)
        range[i] = (float)6602.0 + 21*i;
    float **ranges = &range;
    cv::calcHist(&frame.get<0>(), 1, &channel, cv::Mat(), hist, 1, &histSize, ranges, false, false);

画像はグレースケールなので、ゼロ番目のチャネルを使用してヒストグラムを取得しています。範囲が均一であることはわかっていますが、境界を正確に知りたいと思っていました。画像は CV_16U タイプです (元のコードでは、画像はカメラですが、ここに含めるには長すぎます)

私の問題は、コンパイル時に次のエラーが発生することです。

    error C2665: 'cv::calcHist' : none of the 3 overloads could convert all the argument types
    C:\opencv\build_x64\include\opencv2/imgproc/imgproc.hpp(670): could be 'void     cv::calcHist(const cv::Mat *,int,const int *,cv::InputArray,cv::OutputArray,int,const int *,const float **,bool,bool)'
    C:\opencv\build_x64\include\opencv2/imgproc/imgproc.hpp(676): or 'void cv::calcHist(const cv::Mat *,int,const int *,cv::InputArray,cv::SparseMat &,int,const int *,const float **,bool,bool)'
    while trying to match the argument list '(cv::Mat *, int, int *, cv::Mat, cv::MatND, int, int *, float **, bool, bool)'

私はそれがばかげていることを知っていますが、私は夢中になろうとしています. どんな助けでも大歓迎です。PS: 64 ビット環境の Microsoft Visual C++ Express で opencv 2.4.2 を使用しています。

一番、

バリス

4

1 に答える 1

0

OpenCV のバージョンが 2.3 より新しい場合は、そのように思われますが、それを知っておく必要がcv::Matありcv::MatNDます。

しかし、エラーについては、新しい OpenCVは任意の数の次元を持つことができるため、ここでcv::Matわかるように、定義が変更されました。

C++: 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 )
C++: void calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, SparseMat& hist, int dims, const int* histSize, const float** ranges, bool uniform=true, bool accumulate=false )

こちらの新しいチュートリアルでも確認できます。単純な方法cv::Matでうまくいきます。

cv::Mat hist;

新しいドキュメントを使用すると、これらの問題を解決するのに役立ちますが、残念ながら、利用可能なチュートリアルとコードのほとんどは、現在のバージョンに到達するために大きな変更を行った古い OpenCV に基づいています。

于 2012-08-20T23:06:15.033 に答える