2011-12-19 24 views
8

Sto caricando un set di immagini di prova tramite OpenCV (in Python) di dimensioni 128x128, rimodellandole in vettori (1, 128x128) e inserendole tutte in una matrice per calcolare PCA. Sto utilizzando i nuovi libaries CV2 ...OpenCV PCA Compute in Python

Il codice:

import os 
import cv2 as cv 
import numpy as np 

matrix_test = None 
for image in os.listdir('path_to_dir'): 
    imgraw = cv.imread(os.path.join('path_to_dir', image), 0) 
    imgvector = imgraw.reshape(128*128) 
    try: 
     matrix_test = np.vstack((matrix_test, imgvector)) 
    except: 
     matrix_test = imgvector 

# PCA 
mean, eigenvectors = cv.PCACompute(matrix_test, np.mean(matrix_test, axis=0)) 

E non riesce allways da parte PCA (ho provato il caricamento di immagini e di tutti, la matrice risultante è come dovrebbe essere) ... l'errore che ottengo è:

File "main.py", line 22, in

mean, eigenvectors = cv.PCACompute(matrix_test, np.mean(matri_test, axis=0))

cv2.error: /path/to/OpenCV-2.3.1/modules/core/src/matmul.cpp:2781: error: (-215) _mean.size() == mean_sz in function operator()

risposta

7

credo che il problema è con la dimensione del

np.mean(matrix_test, axis=0) 

la sua dimensione è (128x128,) e non (1, 128x128). Così il codice qui sotto dovrebbe funzionare

mean, eigenvectors = cv.PCACompute(matrix_test, np.mean(matrix_test, axis=0).reshape(1,-1)) 
+0

Questo ha fatto il trucco ... totalmente mancato, un errore così stupido! Grazie! – Veles

5

Si può anche mettere

cv.PCACompute(matrix_test, mean = np.array([])) 

e la funzione calcola la media.

+0

Una buona risposta +1 mi ha aiutato molto. Ho anche scoperto che 'mean = None', è equivalente a questa soluzione. Saluti – DarkCygnus