まず、作成した行列を返す必要があります。 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;
}
あなたが破壊されるp1_dist'機能を '終了したら、すべてのあなたがループ内で何をしているかということを理解行います何もないの? 'Mat'オブジェクトを生きたままにしておきたいのであれば、それをポインタとして関数に渡さなければならないので、関数本体の内部で行われる変更は実際に残ります。 – rbaleksandar
'p1_dist.at(0、i)'は、配列のようにはアクセスできない二重参照を返すべきです。あなたは 'p1_dist.at (0、i)'を意味するかもしれません。それ以外の場合、私はmainにあなたの問題を追いかけていません。 –
正確なコンパイルメッセージを投稿する必要があります。あなたは正確な答えを既に持っています。 – gia