2016-03-15 99 views
1

我试图计算两个直方图我有(X1,X2)之间的堆土距离,使用下面的代码片段,我从http://docs.opencv.org/2.4/modules/imgproc/doc/histograms.html获得的堆土距离:的Python - 计算直方图

cv2.cv.CalcEMD2(x1, x2,cv2.cv.CV_DIST_L1) 

但是我一直得到这个错误。

TypeError: CvArr argument 'signature1' must be IplImage, CvMat or CvMatND. Use fromarray() to convert numpy arrays to CvMat or cvMatND" 

我试过使用.fromarray()来转换我没有成功的CvMat格式。有什么我做错了吗?

这里有两种类型的数组的我与(缩短为清楚起见三个要素)我试着用cv2.cv.fromarray()来转换工作:

np.histogramdd(data, bins = 80)) 

给我:

(array([ 28., 5., 0.]), [array([-1.71194523, -1.66131523, -1.61068523])]) 

和正常NP阵列:我

[28. 5. 0.] 

既不工作也不让我计算对E阵列之间的关节移动器距离。任何帮助将不胜感激!

回答

0

右,大量的试验和错误之后我认为这是解决方案:

REF =参考NP阵列 MEAS = NP阵列比较它

创建(从How to compute "EMD" for 2 numpy arrays i.e "histogram" using opencv?最佳答案获得) numpy array [[data] [weights]]的直方图,将其转换为[data [i],weight [i]]格式。然后到一个cv数组,然后将其转换成EMD函数的信号函数。

这不是一个理想的解决方案 - 任何进一步的改进/建议将非常感激教育目的!

#reference array: 
j = np.histogramdd(ref, bins = 80) 
a = np.zeros((len(j[0]), 2)) 
for i, x in enumerate(j[0]): 
    a[i][0] = x 
    a[i][1] = j[1][0][i] 
cv_array_ref = cv2.cv.fromarray(a) 

a32 = cv2.cv.CreateMat(cv_array_ref.rows, cv_array_ref.cols,cv2.cv.CV_32FC1) 
cv2.cv.Convert(cv_array_ref, a32) 


#measured array: 

jj = np.histogramdd(amplitude_norm_data[0], bins = 80) 
aa = np.zeros((len(jj[0]), 2)) 
for ii, xx in enumerate(jj[0]): 
    aa[ii][0] = xx 
    aa[i][1] = jj[1][0][ii] 
cv_array_meas = cv2.cv.fromarray(aa) 
a322 = cv2.cv.CreateMat(cv_array_meas.rows, cv_array_meas.cols, cv2.cv.CV_32FC1) 
cv2.cv.Convert(cv_array_meas, a322) 


cv2.cv.CalcEMD2(a32, a322,cv2.cv.CV_DIST_L1)