C# 用c语言实现emgucv图像角度的NaN#

C# 用c语言实现emgucv图像角度的NaN#,c#,.net,opencv,ocr,emgucv,C#,.net,Opencv,Ocr,Emgucv,我参考了下面的链接来开发下面的csharp代码来检测图像的角度 Image imgout=imgInput.Convert().Not().ThresholdBinary(新) 灰色(50),新灰色(255)); 点轮廓向量的向量=点轮廓向量的新向量(); Mat hier=新Mat(); CvInvoke.FindContours(imgout、等高线、hier、Emgu.CV.CvEnum.RetrType.External、Emgu.CV.CvEnum.ChainApproxMethod.

我参考了下面的链接来开发下面的csharp代码来检测图像的角度

Image imgout=imgInput.Convert().Not().ThresholdBinary(新)
灰色(50),新灰色(255));
点轮廓向量的向量=点轮廓向量的新向量();
Mat hier=新Mat();
CvInvoke.FindContours(imgout、等高线、hier、Emgu.CV.CvEnum.RetrType.External、Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);
对于(int i=0;i edge2幅值?edge1:edge2;
PointF reference=新的PointF(顶点[1].X,顶点[0].Y);
double thetaras=Math.Acos((primaryEdge.X*reference.X)+(primaryEdge.Y*reference.Y))/(edge1幅值*edge2幅值);
double thetaDeg=thetaras*180/Math.PI;
}
我得到NaN作为角度的输出。请检查代码,让我知道我做错了什么

我使用emgucv进行图像处理


如果提供的值不在
-1
1
之间,则
Math.Acos()
将返回非数字的NaN

您对数值的计算是错误的,您需要计算矢量点积除以矢量大小积的ACO,如下所示:

double thetaras=Math.Acos(((primaryEdge.X*reference.X)+(primaryEdge.Y*reference.Y))/(primaryMagnitude*refMagnitude));
 Image<Gray, byte> imgout = imgInput.Convert<Gray, byte>().Not().ThresholdBinary(new 
 Gray(50), new Gray(255));
 VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
 Mat hier = new Mat();

CvInvoke.FindContours(imgout, contours, hier, Emgu.CV.CvEnum.RetrType.External, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);
     for (int i = 0; i <= 1; i++)
     {
        Rectangle rect = CvInvoke.BoundingRectangle(contours[i]);
        RotatedRect box = CvInvoke.MinAreaRect(contours[i]);
        PointF[] Vertices = box.GetVertices();
        PointF point = box.Center;
        PointF edge1 = new PointF(Vertices[1].X - Vertices[0].X, 
        Vertices[1].Y - Vertices[0].Y);
        PointF edge2 = new PointF(Vertices[2].X - Vertices[1].X,Vertices[2].Y - Vertices[1].Y);                     
        double edge1Magnitude = Math.Sqrt(Math.Pow(edge1.X, 2) + Math.Pow(edge1.Y, 2));
        double edge2Magnitude = Math.Sqrt(Math.Pow(edge2.X, 2) + Math.Pow(edge2.Y, 2));
        PointF primaryEdge = edge1Magnitude > edge2Magnitude ? edge1 : edge2;
        PointF reference = new PointF(Vertices[1].X, Vertices[0].Y);
        double thetaRads = Math.Acos((primaryEdge.X * reference.X) + (primaryEdge.Y * reference.Y))/(edge1Magnitude* edge2Magnitude);
        double thetaDeg = thetaRads * 180 / Math.PI;
    }