Mat img(channels, cv::Size(width, height), CV_32F, data); 这行报错 error: no matching function for call to ‘cv::Mat::Mat(const int&, cv::Size, int, float [460800])’
时间: 2024-03-20 11:39:14 浏览: 39
这个错误的原因是 `cv::Size` 的构造函数需要传入两个 `int` 类型的参数,而你传入的第一个参数是 `channels`,它的类型是 `int`,所以编译器认为你正在调用一个不存在的构造函数。你可以尝试将 `channels` 和 `cv::Size` 的参数分别传入构造函数,如下所示:
```
Mat img(cv::Size(width, height), CV_32F);
img = Mat::zeros(height, width, CV_32F);
```
然后再将 `data` 中的数据赋值给 `img` 即可。
相关问题
error: no matching function for call to 'cv::Mat::reshape(std::vector<OutputSeg>::size_type, <brace-enclosed initializer list>)'
这个错误的原因是你使用了错误的参数类型。`cv::Mat::reshape`函数的声明如下:
```
cv::Mat cv::Mat::reshape(int cn, int rows=0) const;
```
其中,`cn`是矩阵的通道数,一般为1,`rows`是矩阵的行数。你传入的第一个参数是一个`std::vector<OutputSeg>::size_type`类型,它并不是一个整数,因此编译器无法匹配到正确的函数。此外,你还传入了一个大括号括起来的初始化列表作为第二个参数,这也是错误的。
要解决这个问题,你需要将函数调用改为传入正确的参数类型。如果你想要将一个矩阵改变为指定的行数,可以这样调用`reshape`函数:
```
cv::Mat mat = ...; // 原始矩阵
int new_rows = ...; // 新的行数
cv::Mat new_mat = mat.reshape(1, new_rows);
```
其中,`1`表示矩阵的通道数为1。这样,就能够正确地调用`reshape`函数了。
error: no matching function for call to ‘projectPoints(std::vector<cv::Point3_<float> >&, std::vector<cv::Point_<float> >&, cv::Mat&, cv::Mat&, cv::Mat*&, cv::Mat*&)’ cv::fisheye::projectPoints(vPt3DPnpIn, vPt2DPnpProject, rvec, tvec, K, distCoef); 怎么解决 ^
这个错误提示表明在你的代码中,没有找到与 `projectPoints()` 函数的调用所需参数类型匹配的函数。这个函数的参数类型是:
```
cv::fisheye::projectPoints(
const std::vector<cv::Point3f>& objectPoints,
std::vector<cv::Point2f>& imagePoints,
const cv::Mat& rvec,
const cv::Mat& tvec,
const cv::Mat& K,
const cv::Mat& D,
const double alpha = 0
)
```
你需要检查你的代码,确保参数的类型和数量都正确。如果你确定参数类型和数量都正确,那么可能是因为你没有包含正确的头文件。你需要包含以下头文件:
```
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/calib3d.hpp>
#include <opencv2/fisheye.hpp>
```
如果你已经包含了这些头文件,你可能需要升级你的 OpenCV 版本。这个函数在 OpenCV 3.4.1 版本中引入,如果你使用的是早期版本,它可能不存在。