无法在函数内为 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循环中要求指向该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;
}
相关文章:
- 将CHW格式的浮点向量转换为cv::Mat
- C++:从GPU内存(cudaMemcpy2D)获取BGR图像(cv::Mat)
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 将 cv::mat 转换为 QImage
- 将 cv::Mat 转换为 std::vector 的通用函数
- 在 QML VideoOutput 中将 cv::mat 显示为 QVideoFrame
- 如何将 cv::Mat 转换为 vtkImageData?
- 如何将 vtkImageData 转换为 cv::Mat?
- 如何总结所有cv::Mat元素
- Qt-工作线程崩溃时将cv::Mat转换为QImage
- 在 cv::Mat 中生成 2D 坐标网格
- 将 cv::Mat 转换为无符号的 int 像素
- OpenCV 分段错误(核心转储)在使用 cv::Mat::at 时
- 如何将多个 cv::Mat 从 c++ dll 传递到 opencvsharp Mat c#?
- 如何在不复制数据的情况下将 cv::Mat 转换为 2d 标准::矢量
- 如何使用 (*mpORBextractorLeft)(im,cv::Mat(),mvKeys,mDescriptors)
- 从数组创建 Mat 时,'cv::Mat' 和 'int' 类型不兼容
- 如何将 cv::mat 对象从 python 模块传递到 c++ 函数并返回返回的 cv::mat 类型为对象?
- 移动语义和 cv::Mat
- OpenCV 错误:断言在 cv::Mat 行 522 中失败