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

2 Answers 2

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))
Sign up to request clarification or add additional context in comments.

1 Comment

That did the trick...totally missed that, such a dumb mistake! Thanks!
7

You can also put

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

and the function computes the mean.

1 Comment

Good answer +1 this helped me a lot. I also found that mean=None, is equivalent to this solution. Cheers

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.