2010-12-21 53 views
8

我還在偷書掃描腳本,現在,我需要的是能夠自動檢測翻頁。這本書填滿了屏幕的90%(我使用的是運動檢測的惡劣攝像頭),所以當我翻頁時,運動的方向基本上是一致的。Python OpenCV:檢測運動的一般方向?

我修改了運動跟蹤腳本,但衍生物無處讓我:

#!/usr/bin/env python 

import cv, numpy 

class Target: 
    def __init__(self): 
     self.capture = cv.CaptureFromCAM(0) 
     cv.NamedWindow("Target", 1) 

    def run(self): 
     # Capture first frame to get size 
     frame = cv.QueryFrame(self.capture) 
     frame_size = cv.GetSize(frame) 
     grey_image = cv.CreateImage(cv.GetSize(frame), cv.IPL_DEPTH_8U, 1) 
     moving_average = cv.CreateImage(cv.GetSize(frame), cv.IPL_DEPTH_32F, 3) 
     difference = None 
     movement = [] 

     while True: 
      # Capture frame from webcam 
      color_image = cv.QueryFrame(self.capture) 

      # Smooth to get rid of false positives 
      cv.Smooth(color_image, color_image, cv.CV_GAUSSIAN, 3, 0) 

      if not difference: 
       # Initialize 
       difference = cv.CloneImage(color_image) 
       temp = cv.CloneImage(color_image) 
       cv.ConvertScale(color_image, moving_average, 1.0, 0.0) 
      else: 
       cv.RunningAvg(color_image, moving_average, 0.020, None) 

      # Convert the scale of the moving average. 
      cv.ConvertScale(moving_average, temp, 1.0, 0.0) 

      # Minus the current frame from the moving average. 
      cv.AbsDiff(color_image, temp, difference) 

      # Convert the image to grayscale. 
      cv.CvtColor(difference, grey_image, cv.CV_RGB2GRAY) 

      # Convert the image to black and white. 
      cv.Threshold(grey_image, grey_image, 70, 255, cv.CV_THRESH_BINARY) 

      # Dilate and erode to get object blobs 
      cv.Dilate(grey_image, grey_image, None, 18) 
      cv.Erode(grey_image, grey_image, None, 10) 

      # Calculate movements 
      storage = cv.CreateMemStorage(0) 
      contour = cv.FindContours(grey_image, storage, cv.CV_RETR_CCOMP, cv.CV_CHAIN_APPROX_SIMPLE) 
      points = [] 

      while contour: 
       # Draw rectangles 
       bound_rect = cv.BoundingRect(list(contour)) 
       contour = contour.h_next() 

       pt1 = (bound_rect[0], bound_rect[1]) 
       pt2 = (bound_rect[0] + bound_rect[2], bound_rect[1] + bound_rect[3]) 
       points.append(pt1) 
       points.append(pt2) 
       cv.Rectangle(color_image, pt1, pt2, cv.CV_RGB(255,0,0), 1) 

      num_points = len(points) 

      if num_points: 
       x = 0 
       for point in points: 
        x += point[0] 
       x /= num_points 

       movement.append(x) 

      if len(movement) > 0 and numpy.average(numpy.diff(movement[-30:-1])) > 0: 
       print 'Left' 
      else: 
       print 'Right' 

      # Display frame to user 
      cv.ShowImage("Target", color_image) 

      # Listen for ESC or ENTER key 
      c = cv.WaitKey(7) % 0x100 
      if c == 27 or c == 10: 
       break 

if __name__=="__main__": 
    t = Target() 
    t.run() 

它能檢測出所有的箱子的平均中心,這是非常低效的平均運動。我該如何快速準確地檢測這種運動(即在一個閾值內)?

我正在使用Python,我打算堅持下去,因爲我的整個框架都是基於Python的。

幫助表示感謝,所以提前謝謝大家。乾杯。

+0

你真的需要運動跟蹤嗎?爲什麼不只是檢測一些閾值的變化? (即沿着'sum(abs(img2 - img1))> threshold'線)的東西) – 2010-12-21 03:49:56

+0

嗯,我會搗鼓的。但是,我將如何判斷頁面是向前還是向後,還是更糟,轉向一半,然後又轉回。我會玩圖表,因爲這就是我的工作方式。謝謝! – Blender 2010-12-21 03:51:20

+0

啊,真的,我只是假設你需要知道一個頁面已經被轉換了......如果你需要知道方向,我上面的評論顯然不是一個好的選擇! – 2010-12-21 04:26:33

回答

2

我之前沒有在Python中使用過OpenCV,只是在C++中使用了openframeworks。

爲此我推測OpticalFlow的速度,vely屬性將工作。

有關光流如何工作的更多信息,請查看this paper

HTH

+0

Oooooh!那看起來很閃亮。我會檢查這一點,肯定,因爲這似乎是我正在尋找。 – Blender 2010-12-21 03:52:51

+0

我知道了,但我無法弄清楚發生了什麼。我在'velx'中出現波動,但是它在正方向或負方向上是隨機的。你有什麼我可以看看嗎?這似乎是我可以使用的東西,但我無法弄清楚... – Blender 2010-12-21 22:56:46

+0

有點晚了,但我修改了OpenCV的Python綁定中的演示包,以滿足我的需求。謝謝! – Blender 2011-01-01 20:22:36

0

爲什麼不使用cv.GoodFeaturesToTrack?它可能會解決腳本運行時間...並縮短代碼...