Я загрузил изображение с использованием opencv-библиотек в python, и теперь я хочу нарисовать прямоугольник с помощью мыши, но при рисовании прямоугольника прямоугольник должен быть видимым, чтобы персонаж, рисующий его, мог разместить его таким образом, чтобы объект интереса полностью в прямоугольнике, но мой код не производит желаемый результатРисование прямоугольника на изображении opencv?
мой код
import os
import sys
import numpy as np
import cv2
baseDir = '/home/aman/Downloads/shirt/'
filenames = next(os.walk(baseDir))[2]
drawing = False # true if mouse is pressed
mode = True # if True, draw rectangle. Press 'm' to toggle to curve
ix,iy = -1,-1
tx,ty = -1,-1
def draw_circle(event,x,y,flags,param):
global ix,iy,drawing,mode
print 'aman'
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix,iy = x,y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
if mode == True:
#cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
cv2.line(img, (ix,iy),(ix,y), 255, 1, 8, 0)
cv2.line(img, (ix,iy),(x,iy), 255, 1, 8, 0)
cv2.line(img, (ix,y),(x,y), 255, 1, 8, 0)
cv2.line(img, (x,iy),(x,y), 255, 1, 8, 0)
else:
cv2.circle(img,(x,y),5,(0,0,255),-1)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
if mode == True:
#cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
cv2.rectangle(img,(ix,y),(x,y),(0,255,0),-1)
cv2.rectangle(img,(x,iy),(x,y),(0,255,0),-1)
else:
cv2.circle(img,(x,y),5,(0,0,255),-1)
img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
cv2.imshow('image',img)
k = cv2.waitKey(1) & 0xFF
if k == ord('m'):
mode = not mode
elif k == 27:
break
cv2.destroyAllWindows()
`
но выход произвел нечто вроде
Я не хочу такого поведения, я просто хочу, чтобы один прямоугольник не для каждого движения. Я знаю, что мне нужно изменить код в событии перемещения мыши, но проблема в том, как это сделать, чтобы, когда человек двигает мышь, он может видеть полный прямоугольник, и когда он отпускает кнопку, прямоугольник должен быть исправлен?
OpenCv рисует линию непосредственно в ваши данные изображения. Либо скопируйте и восстановите для каждого нового прямоугольника, либо используйте подходящий Gui Toolkit. – Mailerdaimon
Я действительно не знаю, как это сделать в Python (отсюда комментарий), но идея состоит в том, чтобы рисовать каждый промежуточный прямоугольник, выполняя XOR между цветом линии и цветом изображения на каждом пикселе. Затем, прежде чем нарисовать следующий прямоугольник, XOR снова с цветом линии, чтобы отменить предыдущий прямоугольник. В C++ вы сделаете это с помощью [LineIterator] (http://docs.opencv.org/modules/core/doc/drawing_functions.html#lineiterator). Лишь на последнем прямоугольнике вы обычно рисуете в конечном цвете. – beaker