C# csharp中矩形的emgucv角度检测
我使用下面的线程来执行矩形图像的角度检测。 我被下面的代码卡住了C# csharp中矩形的emgucv角度检测,c#,opencv,vector,emgucv,point,C#,Opencv,Vector,Emgucv,Point,我使用下面的线程来执行矩形图像的角度检测。 我被下面的代码卡住了 cv::Point2f edge1=cv::Vec2f(矩形点[1].x,矩形点[1].y)-cv::Vec2f(矩形点[0].x,矩形点[0].y); cv::Point2f edge2=cv::Vec2f(矩形点[2].x,矩形点[2].y)-cv::Vec2f(矩形点[1].x,矩形点[1].y); cv::Point2f usedEdge=edge1; 如果使用了(cv::norm(edge2)>cv::norm(edg
cv::Point2f edge1=cv::Vec2f(矩形点[1].x,矩形点[1].y)-cv::Vec2f(矩形点[0].x,矩形点[0].y);
cv::Point2f edge2=cv::Vec2f(矩形点[2].x,矩形点[2].y)-cv::Vec2f(矩形点[1].x,矩形点[1].y);
cv::Point2f usedEdge=edge1;
如果使用了(cv::norm(edge2)>cv::norm(edge1)),则dGe=edge2;
cv::Point2f reference=cv::Vec2f(1,0);//水平边
角度=180.0f/CV_PI*acos((reference.x*usedge.x+reference.y*usedge.y)/(CV::norm(reference)*CV::norm(usedge));
我无法找出以下几行我需要在emgu csharp中转换的代码
cv::Point2f edge1=cv::Vec2f(矩形点[1].x,矩形点[1].y)-cv::Vec2f(矩形点[0].x,矩形点[0].y);
cv::Point2f edge2=cv::Vec2f(矩形点[2].x,矩形点[2].y)-cv::Vec2f(矩形点[1].x,矩形点[1].y);
角度=180.0f/CV_PI*acos((reference.x*usedge.x+reference.y*usedge.y)/(CV::norm(reference)*CV::norm(usedge));
谁能帮我解决这个问题?任何帮助或建议都将不胜感激。这里的
点2f
只是点,具有X
和Y
的浮点精度属性,用于存储I
和J
的二维向量。如果声明将边设置为两点之间的向量,即这两点之间的增量,则其方法是。在C#中,我将这样写:
float deltaX=rect_points[1].X-rect_points[0].X;
浮点deltaY=rect_点[1]。Y-rect_点[0]。Y;
PointF edge1=新的PointF(deltaX、deltaY);
或当然
PointF edge1=新点f(矩形点[1].X-矩形点[0].X,矩形点[1].Y-矩形点[0].Y);
PointF edge2=新点F(矩形点[2].X-矩形点[1].X,矩形点[2].Y-矩形点[1].Y);
这些点F
现在是在矩形点[1]
处连接的两个向量或边。接下来,执行norm
,以比较两者的大小。如果我们手动执行相同的操作,这就是毕达哥拉斯:
edge1幅值=Math.Sqrt(Math.Pow(edge1.X,2)+Math.Pow(edge1.Y,2));
Edge2Magnite=Math.Sqrt(Math.Pow(edge2.X,2)+Math.Pow(edge2.Y,2));
最大幅值的较长边被视为“主边”,或矩形的较长边:
PointF primaryEdge=edge1幅值>edge2幅值?第1边:第2边;
双主震级=边1震级>边2震级?Edge1震级:Edge2震级;
最后,要找到主边
和水平向量之间的角度,参考
。这是两种产品中的“点积”的ACO,或:
PointF reference=新的PointF(1,0);
双参考值=1;
double thetaras=Math.Acos(((primaryEdge.X*reference.X)+(primaryEdge.Y*reference.Y))/(primaryMagnitude*refMagnitude));
double thetaDeg=thetaras*180/Math.PI;
现在,
thetage
是edge1
和水平面之间的角度,单位为度 这里的点2f
只是点,具有X
和Y
的浮点精度属性,用于存储I
和J
的二维向量。如果声明将边设置为两点之间的向量,即这两点之间的增量,则其方法是。在C#中,我将这样写:
float deltaX=rect_points[1].X-rect_points[0].X;
浮点deltaY=rect_点[1]。Y-rect_点[0]。Y;
PointF edge1=新的PointF(deltaX、deltaY);
或当然
PointF edge1=新点f(矩形点[1].X-矩形点[0].X,矩形点[1].Y-矩形点[0].Y);
PointF edge2=新点F(矩形点[2].X-矩形点[1].X,矩形点[2].Y-矩形点[1].Y);
这些点F
现在是在矩形点[1]
处连接的两个向量或边。接下来,执行norm
,以比较两者的大小。如果我们手动执行相同的操作,这就是毕达哥拉斯:
edge1幅值=Math.Sqrt(Math.Pow(edge1.X,2)+Math.Pow(edge1.Y,2));
Edge2Magnite=Math.Sqrt(Math.Pow(edge2.X,2)+Math.Pow(edge2.Y,2));
最大幅值的较长边被视为“主边”,或矩形的较长边:
PointF primaryEdge=edge1幅值>edge2幅值?第1边:第2边;
双主震级=边1震级>边2震级?Edge1震级:Edge2震级;
最后,要找到主边
和水平向量之间的角度,参考
。这是两种产品中的“点积”的ACO,或:
PointF reference=新的PointF(1,0);
双参考值=1;
double thetaras=Math.Acos(((primaryEdge.X*reference.X)+(primaryEdge.Y*reference.Y))/(primaryMagnitude*refMagnitude));
double thetaDeg=thetaras*180/Math.PI;
现在,
thetage
是edge1
和水平面之间的角度,单位为度 请帮助下面的行。如果使用了(cv::norm(edge2)>cv::norm(edge1)),则dGe=edge2;cv::Point2f reference=cv::Vec2f(1,0)@mBangali,完成。请帮助获取cv::Point2f reference=cv::Vec2f(1,0)@姆班加利,你只要稍加努力,其他人应该会明白这一点,但我现在已经包括在内了。谢谢你的帮助。在来这里之前我已经尝试了很多。下面的句子请帮忙。
if(cv::norm(edge2) > cv::norm(edge1)) usedEdge = edge2;
cv::Point2f reference = cv::Vec2f(1,0);