不存在从 "int" 转换到 "cv::Point_<int>" 的适当构造函数
时间: 2023-12-16 14:04:09 浏览: 52
这个问题属于技术问题,可以直接回答。
对于从 "int" 转换到 "cv::Point_<int>" 的适当构造函数,可以使用如下代码:
int x = 10;
int y = 20;
cv::Point_<int> point(x, y);
这样就可以将两个 int 类型的数转换成一个 cv::Point_<int> 类型的点了。
相关问题
CornerDetector(int n_rows = 8, int n_cols = 10, double detection_threshold = 40.0); ~CornerDetector() = default; void detect_features(const cv::Mat &image, std::vector<cv::Point2f> &features); void set_grid_position(const cv::Point2f &pos); void set_grid_size(int n_rows, int n_cols); int get_n_rows() const { return grid_n_rows_; } int get_n_cols() const { return grid_n_cols_; } float shiTomasiScore(const cv::Mat &img, int u, int v); int sub2ind(const cv::Point2f &sub);
这段代码定义了一个名为 `CornerDetector` 的类,该类具有以下成员函数:
- `CornerDetector(int n_rows = 8, int n_cols = 10, double detection_threshold = 40.0)`:类的构造函数,可以用来初始化占据网格的行数、列数和检测阈值。
- `~CornerDetector() = default`:类的析构函数。
- `void detect_features(const cv::Mat &image, std::vector<cv::Point2f> &features)`:检测输入图像中的角点,并将角点的坐标保存在 `features` 向量中。
- `void set_grid_position(const cv::Point2f &pos)`:设置占据网格的左上角位置。
- `void set_grid_size(int n_rows, int n_cols)`:设置占据网格的行数和列数。
- `int get_n_rows() const { return grid_n_rows_; }`:获取占据网格的行数。
- `int get_n_cols() const { return grid_n_cols_; }`:获取占据网格的列数。
- `float shiTomasiScore(const cv::Mat &img, int u, int v)`:计算图像中指定位置的 Shi-Tomasi 角点得分。
- `int sub2ind(const cv::Point2f &sub)`:将占据网格的行列坐标转换为索引。
// 转换成非齐次坐标 for (int i = 0; i < pts_4d.cols; i++) { Mat x = pts_4d.col(i); x /= x.at<float>(3, 0); // 归一化 Point3d p( x.at<float>(0, 0), x.at<float>(1, 0), x.at<float>(2, 0) );
这段代码的作用是将一个齐次坐标矩阵转换为非齐次坐标矩阵,即将每个点的坐标除以其第四个分量,同时将其转换为`cv::Point3d`类型。
具体来说,这段代码中的循环遍历了`pts_4d`矩阵的每一列,即每个齐次坐标。对于每个齐次坐标,我们首先使用`Mat`类的`col`函数获取其对应的列向量,并将其除以第四个分量,从而归一化坐标。然后,我们使用`Point3d`类的构造函数将其转换为一个三维点。
需要注意的是,这段代码假设输入的齐次坐标矩阵`pts_4d`的大小为4xN,其中N是点的数量。如果输入矩阵的大小不同,你需要根据实际情况进行修改。此外,这段代码中的除法操作可能会导致除以0的情况,因此你需要在使用之前确保第四个分量不为0。