リマインダー
HoughLines出力行:
質問
HoughLinesP 行形式から HoughLines 行形式に移行する方法は?
詳細 HoughLines の出力行に基づいてアルゴリズムを作成したので、セグメントの終点情報は必要ありません。
HoughLines出力行:
HoughLinesP 行形式から HoughLines 行形式に移行する方法は?
詳細 HoughLines の出力行に基づいてアルゴリズムを作成したので、セグメントの終点情報は必要ありません。
これは単純なジオメトリです。(x1, y1), (x2, y2)
2 点で定義された線から極方程式に渡す必要があります(rho, theta)
。
ここでrho
、2 つの点から計算する式を見つけることができます(ここで= (0, 0))。そして、ここでシータを計算する式。ポイントで定義された線に垂直な線の角度を計算する必要があることに注意してください。(x0, y0)
twoPoints2Polar
この小さなテスト コードで、以下の関数のコードを見つけることができます。
#include <opencv2/opencv.hpp>
cv::Vec2f twoPoints2Polar(const cv::Vec4i& line)
{
// Get points from the vector
cv::Point2f p1(line[0], line[1]);
cv::Point2f p2(line[2], line[3]);
// Compute 'rho' and 'theta'
float rho = abs(p2.x*p1.y - p2.y*p1.x) / cv::norm(p2 - p1);
float theta = -atan2((p2.x - p1.x) , (p2.y - p1.y));
// You can have a negative distance from the center
// when the angle is negative
if (theta < 0) {
rho = -rho;
}
return cv::Vec2f(rho, theta);
}
int main()
{
cv::Mat3b img(300, 300, cv::Vec3b(0,0));
// x1, y1, x2, y3
cv::Vec4i u(50, 130, 250, 80);
// Get rho, theta
cv::Vec2f v = twoPoints2Polar(u);
// Draw u in blue
cv::line(img, cv::Point(u[0], u[1]), cv::Point(u[2], u[3]), cv::Scalar(255, 0, 0), 3);
// Draw v in red
float rho = v[0];
float theta = v[1];
double a = cos(theta), b = sin(theta);
double x0 = a*rho, y0 = b*rho;
cv::Point pt1( cvRound(x0 + 1000 * (-b)),
cvRound(y0 + 1000 * (a)));
cv::Point pt2( cvRound(x0 - 1000 * (-b)),
cvRound(y0 - 1000 * (a)));
cv::line(img, pt1, pt2, cv::Scalar(0, 0, 255), 1, 8);
cv::imshow("Lines", img);
cv::waitKey();
return 0;
}