2016-09-27 20 views
1

KeyPoint構造体に含まれる座標点を格納するために、CV_32FC2タイプのMatオブジェクトを作成する必要があります。わかりやすくするために関数内でやりたい関数内でcv :: Matに値を代入できません

void myfun(vector<KeyPoint>& k){ 
    Mat p1_dist(1, k.size(), CV_32FC2); 

    for(int i=0; i<k.size(); i++){ 
     p1_dist.at<double>(0, i)[0] = k1[i].pt.x; 
     p1_dist.at<double>(0, i)[1] = k1[i].pt.y; 
    } 
} 

コンパイラはforループ内の "p1_dist"にそのマットへのポインタを要求します。 メイン関数内にそのコードを書き込むと、エラーは発生しません。 問題を指摘してもらえますか?

+0

あなたが破壊されるp1_dist'機能を '終了したら、すべてのあなたがループ内で何をしているかということを理解行います何もないの? 'Mat'オブジェクトを生きたままにしておきたいのであれば、それをポインタとして関数に渡さなければならないので、関数本体の内部で行われる変更は実際に残ります。 – rbaleksandar

+0

'p1_dist.at (0、i)'は、配列のようにはアクセスできない二重参照を返すべきです。あなたは 'p1_dist.at (0、i)'を意味するかもしれません。それ以外の場合、私はmainにあなたの問題を追いかけていません。 –

+0

正確なコンパイルメッセージを投稿する必要があります。あなたは正確な答えを既に持っています。 – gia

答えて

1

まず、作成した行列を返す必要があります。 OpenCVのに適合するためには、Matへの参照を渡すことができます。

void myfun(const vector<KeyPoint>& k, Mat& p1_dist){ ... } 

は、その後、あなたは正しいテンプレートとデータ値にアクセスする必要があります。 p1_dist.at<Vec2f>(row, col)[channel]、すなわち:あなたはCV_32FC2行列、2つのチャンネルのfloatのすなわち行列が必要な場合は、あなたがそれにアクセスする必要が

p1_dist.at<Vec2f>(0, i)[0] = k[i].pt.x; 
p1_dist.at<Vec2f>(0, i)[1] = k[i].pt.y; 

すでに行列のタイプを知っているときにはMat_<Tp>を使用するために、通常は明確です。 CV_32FC2の等価はMat2f次のようになります。

void myfun(const vector<KeyPoint>& k, Mat2f& p1_dist){ 
    ... 
    p1_dist(0, i)[0] = k[i].pt.x; 
    p1_dist(0, i)[1] = k[i].pt.y; 
    ... 
} 

はすべて一緒に置く:

#include <opencv2/opencv.hpp> 
using namespace std; 
using namespace cv; 

void myfun(const vector<KeyPoint>& k, Mat2f& p1){ 
    p1 = Mat2f(1, k.size()); // Set proper size 

    for(size_t i=0; i<k.size(); i++){ 
     p1(0, i)[0] = k[i].pt.x; 
     p1(0, i)[1] = k[i].pt.y; 
    } 
} 

int main() 
{ 
    vector<KeyPoint> k = ...; 
    Mat2f p1_dist; 
    myfun(k, p1_dist); 

    // Use p1_dist 

    return 0; 
} 
+0

あなたの助けをたくさんありがとう、私は間違ったテンプレートを使用して行列にアクセスしていました。 –

+0

喜んで助け; D – Miki

関連する問題