2017-02-21 907 views
0

我需要在图像中绘制一条线,以便点击pt1并拖动到pt2。因此,会显示一条线,我也会得到pt1和pt2的坐标。我目前使用两个单独的鼠标点击以下代码画线拖动鼠标绘制一条线,并在opencv中获得线端点的坐标Python

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并自己绘制一条线,而不是使用点击获得​​点,然后绘制线条。因此,例如,在离开我的当前实现下面的图片,但我想这样做是正确的图像进行

enter image description here

感谢提前你的建议。

回答

0

只需使用其他事件。

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

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) 

让我知道如果THI是你脑子里想的是什么。