Я работаю над программой, которая требует от меня найти угол между двумя линиями. Я нашел все координаты точек линий, на которые ссылаются 0,0 точек, но я не понимаю, как реализовать произведение точек в Opencv, чтобы найти угол.
Я использую Visual C ++, используя библиотеку opencv. Я также узнал, что я могу использовать функцию cv :: Mat :: dot, чтобы получить точечный продукт, но я не могу найти хорошего примера. Я не могу понять объяснение в этом ссылка на сайт.
Кто-нибудь может дать мне хороший пример? так что я могу понять, как использовать эту функцию, чтобы найти скалярное произведение двух линий. Спасибо.
Если у вас есть два вектора, представляющих ваши строки, и назовите их a
а также b
(типа cv::Mat
) тогда скалярное произведение вычисляется как
double p = a.dot(b);
редактировать
Пример кода, по комментариям автора.
float a[2] = {1.0, 2.0};
float b[2] = {3.0, 4.0};
cv::Mat AA(1,2,CV_32FC1,a);
cv::Mat BB(1,2,CV_32FC1,b);
cout << AA << endl;
cout << BB << endl;
cout << AA.dot(BB) << " should be equal to 11" << endl;
Ну, то скалярное произведение из двух векторов A и B определяется как
(length of A) * (length of B) * cos(angle)
где angle
представляет угол между двумя векторами. Таким образом, чтобы найти угол между ними, сначала нужно найти скалярное произведение, затем разделить его на длину A и длину B, а затем взять обратный косинус.
То, на что это похоже в вашем случае, является чем-то вроде этого, предполагая, что a и b объявлены соответственно как cv::Mat
s:
double dotprod = a.dot(b);
double angle = arccos(dotprod / (a.size().height * b.size().height))