c++ OpenCV函数实现已知直线的起点终点求过中点的垂线,函数的返回值为 cv::Vec4f
时间: 2024-03-05 10:48:19 浏览: 139
下面是一个返回 cv::Vec4f 的函数示例:
```c++
cv::Vec4f perpendicular_bisector(const cv::Vec4f& line)
{
// 计算起点和终点
cv::Point2f pt1(line[0], line[1]);
cv::Point2f pt2(line[2], line[3]);
// 计算中点
cv::Point2f mid((pt1.x + pt2.x) / 2, (pt1.y + pt2.y) / 2);
// 计算垂线
float slope = -(pt2.x - pt1.x) / (pt2.y - pt1.y);
float b = mid.y - slope * mid.x;
// 返回垂线的参数向量
return cv::Vec4f(-slope, 1, b, 0);
}
```
该函数接受一个 cv::Vec4f 类型的直线参数向量作为输入,返回一个新的 cv::Vec4f 类型的参数向量,表示过中点的垂线。该函数的实现和前面给出的代码类似,只不过将绘制垂线改为了返回垂线的参数向量。
相关问题
c++ OpenCV已知直线的起点终点求过中点的垂线
你可以使用OpenCV中的函数来实现该算法。下面是一个示例代码:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 定义起点和终点
Point pt1(100, 100);
Point pt2(200, 200);
// 计算中点
Point mid((pt1.x + pt2.x) / 2, (pt1.y + pt2.y) / 2);
// 计算垂线
double slope = -(double)(pt2.x - pt1.x) / (double)(pt2.y - pt1.y);
double b = mid.y - slope * mid.x;
// 绘制垂线
Mat img(300, 300, CV_8UC3, Scalar(255, 255, 255));
line(img, pt1, pt2, Scalar(0, 0, 255), 2);
line(img, Point(mid.x - 50, slope * (mid.x - 50) + b), Point(mid.x + 50, slope * (mid.x + 50) + b), Scalar(0, 255, 0), 2);
imshow("img", img);
waitKey(0);
return 0;
}
```
该代码中,首先定义起点 `pt1` 和终点 `pt2`,然后计算中点 `mid`。接着根据中点和直线斜率计算垂线的截距 `b`。最后使用 `line` 函数绘制起点和终点的直线和中点处的垂线。
opencv C++ 两个点坐标,如何构建与cv::HoughLinesP一致的cv::Vec4f直线
在OpenCV的C++中,如果你想要创建一个与`cv::HoughLinesP`函数返回结果一致的`cv::Vec4f`类型的直线表示,通常`cv::HoughLinesP`会返回一组包含起点、终点以及概率的数组,用于描述检测到的线段。这个数组格式通常是:
```cpp
std::vector<cv::Point> lines; // 点集,每个元素是一个线段的起始和结束点
```
而`cv::HoughLinesP`的结果可能会转换成这样的`cv::Vec4f`形式,其中4个元素代表的是:
- x1: 直线起点的x坐标
- y1: 直线起点的y坐标
- x2: 直线终点的x坐标
- y2: 直线终点的y坐标
为了构造这样一个`cv::Vec4f`,你可以这样做:
```cpp
cv::Vec4f lineVec;
lineVec[0] = static_cast<float>(lines[i].x); // 起点x
lineVec[1] = static_cast<float>(lines[i].y); // 起点y
lineVec[2] = static_cast<float>(lines[i].x + (lines[i+1].x - lines[i].x)); // 终点x,这里假设是下一个点的x
lineVec[3] = static_cast<float>(lines[i].y + (lines[i+1].y - lines[i].y)); // 终点y,类似上一个点的y
// 如果你有四个独立的点,那么不需要计算终点
// lineVec[2] = lines[i+1].x;
// lineVec[3] = lines[i+1].y;
```
注意这里的索引是从0开始的,并且假设了连续两条线之间的连接。
阅读全文