2012-01-31 48 views
0

我在高速公路上拍摄了带有汽车的视频,所以我想用鼠标逐一剪辑。但我需要更自动地执行此操作,例如,一种方法是按下空格键并用鼠标切割并将图像自动保存到文件夹中。如何使用鼠标从视频中拍摄图片

你有没有见过类似Linux的东西?我正在尝试在OpenCV中做,虽然它不是必需的。

在此先感谢。

+0

你所说的 “切” 是什么意思?在中,拖动一个矩形并将图像保存在里面? – mwcz 2012-01-31 15:58:27

+0

你能确认你想要达到的目标吗?你的意思是说,当车辆通过电影中的某个静态地标时,你想要拍摄并保存电影的屏幕截图/静止? – thefragileomen 2012-01-31 19:41:23

+0

@mwcz是的,拖动一个矩形并将图像保存在里面 – Mauro 2012-01-31 23:36:34

回答

2

我在下面添加了一个代码。这对我来说可以。围绕您想要单独保存的对象绘制矩形。按'空间'去下一帧(有时你需要按更长的时间前进,我不知道为什么)。同样的'Esc'退出。

用法:蟒蛇car.py录像档案


# 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