画出cv :: HoughLines检测到的线条

时间:2013-09-23 04:20:22

标签: c++ opencv

在这个网站(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);
    }
}

1 个答案:

答案 0 :(得分:4)

霍夫线变换返回极坐标。要在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)); //??

查找返回行之间交集的一个选项是使用此equationLine-line intersection

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