【问题标题】:continuous drawing (opencv)连续绘图(opencv)
【发布时间】:2015-03-08 16:19:00
【问题描述】:

我正在尝试跟随鼠标的移动进行绘制。它工作正常。

当我缓慢移动鼠标时,绘制的内容看起来是连续的,但是当我稍微加快鼠标移动时,我会得到不连续的图形。

如何用鼠标连续画图

import cv2
import numpy as np 

drawing=False # true if mouse is pressed
mode=True # if True, draw rectangle. Press 'm' to toggle to curve

# mouse callback function
def interactive_drawing(event,x,y,flags,param):
    global ix,iy,drawing, mode

    if event==cv2.EVENT_LBUTTONDOWN:
        drawing=True
        ix,iy=x,y

    elif event==cv2.EVENT_MOUSEMOVE:
        if drawing==True:
            if mode==True:
                cv2.circle(img,(x,y),1,(0,0,255),-1)
                print x,y
    elif event==cv2.EVENT_LBUTTONUP:
        drawing=False
        if mode==True:
            cv2.circle(img,(x,y),1,(0,0,255),-1)
            #print x,y
            #cv2.line(img,(x,y),(x,y),(0,0,255),10)
    return x,y




img = np.zeros((512,512,3), np.uint8)

cv2.namedWindow('begueradj')
cv2.setMouseCallback('begueradj',interactive_drawing)
while(1):
    cv2.imshow('begueradje',img)
    k=cv2.waitKey(1)&0xFF
    if k==27:
        break
cv2.destroyAllWindows()

我得到的结果:

【问题讨论】:

    标签: python python-2.7 opencv


    【解决方案1】:

    当鼠标快速移动时,您的绘图速度无法跟上鼠标事件的速度。要确认这一点,请修改您的代码以在不绘制的情况下捕获鼠标坐标并将它们添加到列表中。添加按键处理程序以绘制捕获的点。如果是这种情况,您可以在一个小的透明图像上画一个圆圈一次。然后,您可以覆盖该小图像,而不是在几分之一秒的空间内绘制一个涉及太多计算的圆圈。试一试并提出建议。

    编辑:

    正如我在上面的评论中所说,

    所以你需要用线连接各个点。

    这是您唯一可以进行的“现场”绘图。证明:

    因此,您需要跟踪您访问的每个像素,以便在它与鼠标移动到的下一个像素之间画一条线:

    cv2.line(img,(ix,iy),(x,y),(0,0,255),10) # draw line between former and present pixel
    ix=x # save former x coordinate
    iy=y # save former y coordinate
    

    【讨论】:

    • 非常感谢您的解释。我会将这些点保存在一个列表中,稍后再绘制它们。这肯定会持续有效。
    • عرفت انك من الجزائر يا أخي في الله :-)
    • 我刚刚运行了你的脚本。我删除了圆图并查看了打印的坐标。快速移动时,坐标相距大约 10 个像素。然后我想了一会儿,得出的结论是操作系统。必须对触发 mousemove 事件的频率有所限制。
    • 我终于看到了一个网站,说在 Win XP 上,系统设置每 15 毫秒生成一次更新。移动鼠标时,考虑到每秒可以大致移动整个屏幕的宽度四次,您可以轻松计算在十分之一秒内可以移动多少像素。要确认我在说什么,请在屏幕上移动鼠标并查看重新绘制指针的频率。它不是连续的。因此,我不希望你能做得更好。
    • 必须遵循其他一些策略/算法。我在 Windows 上打开 mspaint 并快速绘制不会像预期的那样从连续运动中生成曲线,而是生成段。因此,您需要将各个点与线连接起来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多