Python 连续绘图(opencv)

Python 连续绘图(opencv),python,python-2.7,opencv,Python,Python 2.7,Opencv,我正试着跟着老鼠的动作画画。它工作正常 当我缓慢移动鼠标时,所绘制的图形看起来是连续的,但当我稍微加快鼠标移动时,我会得到不连续的图形 我怎样才能连续地用鼠标画画 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 de

我正试着跟着老鼠的动作画画。它工作正常

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

我怎样才能连续地用鼠标画画

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()
我得到的结果:


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

编辑:

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

因此,您需要将各个点与线链接起来

这是您可以执行的唯一“实时”绘图。证明:

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

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

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

编辑:

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

因此,您需要将各个点与线链接起来

这是您可以执行的唯一“实时”绘图。证明:

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

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个像素。然后我想了一会儿,得出结论,O.S.必须对触发mousemove事件的频率有一定的限制。我终于看到一个网站,上面说在Win XP上,系统设置每15毫秒生成一次更新。当移动鼠标时,考虑到每秒可以大致移动整个屏幕的宽度四次,您可以轻松计算出在十分之一秒内可以移动多少像素。要确认我说的话,请在屏幕上移动鼠标,看看指针重新绘制的频率。它不是连续的。因此,我不期望你能做得更好。必须遵循其他一些策略/算法。我在Windows上打开了mspaint,快速绘制不会像预期的那样从连续移动中生成曲线,而是生成线段。所以你需要把各个点和线联系起来。非常感谢你的解释。我会将这些点保存在列表中,稍后再绘制它们。这肯定会持续有效的。我刚刚运行了你的脚本。我删除了圆圈图,并查看了打印的坐标。当快速移动时,坐标大约相隔10个像素。然后我想了一会儿,得出结论,O.S.必须对触发mousemove事件的频率有一定的限制。我终于看到一个网站,上面说在Win XP上,系统设置每15毫秒生成一次更新。当移动鼠标时,考虑到每秒可以大致移动整个屏幕的宽度四次,您可以轻松计算出在十分之一秒内可以移动多少像素。要确认我说的话,请在屏幕上移动鼠标,看看指针重新绘制的频率。它不是连续的。因此,我不期望你能做得更好。必须遵循其他一些策略/算法。我在Windows上打开了mspaint,快速绘制不会像预期的那样从连续移动中生成曲线,而是生成线段。因此,您需要将各个点与线链接起来。