拖动鼠标画一条线,并在opencv Python中获取线的终点坐标 [英] Drag mouse to draw a line and get cordinates of end points of line in opencv Python

查看:50
本文介绍了拖动鼠标画一条线,并在opencv Python中获取线的终点坐标的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在图像上画一条线,以便单击pt1并拖动到pt2.因此,结果将显示一条线,我也将获得pt1和pt2的坐标.我目前正在使用两次单独的鼠标单击以使用以下代码绘制一条线

I need to draw a line in the image such that I click on pt1 and drag till pt2. So as a result a line will be displayed and I also get the coordinates of pt1 and pt2. I am currently using two separate mouse clicks to draw a line with the following code

import numpy as np
import cv2

def get_points(im):
    # Set up data to send to mouse handler
    data = {}
    data['im'] = im.copy()
    data['points'] = []

    # Set the callback function for any mouse event
    cv2.imshow("Image", im)
    cv2.setMouseCallback("Image", mouse_handler, data)
    cv2.waitKey(0)

    # Convert array to np.array
    points = np.vstack(data['points']).astype(float)

    return points

def mouse_handler(event, x, y, flags, data):

    if event == cv2.EVENT_LBUTTONDOWN:
        cv2.circle(data['im'], (x, y), 3, (0, 0, 255), 5, 16);
        cv2.imshow("Image", data['im']);
        if len(data['points']) < 2: # This can be changed for more or less points
            data['points'].append([x, y])


# Running the code
img = cv2.imread('image.jpg', 0)
pts = get_points(img)
cv2.line(img, (pts[0][0], pts[0][1]), (pts[1][0], pts[1][1]), (0,0,0), 2)
cv2.imshow('Image', img)
cv2.waitKey(0)

它有效,但不能解决我的问题.我希望它从pt1向下拖动到pt2并自行绘制一条线,而不是使用单击来获取点,然后绘制该线.因此,例如,下面的左图是我当前的实现方式,但我想像右图所示那样做

It works but does not solve my problem. I want it to drag down from pt1 to pt2 and draw a line it self rather than I get the points using clicks and then draw the line. So for example, the below image on the left my current implementation but i want to do it as done in the right image

谢谢您的建议.

推荐答案

也要使用其他事件.

这是一个快速的肮脏解决方案:

Here is a quick dirty solution:

import numpy as np
import cv2

btn_down = False

def get_points(im):
    # Set up data to send to mouse handler
    data = {}
    data['im'] = im.copy()
    data['lines'] = []

    # Set the callback function for any mouse event
    cv2.imshow("Image", im)
    cv2.setMouseCallback("Image", mouse_handler, data)
    cv2.waitKey(0)

    # Convert array to np.array in shape n,2,2
    points = np.uint16(data['lines'])

    return points, data['im']

def mouse_handler(event, x, y, flags, data):
    global btn_down

    if event == cv2.EVENT_LBUTTONUP and btn_down:
        #if you release the button, finish the line
        btn_down = False
        data['lines'][0].append((x, y)) #append the seconf point
        cv2.circle(data['im'], (x, y), 3, (0, 0, 255),5)
        cv2.line(data['im'], data['lines'][0][0], data['lines'][0][1], (0,0,255), 2)
        cv2.imshow("Image", data['im'])

    elif event == cv2.EVENT_MOUSEMOVE and btn_down:
        #thi is just for a ine visualization
        image = data['im'].copy()
        cv2.line(image, data['lines'][0][0], (x, y), (0,0,0), 1)
        cv2.imshow("Image", image)

    elif event == cv2.EVENT_LBUTTONDOWN and len(data['lines']) < 2:
        btn_down = True
        data['lines'].insert(0,[(x, y)]) #prepend the point
        cv2.circle(data['im'], (x, y), 3, (0, 0, 255), 5, 16)
        cv2.imshow("Image", data['im'])


# Running the code
img = cv2.imread('C://image.jpg', 1)
pts, final_image = get_points(img)
cv2.imshow('Image', final_image)
print pts
cv2.waitKey(0)

让我知道您的想法是什么.

Let me know if thi is what you had in mind.

这篇关于拖动鼠标画一条线,并在opencv Python中获取线的终点坐标的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆