// 定义直线的参数 cv::Point2d p1(100, 100); cv::Point2d p2(300, 300); cv::Vec2d line = p2 - p1; // 定义点的坐标 cv::Point2d point(200, 100); // 计算点到直线的投影点坐标 cv::Point2d projection = p1 + line * (point - p1).dot(line) / line.dot(line);不能使用+号
时间: 2024-03-03 08:48:21 浏览: 52
可以使用 cv::Point2d 的构造函数和成员函数,通过坐标运算实现。具体地,可以这样计算点到直线的投影点坐标:
```cpp
cv::Point2d projection = p1 + cv::Point2d(line[0], line[1]) * ((point.x - p1.x) * line[0] + (point.y - p1.y) * line[1]) / (line[0] * line[0] + line[1] * line[1]);
```
其中,`cv::Point2d(line[0], line[1])` 将 `cv::Vec2d` 类型的直线转换成 `cv::Point2d` 类型,`(point.x - p1.x) * line[0] + (point.y - p1.y) * line[1]` 是点到直线的距离,`line[0] * line[0] + line[1] * line[1]` 是直线长度的平方。
相关问题
翻译 unsigned int n = points.size(); if (n < 2) { return; } RNG random; double bestScore = -1.; vector<Point2d>vpdTemp; int iterations = log(1 - 0.99) / (log(1 - (1.00 / n)))*10; for (int k = 0; k < iterations; k++) { int i1 = 0, i2 = 0; while (i1 == i2) { i1 = random(n); i2 = random(n); } const cv::Point2d& p1 = points[i1]; const cv::Point2d& p2 = points[i2]; Point2d vectorP21 = p2 - p1; vectorP21 *= 1. / norm(vectorP21); double score = 0; vpdTemp.clear(); for (int i = 0; i < n; i++) { Point2d vectorPi1 = points[i] - p1; double d = vectorPi1.y * vectorP21.x - vectorPi1.x * vectorP21.y;//calculate the cosΘ of the two vectors. if (fabs(d) < sigma) { score += 1; } else { vpdTemp.push_back(points[i]); } } if (score > bestScore) { bestScore = score; vpdExceptPoints = vpdTemp; } }
这段代码的作用是利用随机采样一致性算法(RANSAC)来估算一组二维点集中的直线。首先,通过points.size()获取点集中点的数量,并将其赋值给无符号整型变量n。如果n小于2,直接返回。接着使用RNG类生成一个伪随机数对象random。然后定义一个变量bestScore表示最好的得分,初始值为-1.0。定义一个vpdTemp向量用于存储临时点集,和一个iterations变量表示迭代次数,计算公式为log(1 - 0.99) / (log(1 - (1.00 / n))) * 10。在循环中,执行iterations次随机采样。每次采样随机选取两个点,计算它们连成的直线的得分,如果得分比目前最好的得分要高,则更新最好的得分和vpdExceptPoints向量。最后返回vpdExceptPoints向量,它包含了剔除异常点后的点集。
用opencv实现点投影到直线上 C++
要实现点投影到直线上,可以使用 OpenCV 的函数 `cv::Point2d cv::Point2d::dot(InputArray m)` 计算点到直线的投影点坐标。具体步骤如下:
1. 定义直线的参数,可以使用两个点坐标或极坐标表示。
2. 定义点的坐标。
3. 使用 `cv::Point2d::dot()` 函数计算点到直线的投影点坐标。
4. 可以使用 OpenCV 的绘图函数将原始点和投影点显示出来。
以下是一个简单的代码示例,实现了将点投影到直线上并显示投影结果:
```c++
#include <opencv2/opencv.hpp>
int main()
{
// 定义直线的参数
cv::Point2d p1(100, 100);
cv::Point2d p2(300, 300);
cv::Vec2d line = p2 - p1;
// 定义点的坐标
cv::Point2d point(200, 100);
// 计算点到直线的投影点坐标
cv::Point2d projection = p1 + line * (point - p1).dot(line) / line.dot(line);
// 显示投影结果
cv::Mat img(400, 400, CV_8UC3, cv::Scalar(255, 255, 255));
cv::line(img, p1, p2, cv::Scalar(0, 0, 255), 2);
cv::circle(img, point, 3, cv::Scalar(0, 255, 0), -1);
cv::circle(img, projection, 3, cv::Scalar(255, 0, 0), -1);
cv::imshow("Projection", img);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}
```
需要注意的是,上述代码中的参数需要根据实际情况进行调整和设置。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![txt](https://img-home.csdnimg.cn/images/20210720083642.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)