我正在尝试使用从http://docs.opencv.org/2.4/modules/imgproc/doc/histograms.html获得的以下片段计算我拥有的两个直方图(x1,x2)之间的地球移动距离:
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.]
对我来说都不起作用,也不允许我计算阵列之间的地球移动距离。任何帮助将不胜感激!
答案 0 :(得分:0)
是的,经过多次试验和错误,我认为这是解决方案: (从How to compute "EMD" for 2 numpy arrays i.e "histogram" using opencv?的最佳答案获得)
ref = reference np array meas = np数组将其与
进行比较创建numpy数组[[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)