У меня много строк в моем opencv, я хочу их повернуть, но Opencv не имеет функции поворота формы. Есть функция поворота изображения.
Я сделал прямоугольник и нарисовал на нем линии. затем я повернул его с помощью cv2.getRotationMatrix2D. Я попытался создать маску с помощью cv2.addWeighted и добавить линии на изображение, но это не сработало должным образом.
Я нарисовал несколько примеров с помощью Canva:
Это код, который я использую для рисования линий:
def draw_lines(img, color, cx, cy, deg):
deg = int(deg)
for a in range(720, -720, -30):
img = cv2.line(img, (cx-165, cy+a), (cx+165, cy+a), color, 1,cv2.LINE_AA)
return img
Как я могу повернуть эти линии, используя только математику?
*информация: Пример изогнутых линий (без поворота): Я хочу их повернуть.
Я пробовал, когда вычисляю первую и последнюю точки тригонометрией, линии не поворачиваются, а просто изгибаются по одной линии. Я думаю, что это что-то более сложное.
Помогает ли этот пример: atqed.com/numpy-rotate-vector?
Это хороший пример для изображений с четырьмя точками, но я не смог применить его к нескольким строкам, написанным с помощью цикла for.
Я добавил пример изогнутых линий на вопрос.
Матрица вращения поворачивает векторы вокруг начала координат (0, 0)
. Вы всегда должны учитывать, в какой системе координат находятся векторы, которые вы хотите повернуть.
Объединяем ваш код и пример:
import numpy as np
import cv2
from math import cos, sin
def draw_lines(img, color, cx, cy, deg):
theta = np.deg2rad(deg)
rot = np.array([[cos(theta), -sin(theta)], [sin(theta), cos(theta)]])
c = np.array([cx, cy])
for a in range(720, -720, -30):
v1 = np.dot(rot, np.array([-165, a])).astype(int)
v2 = np.dot(rot, np.array([165, a])).astype(int)
img = cv2.line(img, c + v1, c + v2, color, 1, cv2.LINE_AA)
return img
def main():
img = np.zeros((2000, 2000, 3), np.uint8) # create empty black image
draw_lines(img, [255, 255, 255], 1000, 1000, 30)
cv2.imwrite("out.png", img)
main()
это сработало!! большое спасибо. "np.zeros((2000, 2000, 3), np.uint8)" что именно это делает?
создает массив со всеми 0 в нем. подробности можно найти в документации numpy.
@HighHill: я использую np.zeros
для создания пустого изображения RGB в качестве холста.
вы должны вычислить конечные точки каждой линии, а затем нарисовать ее. математика включает тригонометрию. поскольку вы уже знаете о матрицах вращения, у вас не должно возникнуть особых проблем с этим.