@JRBRO

Как сделать чтобы он рисовал один прямоугольник до отпускания, а не рисовал кучу?

Использую данную штуку для получения координат, но кач-во работы не очень устраивает. Квадрат дергается, иногда не рисуется, иногда залипает.

import cv2
import sys
import matplotlib.pyplot as plt
img = cv2.imread(sys.argv[1])
ix = -1
iy = -1
drawing = False

def draw_reactangle_with_drag(event, x, y, flags, param):
    global ix, iy, drawing, img
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        ix = x
        iy = y


    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing == True:
            cv2.rectangle(img, pt1=(ix,iy), pt2=(x, y),color=(0,255,255),thickness=10)

    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        cv2.rectangle(img, pt1=(ix,iy), pt2=(x, y),color=(0,255,255),thickness=10)
        print(ix, iy, x, y)
cv2.namedWindow(winname= "Title of Popup Window")
cv2.setMouseCallback("Title of Popup Window", draw_reactangle_with_drag)

while True:
    cv2.imshow("Title of Popup Window", img)
    if cv2.waitKey(10) == 27:
        break
cv2.destroyAllWindows()


В чем может быть проблема?
Как сделать чтобы он рисовал один прямоугольник до отпускания, а не рисовал кучу?
  • Вопрос задан
  • 63 просмотра
Решения вопроса 1
Vindicar
@Vindicar
Еще один шикарный пример вопроса не по теме. В заголвоке вопроса лаги, а по делу
Как сделать чтобы он рисовал один прямоугольник до отпускания, а не рисовал кучу?


Потому что ты рисуешь множество прямоугольников, не стирая их.
Когда ты рисуешь прямоугольник - ты изменяешь изображение. И следующий рисуешь уже на изменённом изображении. Вот и получается множество прямоугольников.

Тебе нужно делать копию оригинального изображения, рисовать на ней, и показывать эту изменённую копию.
import cv2
import sys
import matplotlib.pyplot as plt
original = cv2.imread(sys.argv[1])
ix = -1
iy = -1
drawing = False

def draw_reactangle_with_drag(event, x, y, flags, param):
    global ix, iy, drawing, original
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        ix = x
        iy = y
    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing == True:
            img = original.copy()
            cv2.rectangle(img, pt1=(ix,iy), pt2=(x, y),color=(0,255,255),thickness=10)
            cv2.imshow("Title of Popup Window", img)
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        img = original.copy()
        cv2.rectangle(img, pt1=(ix,iy), pt2=(x, y),color=(0,255,255),thickness=10)
        print(ix, iy, x, y)
        cv2.imshow("Title of Popup Window", img)

cv2.namedWindow(winname= "Title of Popup Window")
cv2.setMouseCallback("Title of Popup Window", draw_reactangle_with_drag)
cv2.imshow("Title of Popup Window", original)
while True:
    if cv2.waitKey(10) == 27:
        break
cv2.destroyAllWindows()


А вообще, если ты хочешь сделать выделение области рамкой, cv2.selectROI() в помощь.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
08 дек. 2022, в 02:27
6000 руб./за проект
08 дек. 2022, в 01:28
7000 руб./за проект
08 дек. 2022, в 01:22
1500 руб./за проект