2013-01-18 74 views
4

不幸的是,我既是一個Python和一個openCV初學者,所以如果問題是愚蠢的,希望對不起。HOGDescriptor與視頻識別對象

我正在嘗試使用cv2.HOGDescriptor來識別視頻中的對象。我關心的是逐幀識別(即沒有跟蹤等)。


下面是我在做什麼:

  1. 我用

    capture = cv.CreateFileCapture(video_path) #some path in which I have my video 
    #capturing frames 
    frame = cv.QueryFrame(capture) #returns cv2.cv.iplimage 
    
  2. 爲了最終使用的幀探測器讀取視頻(目前.mpg) (我會用

    found, w = hog.detectMultiScale(frame, winStride, padding, scale) 
    

    )我想我需要framecv2.cv.iplimage轉換爲numpy.ndarray 我做到了由

    tmp = cv.CreateImage(cv.GetSize(frame),8,3) 
    cv.CvtColor(frame,tmp,cv.CV_BGR2RGB) 
    
    ararr = np.asarray(cv.GetMat(tmp)). 
    

現在我有以下錯誤:

found, w = hog.detectMultiScale(ararr, winStride, padding, scale) 
TypeError: a float is required 

其中

winStride=(8,8) 
    padding=(32,32) 
    scale=1.05 

我真的不明白哪個元素是真正的問題。即哪個數字應該是浮點數?

任何幫助理解

回答

5

沒有必要自己執行額外的轉換,該問題與Python的新舊OpenCV綁定的混合有關。有關hog.detectMultiScale的其他問題僅僅是由於參數排序不正確。

第二個問題,可以直接看到通過檢查help(cv2.HOGDescriptor().detectMultiScale)

detectMultiScale(img[, hitThreshold[, winStride[, padding[, 
      scale[, finalThreshold[, useMeanshiftGrouping]]]]]]) 

,你可以看到,每一個參數是可選的,但第一個(圖像)。排序也很重要,因爲您首先有效地使用了winStride,而預計將是第二個,依此類推。您可以使用命名參數來傳遞它。 (所有這一切都在前面的答案被觀察到。)

的另一個問題是代碼的混合,這裏是一個示例代碼,你應該考慮使用:

import sys 
import cv2 

hog = cv2.HOGDescriptor() 
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) 
hogParams = {'winStride': (8, 8), 'padding': (32, 32), 'scale': 1.05} 

video = cv2.VideoCapture(sys.argv[1]) 
while True: 
    ret, frame = video.read() 
    if not ret: 
     break 

    result = hog.detectMultiScale(frame, **hogParams) 
    print result 
+0

謝謝你,謝謝你的python課程!我對另一件事感到困惑:爲什麼在cv2綁定中沒有打開窗口的函數?即'cv2.NamedWindow'給我錯誤,而'cv.NamedWindow'沒有。有沒有正確的方法來打開窗口並使用新的綁定? – Acorbe

+0

@Acorbe不幸的是許多函數已被重命名,你可能在'cv2.namedWindow'後面(外殼是不同的)。 – mmgp

+0

謝謝!我會試圖找出我的方式.. – Acorbe

1

爲C的文檔++的HOGDescriptor::detectMultiScale版本示出了hit_threshold參數之前win_stride參數(型double的)。所以看起來你錯過了這個函數的一個參數。要接受win_stride的默認參數,您應該將您問題中使用的加法參數作爲關鍵字傳遞。

+0

感謝,這讓我的代碼運行。儘管在opencv示例'peopledetect.py'中,我正在考慮將它作爲參考,函數調用是'found,w = hog。detectMultiScale(img,winStride =(8,8),padding =(32,32),scale = 1.05)'。該文件在我的機器上運行。任何線索? – Acorbe

+1

這裏只是一個猜測,但在這個例子中,您將這些參數作爲關鍵字傳遞,這允許該方法使用'hit_threshold'的默認值。但在上面的示例中,您使用的是位置參數,因此它認爲您的'winStride'正在作爲'hit_threshold'參數傳遞。 – bogatron

+0

是的,你的線索是對的!您可能希望在回答中包含最後一條評論,以方便其他用戶找到答案。 基本上問題是我停止傳遞參數作爲關鍵字。我的超級noob。謝謝 – Acorbe