无法为函数内的cv :: Mat赋值

时间:2016-09-27 18:19:27

标签: c++ opencv mat

我需要创建Mat类型的CV_32FC2对象来存储KeyPoint结构中包含的坐标点。为了清晰起见,我想在函数内部进行。

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”,要求指向该Mat的指针。 如果我在main函数中编写那段代码,则不会发生错误。 你能帮我指出一下这个问题吗?

1 个答案:

答案 0 :(得分:1)

首先,您需要返回您创建的矩阵。要符合OpenCV,您可以传递对Mat

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

然后,您需要使用正确的模板访问数据值。如果您需要CV_32FC2矩阵,即具有2个频道的float矩阵,则需要使用以下代码访问它: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;
}