无法在函数内部为 cv::Mat 赋值
Can't assign values to cv::Mat inside function
我需要创建 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 循环内的 "p1_dist" 下划线,要求指向该 Mat 的指针。
如果我在主函数中编写那段代码,则不会发生错误。
能帮我指出问题吗?
首先你需要return你创建的矩阵。为了符合 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;
}
我需要创建 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 循环内的 "p1_dist" 下划线,要求指向该 Mat 的指针。 如果我在主函数中编写那段代码,则不会发生错误。 能帮我指出问题吗?
首先你需要return你创建的矩阵。为了符合 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;
}