Моя проблема заключается в следующем:
Используя EmguCv (C # OpenCV), мне нужно написать приложение, которое может определять, вращается ли моя фигура или нет, используя веб-камеру на моем компьютере. Я использовал Capture для захвата кадров с моей веб-камеры. Также я «очистил» каждый кадр с помощью фильтров SmoothGausian
и Canny
. Благодаря этому все, что видит камера, - это моя фигура, которую я нарисовал на листе бумаги. Я проверил момент hu1
моей фигуры и при проверке контуров в моем кадре я выбираю только те, которые имеют hu1
момент. И теперь это самая сложная часть. Пока я начинаю вращать свой лист бумаги, я хочу посчитать угол этого вращения. Я понял, что могу использовать ограничивающую область, которая является квадратом, который окружает найденный контур, и я мог рассчитать угол между линиями (предыдущей и настоящей) между двумя точками этой области. К сожалению, эта ограничивающая область не вращается, и теперь я прошу вас, ребята, о помощи :) Кто-нибудь знает, как решить эту проблему :)?
Извините за такой роман, но я хотел подробно описать мою проблему. Кроме того, я приложил часть моего кода, где происходит весь этот рисунок и захватывающая рамка.
//img - filtrated rame from a camera
var tmp = img.Convert<Gray, byte>().FindContours();
for (; tmp.HNext != null; tmp = tmp.HNext)
{
if(tmp.GetMoments().GetHuMoment().hu1 > 0.325 && tmp.GetMoments().GetHuMoment().hu1 < 0.34)
//if (tmp.GetMoments().GetHuMoment().hu1 > 0.33 && tmp.GetMoments().GetHuMoment().hu1 < 0.335)
{
var color1 = new Bgra(0, 255, 0, 255);
drawImg.Draw(tmp, color1, 2);
int left = tmp.BoundingRectangle.Left;
int top = tmp.BoundingRectangle.Top;
int right = tmp.BoundingRectangle.Right;
Point[] line2 = { new Point(left, top), new Point(right, top) };
drawImg.DrawPolyline(line2, false, new Bgra(255, 0, 0, 255), 1);
plik.WriteLine(left + "\t" + top);
Point[] tab = tmp.ToArray();
Point[] pointy = {tab[0], new Point( (int)tmp.GetMoments().GravityCenter.x, (int)tmp.GetMoments().GravityCenter.y )};
Console.WriteLine(tab[0].ToString());
drawImg.DrawPolyline(pointy, false, new Bgra(0, 0, 255, 255), 2);
}
}