Есть несколько проблем с вашим кодом.
1) img1 = fFrame.copy()
создает экземпляр img1
, а затем вы рисуете его, и как локальная переменная вы никогда не используете его снова, что приводит к потере того, что вы нарисовалась. Вместо этого нарисуйте фактический кадр, как показано ниже.
if (event == cv2.EVENT_MOUSEMOVE and drag and not(select_flag)):
print('case 2')
point2 = [x,y]
drawMyLine(fFrame)
2) После рисования текущей строки вы должны обновить начало вашей следующей строки (next point1
), чтобы оно стало концом текущей строки (текущий point2
).
if (event == cv2.EVENT_MOUSEMOVE and drag and not(select_flag)):
print('case 2')
point2 = [x,y]
drawMyLine(fFrame)
point1 = [x,y] # <-- update for next draw
3) Это необязательно, вы можете напрямую показать текущий кадр вместо img2
.
if (event == cv2.EVENT_LBUTTONUP and drag and not(select_flag)):
print('case 3')
point2 = [x,y]
drag = 0
select_flag = 1
cv2.imshow(src_window,fFrame)
callback = 1
4) Это также необязательно, но для того, чтобы правильно нарисовать последнюю строку в конце клика, вам следует вызвать функцию рисования в последний раз в этом случае.
if (event == cv2.EVENT_LBUTTONUP and drag and not(select_flag)):
print('case 3')
point2 = [x,y]
drawMyLine(fFrame) # <-- draw the last line
drag = 0
select_flag = 1
cv2.imshow(src_window,fFrame)
callback = 1
В целом, остальная часть кода является то же самое, и обновленный обработчик мыши ниже.
def myMouseHandler(event,x,y,flags,param):
global drag
global select_flag
global callback
global point1
global point2
if (event==cv2.EVENT_LBUTTONDOWN and not(drag) and not(select_flag)):
print('case 1')
point1=[x,y]
drag = 1
if (event == cv2.EVENT_MOUSEMOVE and drag and not(select_flag)):
print('case 2')
point2 = [x,y]
drawMyLine(fFrame)
point1 = [x,y]
if (event == cv2.EVENT_LBUTTONUP and drag and not(select_flag)):
print('case 3')
point2 = [x,y]
drawMyLine(fFrame)
drag = 0
select_flag = 1
cv2.imshow(src_window,fFrame)
callback = 1