Реализовать ввод мышью с opencv на изображении - PullRequest
0 голосов
/ 25 марта 2020

Я нашел код в сети и немного его изменил. Я делаю навигационный проект и хочу, чтобы пользователь вводил начальную и конечную точку, нажимая на изображение карты. Вот что у меня есть:

import cv2 as cv2

def draw_circle(event,x,y,flags,param):
    global mouseX,mouseY
    if event == cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img,(x,y),2,(0,0,0),-1)
        mouseX,mouseY = x,y

img = cv2.imread("1.png")
img = cv2.resize(g1,(800,600))
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
cv2.imshow('image',img)

Обычно нам нужно cv2.waitKey() для показа этого изображения, но в этом случае я действительно не знаю, что делать дальше.

Я хочу показать этот вид карты, и когда пользователь дважды щелкнет по нему, он покажет черную точку (это реализовано). После того, как пользователь введет две точки, изображение закроется, и функция вернет два набора пиксельных координат, указывающих, где пользователь щелкнул.

Я видел, как люди ставили cv2.imshow() и cv2.waitKey() через некоторое время l oop, это покажет изображение, и функция щелчка также работает нормально. Но я не знаю, как вернуть координату пикселя таким образом.

Ответы [ 2 ]

0 голосов
/ 25 марта 2020
import cv2
import numpy as np

def mouse_callback(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        global mouseX, mouseY, last_mouseX, last_mouseY
        last_mouseX, last_mouseY = mouseX, mouseY
        mouseX, mouseY = x, y
        print("x =", mouseX, "\ty =", mouseY)
        print("last_x =", last_mouseX, "last_y =", last_mouseY)
        global disp_img
        disp_img = np.copy(img)
        cv2.circle(disp_img, (mouseX,mouseY), 2, (0,0,255), -1)
        cv2.circle(disp_img, (last_mouseX,last_mouseY), 2, (255,0,0), -1)

mouseX, mouseY, last_mouseX, last_mouseY = 0, 0, 0, 0
img = cv2.imread('ip.jpg')
disp_img = np.copy(img)
winname = 'image'
cv2.namedWindow(winname)
cv2.setMouseCallback(winname, mouse_callback)
# we need to loop imshow in order to draw the circle
ch = 0
while ch != 27:  # press esc to exit
    cv2.imshow('image', disp_img)
    ch = cv2.waitKey(1)
cv2.destroyAllWindows()
0 голосов
/ 25 марта 2020
import cv2 as cv2

def draw_circle(event,x,y,flags,param):
    global mouseX,mouseY
    if event == cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img,(x,y),2,(0,0,0),-1)
        mouseX,mouseY = x,y
        cv2.destroyWindow('image')
        print('last position: ', mouseX, mouseY)

img = cv2.imread("1.jpg")
img = cv2.resize(img, (800,600))
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
cv2.imshow('image',img)
cv2.waitKey()

Если вы запустите этот код, он зарегистрирует последнюю позицию мыши, разрушит окно и выведет на консоль результаты. Уловка, которую вы, должны использовать x и y, предоставляемые функцией обратного вызова. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...