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