2017-03-07 106 views
1

我有最初來自我用OpenCV操作過的Mnist數據集的數字序列。他們被保存在一個泡菜文件中。它們是具有形狀的一個通道圖像(112,112)。使用OpenCV加載numpy數組二進制圖像detectMultiScale

我想通過OpenCV級聯分類器運行這些分類,類似於the face detection tutorial,而是使用這些Google-Street-View-House-Numbers-Digit-Localization cascades

這裏是我的嘗試:

data = p.load_file('data/train_sequences00.pickle') 
zero = cv2.CascadeClassifier('data/Google-Street-View-House-Numbers-Digit-Localization/cascades/cascade0/cascade.xml') 
one = cv2.CascadeClassifier('data/Google-Street-View-House-Numbers-Digit-Localization/cascades/cascade1/cascade.xml') 
two = cv2.CascadeClassifier('data/Google-Street-View-House-Numbers-Digit-Localization/cascades/cascade2/cascade.xml') 
three = cv2.CascadeClassifier('data/Google-Street-View-House-Numbers-Digit-Localization/cascades/cascade3/cascade.xml') 
four = cv2.CascadeClassifier('data/Google-Street-View-House-Numbers-Digit-Localization/cascades/cascade4/cascade.xml') 
five = cv2.CascadeClassifier('data/Google-Street-View-House-Numbers-Digit-Localization/cascades/cascade5/cascade.xml') 
six = cv2.CascadeClassifier('data/Google-Street-View-House-Numbers-Digit-Localization/cascades/cascade6/cascade.xml') 
seven = cv2.CascadeClassifier('data/Google-Street-View-House-Numbers-Digit-Localization/cascades/cascade7/cascade.xml') 
eight = cv2.CascadeClassifier('data/Google-Street-View-House-Numbers-Digit-Localization/cascades/cascade8/cascade.xml') 
nine = cv2.CascadeClassifier('data/Google-Street-View-House-Numbers-Digit-Localization/cascades/cascade9/cascade.xml') 
gray = np.array(data['sequences'][0]).astype(np.float32) 
gray = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR) 
#gray = cv2.cvtColor(img, cv2.CV_RGB2GRAY) 

zeros = zero.detectMultiScale(gray, 1.3, 5, scaleFactor=0.6) 
ones = one.detectMultiScale(gray, 1.3, 5, scaleFactor=0.6) 
twos = two.detectMultiScale(gray, 1.3, 5, scaleFactor=0.6) 
threes = three.detectMultiScale(gray, 1.3, 5, scaleFactor=0.6) 
fours = four.detectMultiScale(gray, 1.3, 5, scaleFactor=0.6) 
fives = five.detectMultiScale(gray, 1.3, 5, scaleFactor=0.6) 
sixes = size.detectMultiScale(gray, 1.3, 5, scaleFactor=0.6) 
sevens = seven.detectMultiScale(gray, 1.3, 5, scaleFactor=0.6) 
eights = eight.detectMultiScale(gray, 1.3, 5, scaleFactor=0.6) 
nines = nine.detectMultiScale(gray, 1.3, 5, scaleFactor=0.6) 

可惜,這只是導致以下錯誤:

Traceback (most recent call last): 
    File "digit_cascade.py", line 22, in <module> 
    zeros = zero.detectMultiScale(gray, 1.3, 5, scaleFactor=0.6) 
SystemError: error return without exception set 

是任何人都熟悉如何生numpy的陣列裝入OpenCV的detectMultiscale

這裏有一些不確定因素,我有:

  • OpenCV docsdetectMultiscale兩個不同的簽名。第一個目的是什麼?參見rejectLevelslevelWeights的論點?
  • 我的圖像是112x112。此圖像中的每個數字都將在11x11像素左右。級聯尺寸是20x30。爲了級聯正常工作,我需要設置什麼參數?

系統信息:

cv2.__version__ # '2.4.11' 
sys.version #'2.7.12 |Anaconda 4.2.0 (x86_64)| (default, Jul 2 2016, 17:43:17) \n[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)]' 
+0

這是一個相當奇怪的錯誤信息,我會期望得到一些有意義的異常(或斷言)消息。那是什麼版本的OpenCV?什麼Python?什麼平臺? XML是否正確加載? ('zeros.empty()'的結果是什麼?) –

+1

@DanMašek更新了版本。看來級聯裝載正確。 'zero.empty()#False'。 –

回答

1

我可以使用相同的級聯文件運行分類,而直接從圖像加載數據:

import numpy as np 
import cv2 

workspace = '/path/to/directory' 

# cascades 
cascades = [ 
    (cv2.CascadeClassifier(workspace + '/Google-Street-View-House-Numbers-Digit-Localization/cascades/cascade1/cascade.xml'), (255, 0, 0)), 
    (cv2.CascadeClassifier(workspace + '/Google-Street-View-House-Numbers-Digit-Localization/cascades/cascade6/cascade.xml'), (0, 255, 0)) 
] 

# input 
img = cv2.imread('/path/to/image/house-number-16.jpg') 
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 

# detect and mark 
for cascade, color in cascades: 
    digits = cascade.detectMultiScale(gray, 1.3, 5) 
    for (x, y, w, h) in digits: 
     cv2.rectangle(img, (x, y), (x + w, y + h), color, 2) 
     roi_gray = gray[y:y + h, x:x + w] 
     roi_color = img[y:y + h, x:x + w] 

# show result 
cv2.imshow('img', img) 
cv2.waitKey() 

結果(它未能檢測到「1」,雖然):

the result

我懷疑你的問題在於你從保存圖像的方式或你加載它們的方式。

例如,默認cv2.imread將圖像讀取爲整數numpy.ndarray。當我將其更改爲浮動(例如,由255分),我得到一個錯誤:

OpenCV Error: Assertion failed (scaleFactor > 1 && image.depth() == CV_8U) in detectMultiScale, file /home/yohanesgultom/opencv/modules/objdetect/src/cascadedetect.cpp, line 1081 Traceback (most recent call last): File "cascade.py", line 21, in digits = cascade.detectMultiScale(gray, 1.3, 5) cv2.error: /home/yohanesgultom/opencv/modules/objdetect/src/cascadedetect.cpp:1081: error: (-215) scaleFactor > 1 && image.depth() == CV_8U in function detectMultiScale

我在Ubuntu上運行它:

>>> cv2.__version__ 
'2.4.13' 
>>> sys.version 
'2.7.10 (default, Oct 14 2015, 16:09:02) \n[GCC 5.2.1 20151010]' 
+1

正如我在帖子中所述,我正在以二進制格式加載這些圖像,例如numpy數組。我覺得愚蠢的是沒有意識到這個昨晚,但因爲我的二進制圖像已經是單通道(即灰度),所以不需要調用'cvtColor'。簡單地說,'gray = np.array(data ['sequences'] [0])。astype(np.uint8)'並且以'one.detectMultiScale(gray,1.3,5)'的形式饋入級聯並且它可以工作。如果有其他人希望得到更多的解釋,請將其留在這裏:http://answers.opencv.org/question/131606/load-single-channel-numpy-array-image-with-detectmultiscale/?answer=131615#post-id- 131615謝謝。 –

相關問題