2011-12-19 117 views
8

Tôi đang tải một bộ ảnh thử qua OpenCV (bằng Python) có kích thước 128x128, định hình lại chúng thành vectơ (1, 128x128) và đặt chúng lại với nhau trong một ma trận để tính PCA. Tôi đang sử dụng libaries CV2 mới ...OpenCV PCA Tính toán bằng Python

Mã:

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

Và nó allways thất bại trên một phần PCA (Tôi đã thử nghiệm tải hình ảnh và tất cả, ma trận kết quả là như thế nào cần) ... lỗi tôi nhận được là:

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

Trả lời

7

tôi nghĩ rằng vấn đề là với kích thước của

np.mean(matrix_test, axis=0) 

kích thước của nó là (128x128,) và không (1, 128x128). Như vậy đoạn code dưới đây nên làm việc

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

Điều đó đã làm cho lừa ... hoàn toàn bỏ lỡ điều đó, một sai lầm ngớ ngẩn như vậy! Cảm ơn! – Veles

5

Bạn cũng có thể đặt

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

và chức năng tính giá trị trung bình.

+0

Câu trả lời hay nhất +1 điều này đã giúp tôi rất nhiều. Tôi cũng thấy rằng 'mean = None', tương đương với giải pháp này. Chúc mừng – DarkCygnus