2016-02-03 5 views
1

У меня есть следующий код, который работает, за исключением круга рисования на предоставленном изображении. Я попробовал пример setMouseCallback на here, который работает, но я боюсь, что я внедрил его неправильно в свой собственный код.cv2.circle() не отображается

import numpy as np 
import urllib.request as ur 
import cv2 

params = np.zeros([1, 2]) # init params 
s_img = np.zeros((512, 512, 3), np.uint8) 


def clicked_corners(camera, user, pw): 
    """ 
    Function to write the clicked corners (ij) to a camera object. 
    Image is provided by a valid url to a snapshot of camera, 
    usually in the form of http://xxx.xxx.x.x/snapshot/view0.jpg 
    :param camera: Camera object 
    :param user: username to authorize access to URL if set 
    :param pw: password to authorize access to URL if set 
    """ 
    window_name = 'img' 
    ... # define url, not important to the question 
    global params, s_img 

    ... # handle authentication, not important to the question 

    ... #open url 
    img = cv2.imdecode(arr, -1) # decode array to an image 
    s_img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5) 
    cv2.startWindowThread() 

    cv2.imshow(window_name, s_img) 
    print('Click corners to determine the field') 
    cv2.setMouseCallback(window_name, on_mouse, params) # <-- setting callback for mouseclicks 
    k = cv2.waitKey(0) & 0xFF # adding a keylistener 

    if k == 27: 
     ... # destroy window 

    clicked_points = params 

    return clicked_points 


def on_mouse(event, x, y, flag, param): 
    global params 
    if event == cv2.EVENT_LBUTTONDOWN: 
     ... do some operation 
     cv2.circle(s_img, (x, y), 100, (255, 0, 0), -1) # **draw circle this part is not working properly** 

    ... return something 

Я отредактировал код, чтобы выделить важные части вопросов, и где я предполагаю, что это не так, как должно быть.

+0

может быть настройка обратного вызова cv2.setMouseCallback (window_name, on_mouse, Params) перед imshow работы? – orkan

+0

Вложенный код содержит много материалов, которые не имеют отношения к вопросу. Чтобы другие могли воспроизвести вашу проблему, вы должны приложить больше усилий, чтобы изолировать проблему до публикации. Прочтите это руководство [mcve] –

+0

@orkan Пробовал, не работает. –

ответ

2

Исправлено. По сути, я сделал добавление вызова imshow(), чтобы показать обновленную версию изображения с кружком. Эта исправленная версия работает без каких-либо сбоев, то window_name убеждается, что существующее окно используется для отображения обновленного изображения:

import numpy as np 
import cv2 

params = np.zeros([1, 2]) # init params 
s_img = np.zeros((512, 512, 3), np.uint8) 
window_name = 'img' 

def main(): 
    global s_img 
    img = np.ones([512, 512, 3]) * 255 
    s_img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5) 

    cv2.startWindowThread() 
    cv2.imshow(window_name, s_img) 

    print ('Click corners to determine the field') 
    cv2.setMouseCallback(window_name, on_mouse, None) 

    while True: 
     k = cv2.waitKey(0) & 0xFF 

     if k == 27: 
      break # destroy window 


def on_mouse(event, x, y, flag, param): 
    global s_img 
    if event == cv2.EVENT_LBUTTONDOWN: 
     print ('here') 
     cv2.circle(s_img, (x, y), 100, (255, 0, 0), -1) 
     cv2.imshow(window_name, s_img) 


if __name__ == '__main__': 
    main() 
+0

Привет @ALGOholic, похоже, это работает для меня. Большое спасибо. В частности, я вижу, что вы поместили «cv2.imshow()» сразу после рисования круга в «on_mouse()», и, похоже, я столкнулся с этой проблемой. Как ты это нашел? В любом случае, добро пожаловать в SO и благодарим вас за полезный ответ! –

+1

Спасибо! Я просто понял, что связь между обновлением изображения и обновлением окна вообще отсутствовала. Я не ожидал, что окно будет отслеживать состояние изображения разумно - это редко бывает в интерфейсах пользовательского интерфейса. – ALGOholic

Смежные вопросы