Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

opencv3 EM.getCovs(covs)

what type should covs be in getCovs(covs)?

From the 3.0-beta c++, "Returns vector std::vector<Mat>& covs of covariation matrices. Number of matrices is the number of gaussian mixtures, each matrix is a square floating-point matrix NxN, where N is the space dimensionality."

from this old opencv2 bug, I understand that "vector<mat> corresponds to a list of numpy arrays, not 3D numpy array (since matrices in vector can in general have different size.) "

from cv2 import ml
import numpy as np

def dictionary(descriptors, number_clusters=N):
    covs = [np.zeros(( N, N), np.float64)]
    em = ml.EM_create()
    em.setClustersNumber(N)
    em.trainEM(descriptors)
    means = em.getMeans()
    covs = em.getCovs(covs)
    weights = em.getWeights()
    return np.float32(means), np.float32(covs), np.float32(weights)[0]

printing out covs just prints out the original [np.zeros(( N, N), np.float64)]. Any body know how to get the covs?

Note that attempting to run this code will not work without fixing this bug and rebuilding.