2012-04-26 26 views
4

私はこの議論について多くのポストを認識していますが、それらの多くは読んだことがありますが、まだ混乱しています。問題はタイプです(オハイオ、ええ、これはCです、私はデータ型を扱わなければなりません!-))。私は新しい過テンプレートのC++ API関数at使用していcv :: Matのcv :: Matの要素(x、y)にC++ APIを使用して

Mat mat32f(3, 3, CV_32F); 
for(int i=0; i<3; i++) 
    for(int j=0; j<3; j++) 
     mat32f.at<float>(i,j) = i; 
cout << "Matrix of type: " << mat32f.type() << endl; 
cout << mat32f << endl; 
cout << mat32f.at<float>(1,2) << endl; 

[OK]を、ここでは1つのチャンネル、問題はないとのフロートしている、出力は明確である:

Matrix of type: 5 
[0, 0, 0; 
    1, 1, 1; 
    2, 2, 2] 
1 

今だけ作りますいくつかのフィルタ:

Mat mask; 
inRange(mat32f, 1, 1, mask); 
cout << "Mask of type: " << mask.type() << endl; 
cout << mask << endl; 

ここでは、出力は私が欲しいものです:

Mask of type: 0 
[0, 0, 0; 
    255, 255, 255; 
    0, 0, 0] 

今、私はある点(マウスをクリックするかどうかチェックしたいですか?何でも)が範囲内にある。

int value2 = mask.at<char>(1,2); 
cout << value2 << endl; 
unsigned int value3 = mask.at<unsigned int>(1,2); 
cout << value3 << endl; 

iはcharが(理由は私のマスクタイプの0 == CV_8Uです)unsigned intの同じサイズである最初のコンピュータサイエンスのクラスから覚えているので、文字を使用します。 coutそれはチャーのためにそれをつかむので、役に立たない非アスキーシンボルを表示するので、それをintに格納してください。ここ

ouputを:何が起こったのか

-1 
256 

?大きな混乱。なぜ-1?または、なぜか、256?何が起こった?

+0

charは実際にはunsigned intと同じサイズではありません。 – juanchopanza

答えて

3

マットについてOpenCV::Basic Structures状態からのコメントこの:: <>()メソッドで:

// template methods for read-write or read-only element access. 
// note that _Tp must match the actual matrix type - 
// the functions do not do any on-fly type conversion 

それであなたはat<char>at<unsigned int>を使用するときにMat<float>から取得していること(いずれかのCから可能性未定義の動作です++またはOpenライブラリ)。

「あなたのcharはunsigned intと同じサイズです」という文も、ほとんど常に正しくありません。私はそれが技術的にはC++のsizeof(char) == sizeof(unsigned int)が可能だと信じていますが、これが真であるプラットフォームや実装についてはわかりません。あなたのケースで本当であったとしても、コードが実行されるすべてのシステムではそうでないかもしれないので、この前提を使うのは危険です。 OpenCV v2.4 Sourceマットによると

詳細

::(で)(以下デバッグコード)のようになります。

template<typename _Tp> inline const _Tp& Mat::at(int i0, int i1) const 
{ 
    return ((const _Tp*)(data + step.p[0]*i0))[i1]; 
} 

あなたはデータの間違った型にアクセスしようとした場合、あなたがしています生の配列を間違った型にキャストすると、それは良い結果をもたらしません。あなたがマットにデータ型を指定する理由::(AT用として

)は、あなただけで行うことはできません。

mat32f.at(i,j) = i; 

と、コンパイラが自動的に正しいテンプレートの種類を選択してみましょうか?

+0

()の 'templated'のポイントは、とにかく行列の型を知る必要がある場合は何ですか? – juanchopanza

+0

でも、なぜunsigned intを使っても、私は255ではなく256を得るのですか? – nkint

+0

@nkint実行されている場合は、オンザフライ型変換でない場合は、符号付き浮動小数点数から符号なし整数へのいくつかのビットを単なる靴角とみなします。基本的に、それは危険なconsrtuctionであり、私はC + + APIは何も超冷却だと思う理由:-) – juanchopanza

関連する問題