Python 如何使用鼠标从视频中拍照

Python 如何使用鼠标从视频中拍照,python,linux,video,opencv,snapshot,Python,Linux,Video,Opencv,Snapshot,我有一个高速公路上汽车的视频,所以我想用鼠标一个接一个地剪切。但我需要更自动地完成这项工作,例如,一种方法是按空格键更改帧,然后用鼠标剪切,然后将图像自动保存到文件夹中 你曾经在Linux上看到过类似的东西吗?我正在尝试在OpenCV中执行此操作,尽管它不是必需的 提前谢谢。我在下面添加了一个代码。这对我来说很好。围绕要单独保存的对象绘制矩形。按空格键进入下一帧。(有时你需要按更长的时间才能向前移动。我不知道为什么)。类似地,退出“Esc” 用法:python car.py视频文件 #car.

我有一个高速公路上汽车的视频,所以我想用鼠标一个接一个地剪切。但我需要更自动地完成这项工作,例如,一种方法是按空格键更改帧,然后用鼠标剪切,然后将图像自动保存到文件夹中

你曾经在Linux上看到过类似的东西吗?我正在尝试在OpenCV中执行此操作,尽管它不是必需的


提前谢谢。

我在下面添加了一个代码。这对我来说很好。围绕要单独保存的对象绘制矩形。按空格键进入下一帧。(有时你需要按更长的时间才能向前移动。我不知道为什么)。类似地,退出“Esc”

用法:python car.py视频文件


#car.py
导入cv,系统
打印“用法:python car.py”
框=[0,0,0,0]
i=0
全球形象
#创建鼠标回调函数
def my_mouse_回调(事件、x、y、标志、参数):
全局绘图框,i
如果event==cv.cv\u event\u LBUTTONDOWN:
事件=事件
#打印事件
绘图框=真
[框[0],框[1],框[2],框[3]=[x,y,0,0]
打印x,y
如果event==cv.cv\u event\u LBUTTONUP:
事件=事件
绘图框=假
事件=事件

如果框[2]中的“切割”是什么意思?如中所示,拖动一个矩形并将图像保存在其中?您能确认您要实现的目标吗?你的意思是,例如,当车辆经过电影中的某个静态地标时,你希望拍摄电影的屏幕截图/静止图像并保存到目录中吗?@mwcz是的,拖动一个矩形并将图像保存在其中
# car.py
import cv,sys
print "usage: python car.py <videofile>"

box=[0,0,0,0]
i = 0
global image
#   creating mouse callback function
def my_mouse_callback(event,x,y,flags,param):
    global drawing_box,i
    if event==cv.CV_EVENT_LBUTTONDOWN:
        events = event
        #print event
        drawing_box=True
        [box[0],box[1],box[2],box[3]]=[x,y,0,0]
        print x,y
    if event==cv.CV_EVENT_LBUTTONUP:
        events = event
        drawing_box=False
        events= event
        if box[2]<0:
            box[0]+=box[2]
            box[2]*=-1
        if box[3]<0:
            box[1]+=box[3]
            box[3]*=-1
        rect = (box[0],box[1],box[2],box[3])
        #print rect
        roi = cv.GetSubRect(image,rect)
        filename = str(i)+'.jpg'
        #save(image,rect,filename)
        cv.SaveImage(filename,roi)
        i = i+1 

    if event==cv.CV_EVENT_MOUSEMOVE:
        if (drawing_box==True):
            box[2]=x-box[0]
            box[3]=y-box[1] 


#   function to draw the rectangle, added flag -1 to fill rectangle. If you don't want to fill, just delete it.     
def draw_box(img,box):
    cv.Rectangle(img,(box[0],box[1]),(box[0]+box[2],box[1]+box[3]),(255,0,0),2)

#   main program    
capture = cv.CaptureFromFile(sys.argv[1])
image2 = cv.QueryFrame(capture)
drawing_box=False

#   make a clone of image
temp=cv.CloneImage(image2)

cv.NamedWindow("Box Example")
cv.SetMouseCallback("Box Example",my_mouse_callback,temp)

while(1):
#   global image
    image = cv.QueryFrame(capture)
    while(1):
        roi = 0
        save = False
        events = 0
        boxsaver = 0
        cv.Copy(image,temp)

        if drawing_box==True:
            draw_box(temp,box)

            i = i+1

        cv.ShowImage("Box Example",temp)
        if cv.WaitKey(20)==27:
            sys.exit()
        elif cv.WaitKey(20)==32:
            break