10

I'm loading a set of test images via OpenCV (in Python) which are 128x128 in size, reshape them into vectors (1, 128x128) and put them all together in a matrix to calculate PCA. I'm using the new cv2 libaries...

The code:

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))

And it allways fails on the PCA part (I tested the image loading and all, the resulting matrix is how it should be)...the error I get is:

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()

Community
  • 1
  • 1
Veles
  • 1,512
  • 4
  • 14
  • 28

2 Answers2

10

I think the problem is with the size of

np.mean(matrix_test, axis=0)

Its size is (128x128,) and not (1, 128x128). Thus the code below should work

mean, eigenvectors = cv.PCACompute(matrix_test, np.mean(matrix_test, axis=0).reshape(1,-1))
Dat Chu
  • 10,822
  • 13
  • 58
  • 82
7

You can also put

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

and the function computes the mean.

Tomas
  • 77
  • 1
  • 2
  • 2
    Good answer +1 this helped me a lot. I also found that `mean=None`, is equivalent to this solution. Cheers – DarkCygnus Dec 05 '17 at 19:08