【问题标题】:emgucv angle detection for rectangle in csharpcsharp中矩形的emgucv角度检测
【发布时间】:2020-06-18 11:00:40
【问题描述】:

我正在使用以下线程对矩形图像执行角度检测。 Detect centre and angle of rectangles in an image using Opencv

我被以下代码卡住了。

cv::Point2f edge1 = cv::Vec2f(rect_points[1].x, rect_points[1].y) - cv::Vec2f(rect_points[0].x, rect_points[0].y);
cv::Point2f edge2 = cv::Vec2f(rect_points[2].x, rect_points[2].y) - cv::Vec2f(rect_points[1].x, rect_points[1].y);

cv::Point2f usedEdge = edge1;
if(cv::norm(edge2) > cv::norm(edge1)) usedEdge = edge2;

cv::Point2f reference = cv::Vec2f(1,0); // horizontal edge

angle = 180.0f/CV_PI * acos((reference.x*usedEdge.x + reference.y*usedEdge.y) / (cv::norm(reference) *cv::norm(usedEdge)));

我无法弄清楚我需要在 emgu csharp 中转换的以下几行。

cv::Point2f edge1 = cv::Vec2f(rect_points[1].x, rect_points[1].y) - cv::Vec2f(rect_points[0].x, rect_points[0].y);
cv::Point2f edge2 = cv::Vec2f(rect_points[2].x, rect_points[2].y) - cv::Vec2f(rect_points[1].x, rect_points[1].y);

angle = 180.0f/CV_PI * acos((reference.x*usedEdge.x + reference.y*usedEdge.y) / (cv::norm(reference) *cv::norm(usedEdge)));
if(cv::norm(edge2) > cv::norm(edge1)) usedEdge = edge2;
cv::Point2f reference = cv::Vec2f(1,0); 

谁能帮我解决这个问题?任何帮助或建议将不胜感激?

【问题讨论】:

    标签: c# opencv vector emgucv point


    【解决方案1】:

    这里的Point2f 是简单的点,具有XY 的浮点精度属性,用于存储IJ 的二维向量。他们的方法 if 声明是将边设置为两点之间的向量,即这两点之间的增量。在 C# 中,我会这样写:

    float deltaX = rect_points[1].X - rect_points[0].X;
    float deltaY = rect_points[1].Y - rect_points[0].Y;
    PointF edge1 = new PointF(deltaX, deltaY);
    

    或者当然...

    PointF edge1 = new PointF(rect_points[1].X - rect_points[0].X, rect_points[1].Y - rect_points[0].Y);
    PointF edge2 = new PointF(rect_points[2].X - rect_points[1].X, rect_points[2].Y - rect_points[1].Y);
    

    这些PointF 现在是在rect_points[1] 处连接的两个向量或边。接下来,为了比较两者的大小,执行norm。如果我们手动执行相同的操作,这就是毕达哥拉斯:

    edge1Magnitude = Math.Sqrt(Math.Pow(edge1.X, 2) + Math.Pow(edge1.Y, 2));
    edge2Magnitude = Math.Sqrt(Math.Pow(edge2.X, 2) + Math.Pow(edge2.Y, 2));
    

    边中较长的边,即幅度最大的边,被认为是“主”边,或矩形的较长边:

    PointF primaryEdge = edge1Magnitude > edge2Magnitude ? edge1 : edge2;
    double primaryMagnitude = edge1Magnitude > edge2Magnitude ? edge1Magnitude : edge2Magnitude;
    

    最后,找到primaryEdge 和水平向量reference 之间的角度。这是 acos,“点积”,两者的,或者:

    PointF reference = new PointF(1,0);
    double refMagnitude = 1;
    double thetaRads = Math.Acos(((primaryEdge.X * reference.X) + (primaryEdge.Y * reference.Y)) / (primaryMagnitude * refMagnitude));
    double thetaDeg = thetaRads * 180 / Math.PI;
    

    现在,thetaDegedge1 与水平线之间的角度,以度为单位。

    【讨论】:

    • 请帮助以下行。 if(cv::norm(edge2) > cv::norm(edge1)) usedEdge = edge2; cv::Point2f 参考 = cv::Vec2f(1,0);
    • 请帮助 cv::Point2f 参考 = cv::Vec2f(1,0);
    • @mBangali 这应该在你的一点点努力下从其余部分中清楚,但我现在已经包含了它。
    • 感谢您的帮助。来这里之前我已经尝试了很多。
    • 没问题,我也回答了你的另一个问题:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 2019-06-14
    • 1970-01-01
    • 2019-05-16
    • 2020-10-19
    • 1970-01-01
    相关资源
    最近更新 更多