Ошибка атрибута: объект ‘numpy.float32’ не имеет атрибута ‘ctypes»

#c# #numpy #opencv

#c# #numpy #opencv

Вопрос:

Я пытаюсь вычислить размеры изображения по точкам, которые упорядочены сверху слева, сверху справа и т.д., Чтобы позже я мог выполнить преобразование перспективы в 4 точки и деформацию. (С использованием OpenCvSharp amp; numpy.net )

Я хочу получить максимальную ширину и максимальную высоту в виде целого числа из NDarray, но в этот момент он выдает «Python.Время выполнения.Исключение PythonException: ‘AttributeError: объект ‘numpy.float32’ не имеет атрибута ‘ctypes»

Не совсем уверен, как это сделать новичку, и я впервые работаю с этим OpenCvSharp и numpy.NET .

 NDarray rect = OrderPoints(pts);
            // 4 Points order from top-left top- right etc..
            NDarray tL = rect[0],
                tR = rect[1],
                bR = rect[2],
                bL = rect[3];
      

                           // width of new image
            NDarray w1 = ((bR[0] - bL[0]) * (bR[0] - bL[0]))   ((bR[1] - bL[1]) * (bR[1] - bL[1])); // quietly throws exception here 
            NDarray w2 = ((tR[0] - tL[0]) * (tR[0] - tL[0]))   ((tR[1] - tL[1]) * (tR[1] - tL[1]));

             w1 = np.sqrt(w1);
             w2 = np.sqrt(w2);

            // get max width as an interger

             int[] width1 = w1.GetData<int>(); // same error blows up here
            int[] width2 = w2.GetData<int>();

            int maxWidth = Math.Max(width1[0], width2[0]);
          


            NDarray h1 = ((tR[0] - bR[0]) * (tR[0] - bR[0]))   ((tR[1] - bR[1]) * (tR[1] - bR[1]));
            NDarray h2 = (tL[0] - bL[0]) * (tL[0] - bL[0])   (tL[1] - bL[1]) * (tL[1] - bL[1]);

           h1 = np.sqrt(h1);
            h2 = np.sqrt(h2);

            int[] height = h1.GetData<int>();
            int[] height2 = h2.GetData<int>();


            int maxHeight = Math.Max(height[0], height2[0]);

            // make a top - down view
            var dst = np.array(
                  new[,] {
                     { 0,0},
                     {maxWidth - 1, 0 },
                     {maxWidth - 1, maxHeight - 1 },
                     {0, maxHeight - 1 }
                      });
            
              var rectPts = rect.GetData<Point2f>();
               var dstarray = dst.GetData<Point2f>();


             Mat matr = Cv2.GetPerspectiveTransform(rectPts, dstarray);
            Mat output = new Mat();
            Cv2.WarpPerspective(image, output, matr, new Size(maxWidth, maxHeight)); 

            return output;
  

Ответ №1:

Мне удалось найти решение, используя repr свойство для возврата строки данных, затем проанализировать ее в float, а затем преобразовать в Int.

 int width1 = (int)float.Parse(w1.repr);
int width2 = (int)float.Parse(w2.repr);