2016-11-28 4 views
1

問題の説明よりも状況を説明する方がはるかに簡単です。私は最初の値の最初の番号(24)との値を信じるOpenCV cv :: Mat.at関数を使用するときに正しい型名を使用する方法

value near i,j: [34, 42; 
    39, 44] 
value at i,j: 24 

:私はOpenCVの使用してC++で、次の2つのコード行を使用します。

std::cout << "value near i,j: " << myMat(Rect(i,j,2,2)) << std::endl; 
std::cout << "value at i,j: " << myMat.at<double>(i,j) << std::endl; 

をそして私は次のような結果を得ます第2の線(34)は等しくなければならない。 myMatのデータ型は、現在CV_64Fとして定義されている必要があります。私の結論は、OpenCVデータ型からC++プリミティブ型への変換では、私がCV_16Sを最初に使用したときの値が非常に悪かったため、何か間違っているということです。では、cv :: Matの構造体の値に正しくアクセスするためには、どのような修正が必要ですか?

P.S:次のようにmyMatが作成され、割り当てられます。

Mat yourMat, myMat; 
[... yourMat is assigned ...] 
Sobel(yourMat, myMat, CV_64F, 1, 0, 3, 1, 0, BORDER_DEFAULT); 

P.S.2:私は同様の質問hereを見つけましたが、答えは唯一の回避策割り当てることでがあるように思われます。

答えて

1

あなたは2行目にi,jを切り替える必要があります:myMat.at<double>(j,i)


myMat(Rect(i,j,2,2))であなたがRectコンストラクタを使用している:

x, y, width, height 

はそうあなた Rectの左上が (x,y) = (i, j)です。しかし、 .atで値にアクセスすると、 row = ycol = xのため、 (x,y)の逆数である .at<Tp>(row, col)でアクセスします。

したがって、位置(y, x) = (j, i)の値を効果的に読み取ることができます。


タイプCV_16Uのマトリックスで作業する場合、あなたが.at<Tp>を使用してアクセスする必要があります。

  • CV_16UC1m.at<ushort>
  • CV_16UC2m.at<Vec2w>
  • CV_16UC3m.at<Vec3w>
  • CV_16UC4m.at<Vec4w>

またはあなたが使用することができますが、ただで、

  • Mat1w
  • Mat2w
  • Mat3w
  • Mat4w

をして.atせずに行列にアクセスかっこ:m(r,c)

+0

優秀な点。私はMat.atとRectの2つの異なるパラメータの順序を知っていましたが、それらを結びつけることはできませんでした。タイプの問題(この場合)だったという私の控除は間違っていて、あなたの答えは私の問題を解決したことが判明しました。このトピックにマッチするだけで、誰かが問題のタイプマッチングの部分についてコメントしてくれればうれしいでしょう:CVデータ型がCV_16Sなら、どのようにMat.atコマンドを使用しますか?そのため、 'myMat.at (j、i)'、 'myMat.at (j、i)'または 'myMat.at (' 'myMat.at')は依然として誤った結果を与えるでしょう。 – hekimgil

+0

更新された回答を確認 – Miki

+0

ありがとう、素晴らしい仕事。あなたのご指導を受けて、私はMatの完全なリストを持つ[この便利なリンク](http://ninghang.blogspot.com.tr/2012/11/list-of-mat-type-in​​-opencv.html)も見つけましたOpenCVの型とそれに対応するC++型。 – hekimgil

関連する問題