Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# csharp中矩形的emgucv角度检测_C#_Opencv_Vector_Emgucv_Point - Fatal编程技术网

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);