gpt4 book ai didi

opencv - 使用Opencv和C++在垂直方向的两点之间绘制直线

转载 作者:行者123 更新时间:2023-12-02 16:47:05 26 4
gpt4 key购买 nike

我试图用两个引用点画一条直线,但在垂直方向上遇到了一些问题。

这是当前的源代码:

cv::Mat img = cv::Mat::zeros(600,600,CV_8UC3);
cv::Point p1(306,41);
cv::Point p2(304,8);

cv::Point p(0,0), q(img.cols, img.rows);
if (p1.x != p2.x) {
double m = (double) (p1.y - p2.y) / (double) (p1.x - p2.x);
double b = p1.y - (m * p1.x);
p.y = m * p.x + b;
q.y = m * q.x + b;
} else {
p.x = q.x = p2.x;
p.y = 0;
q.y = img.rows;
}

cv::circle(img, p1, 4, cv::Scalar(255,0,255), -1);
cv::circle(img, p2, 4, cv::Scalar(255,0,255), -1);
cv::line(img, p, q, cv::Scalar(0,0,255), 2);

这是以下输出:
enter image description here

我究竟做错了什么?

最佳答案

我在 2.4.9 版本上运行时遇到了同样的问题。鉴于 Miki anwser,它可能已在较新版本上得到修复。

当线斜率太高并且因此与 y 轴的交点远离原点时,问题似乎会发生。

我测试了引用的点,以及许多其他点,下面的函数处理了这个问题。它基本上计算计算线与图像边界的交点,并返回图像边界中的共线点。

void getLinePointinImageBorder(const cv::Point& p1_in, const cv::Point& p2_in,
cv::Point& p1_out, cv::Point& p2_out,
int rows, int cols)
{
double m = (double) (p1_in.y - p2_in.y) / (double) (p1_in.x - p2_in.x + std::numeric_limits<double>::epsilon());
double b = p1_in.y - (m * p1_in.x);

std::vector<cv::Point> border_point;
double x,y;
//test for the line y = 0
y = 0;
x = (y-b)/m;
if(x > 0 && x < cols)
border_point.push_back(cv::Point(x,y));

//test for the line y = img.rows
y = rows;
x = (y-b)/m;
if(x > 0 && x < cols)
border_point.push_back(cv::Point(x,y));

//check intersection with horizontal lines x = 0
x = 0;
y = m * x + b;
if(y > 0 && y < rows)
border_point.push_back(cv::Point(x,y));

x = cols;
y = m * x + b;
if(y > 0 && y < rows)
border_point.push_back(cv::Point(x,y));

p1_out = border_point[0];
p2_out = border_point[1];
}

关于opencv - 使用Opencv和C++在垂直方向的两点之间绘制直线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43097300/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com