gpt4 book ai didi

c# - csharp中矩形的emgucv角度检测

转载 作者:行者123 更新时间:2023-12-02 16:59:46 29 4
gpt4 key购买 nike

我正在使用以下线程对矩形图像执行 Angular 检测。
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);

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

最佳答案

这里的Point2f是简单的点,具有XY的浮点精度属性,用于存储IJ的2D vector 。他们的方法,如果声明将边设置为两点之间的 vector ,即这两点之间的增量。在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]处连接的两个 vector 或边缘。接下来,执行 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与水平 vector reference之间的夹角。这是“点产品”,两者或两者中的一个,或者:

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与水平线之间的 Angular ,以度为单位。

关于c# - csharp中矩形的emgucv角度检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62448460/

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