Получение NaN для угла изображения в emgucv с помощью c# - PullRequest
0 голосов
/ 19 июня 2020

Я сослался на следующую ссылку, чтобы разработать следующий код csharp для определения угла изображения. { ссылка }

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

Я получаю NaN в качестве вывода для угла. Пожалуйста, go через код дайте мне знать, что я сделал не так?

Я использовал emgucv для обработки изображений.

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 19 июня 2020

NaN, не число, возвращается Math.Acos(), если предоставленное значение не находится в диапазоне от -1 до 1.

Ваш расчет thetaRads неверен, вам необходимо вычислить Acos скалярного произведения векторов, деленное на произведение величин векторов, согласно:

enter image description here

double thetaRads = Math.Acos(((primaryEdge.X * reference.X) + (primaryEdge.Y * reference.Y)) / (primaryMagnitude * refMagnitude));
...