2016-03-15 92 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)