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

Can't assign values to cv::Mat inside function

本文关键字:cv Mat 赋值 函数      更新时间:2023-10-16

我需要创建一个CV_32FC2类型的Mat对象来存储包含在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循环中要求指向该Mat的指针的"p1_dist"下加下划线。如果我把这段代码写在主函数里面,错误就不会发生。你能帮我指出这个问题吗?

首先需要返回创建的矩阵。为了符合OpenCV,你可以传递一个引用到Mat:

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

然后需要使用正确的模板访问数据值。如果你需要一个CV_32FC2矩阵,即一个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;
    ...  
}

all together:

#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;
}