gpt4 book ai didi

c++ - 绘制 cv::HoughLines 检测到的线

转载 作者:搜寻专家 更新时间:2023-10-31 01:07:45 25 4
gpt4 key购买 nike

在这个站点(tutorial),它向我们展示了如何绘制 cv::HoughLines 检测到的线,但我不明白它如何找出线之间的点。

    for( size_t i = 0; i < lines.size(); i++ )
{
float rho = lines[i][0], theta = lines[i][1];
Point pt1, pt2;
double a = cos(theta), b = sin(theta);
double x0 = a*rho, y0 = b*rho;
pt1.x = cvRound(x0 + 1000*(-b)); //??
pt1.y = cvRound(y0 + 1000*(a)); //??
pt2.x = cvRound(x0 - 1000*(-b)); //??
pt2.y = cvRound(y0 - 1000*(a)); //??
line( cdst, pt1, pt2, Scalar(0,0,255), 3, CV_AA);
}

来自 openCV cookbook 的示例,我可以理解这些代码的原因但它更冗长

for(auto const &data : lines){
float const rho = data[0];
float const theta = data[1];

if((theta < PI/4. || theta > 3. * PI/4.)){
cv::Point pt1(rho / std::cos(theta), 0);
cv::Point pt2( (rho - result.rows * std::sin(theta))/std::cos(theta), result.rows);
cv::line(result, pt1, pt2, cv::Scalar(255), 1);
}else if{
cv::Point pt1(0, rho / std::sin(theta));
cv::Point pt2(result.cols, (rho - result.cols * std::cos(theta))/std::sin(theta));
cv::line(result, pt1, pt2, cv::Scalar(255), 1);
}
}

最佳答案

霍夫线变换返回极坐标。要在 2D 图片上显示线条,必须将坐标转换为笛卡尔坐标。以下是有关此的更多信息:http://www.mathsisfun.com/polar-cartesian-coordinates.html

从霍夫变换返回的直线只有一个笛卡尔点(蓝线和红线相交):

因此为了显示直线,作者将坐标转换为笛卡尔坐标,然后计算起点和终点,这些点设置为距离转换点的固定位置 -1000 和 +1000 像素:

pt1.x = cvRound(x0 + 1000*(-b)); //??
pt1.y = cvRound(y0 + 1000*(a)); //??
pt2.x = cvRound(x0 - 1000*(-b)); //??
pt2.y = cvRound(y0 - 1000*(a)); //??

找到返回行之间交集的一个选项是使用此 equation : Line-line intersection

有关此实现的更多信息,请参阅 this tutorial.

关于c++ - 绘制 cv::HoughLines 检测到的线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18951713/

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