6

私はかなり長い間これに困惑してきました。Mat変数のmax、min vlauesを見つける際に、OpencvのminMaxLoc()がどのデータ型を考慮しているかを知るのを手伝っていただけませんか?関数から特定の値を取得しましたが、その値が実際に何を表しているのか、どのデータ型であるのかわかりません。

    Laplacian(src_gray,dst,ddepth,kernel_size,scale,delta,BORDER_DEFAULT);
    minMaxLoc(dst,&min,&estimate,&minLoc,&maxLoc,noArray());

'estimate'の値は約1000ですが、' dst' Mat変数の値にアクセスしようとすると、

    dst.at<datatype>(k,l)

ucharの124、125から、long intを使用する場合は2、xxx、xxx、xxxまで、あいまいな値を取得しています。minMaxLoc関数によって実際に与えられる値は何ですか?私を助けてください。

4

3 に答える 3

13

minとestimateはdouble型である必要があり、正しいと思います。問題はおそらくあなたがアクセスしていることにあります

dst.at<datatype>(k,l)

Abhishek Thakurが述べたように、出力は入力によって異なります。行列のタイプについて混乱した場合は、dst.type()を参照してください。これは、 557行目から始まるtypes_c.hで定義されたリストに対応する整数を返します。単一チャネルタイプまたは「深度」の定義は次のとおりです。

#define CV_8U   0
#define CV_8S   1 
#define CV_16U  2
#define CV_16S  3
#define CV_32S  4
#define CV_32F  5
#define CV_64F  6

573行目で他のタイプ識別子の計算に使用される式を確認できます。

#define CV_CN_SHIFT   3
#define CV_DEPTH_MAX  (1 << CV_CN_SHIFT)

#define CV_MAT_DEPTH_MASK       (CV_DEPTH_MAX - 1)
#define CV_MAT_DEPTH(flags)     ((flags) & CV_MAT_DEPTH_MASK)

#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))

例えば

#define CV_8UC4 CV_MAKETYPE(CV_8U,4)

タイプがあります

0+((4-1) << 3) == 24

したがって、4チャネルのucharイメージの場合、type()は24を返します。上記から、型の深さが型整数の最後の3ビットで表されていることがわかります。深さが必要な場合(チャネルの数は関係ありません)、dst.depth()を使用して直接取得できます。

于 2013-01-16T19:08:41.957 に答える
3

ハンマーの答えは非常に明確であり、それはあなたに素晴らしいヒントを示しています:常にデータ型をチェックし、気をつけてください、types_c.hあなたが望むたびにそれをチェックしてください!

とにかく、minMaxLocはdoubleを返しますが、すでにキャストを行っています。uchar Matオブジェクトを入力配列として指定すると、2つのdouble変数が0〜255の範囲(uchar範囲!)のdoubleとして設定されます。

この例を参照してください。

#include <opencv2/core/core.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int /*argc*/, char** /*argv*/) {

    double m, M;
    Point p_min, p_max;
    Mat img;

    // let's do with uchar Mat
    img = (Mat_<uchar>(3,3) << 0,1,2,3,4,5,6,7,255); 
    cout << img << endl;
    minMaxLoc(img, &m, &M, &p_min, &p_max);
    cout << "min: " << m << " at " << p_min << endl;
    cout << "max: " << M << " at " << p_max << endl;
    cout << (int)img.at<uchar>(p_max.y, p_max.x) << endl; // cast to int otherwise cout will print an ASCII (uchar)

    // now with float Mat
    img = (Mat_<float>(3,3) << 0.1f,1.2f,2,3000.2f,4,5,6,7,255); 
    cout << img << endl;
    minMaxLoc(img, &m, &M, &p_min, &p_max);
    cout << "min: " << m << " at " << p_min << endl;
    cout << "max: " << M << " at " << p_max << endl;
    cout << img.at<float>(p_max.y, p_max.x) << endl;

    return 0;
}

ここで、投稿したコードで、宛先タイプをで定義しますddepthddepth次のように、opencv定数データ型として指定できます。

ddepth = CV_8UC1

この場合、cv::Laplacianはucharマットを返します。

したがって、処理しているデータの種類に常に注意してください。カラー画像を使用している場合は、おそらく使用したほうがよいでしょうMat::at<Scalar>()

于 2013-01-20T10:21:20.013 に答える
2

それはあなたが望む価値に依存します。グレースケール画像の場合、ucharデータ型のマットを入力すると、0〜255の値が得られます。

于 2013-01-16T18:22:31.867 に答える