首先你需要返回你创建的矩阵。为了符合OpenCV的,你可以传递一个参考Mat
:
void myfun(const vector<KeyPoint>& k, Mat& p1_dist){ ... }
然后你需要用正确的模板来访问数据值。如果你需要一个CV_32FC2
矩阵,即float
有2个通道的矩阵,你需要访问它:p1_dist.at<Vec2f>(row, col)[channel]
,即:
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)'。否则,我不会跟随你的问题与主。 –
你应该发布确切的编译器消息,你已经有确切的答案。 – gia