我有一组十二个形状,我正在尝试使用我的数据库确定查询图像的形状为了方便起见,我已经在 MATLAB 中完成了所有预处理并将形状轮廓存储为二进制图像,分别用于训练和测试目的
我已经在 Python 中完成了特征提取和实现阶段在训练阶段,我读取二进制图像,提取 HU MOMETS(7 个向量)作为所有训练图像的特征(总共 285 个)所以我的样本(训练样本)维度是[285, 7] 我的响应维度是 [285]
现在我也遵循类似的测试策略。测试图像共 541 个 读取图像 -> 提取 hu 矩 -> 将其提供给 knn.find_nearest 测试矩的维度为 [1, 7]
我在这里面临的问题是,无论我给出的测试图像如何,我在 knn.find_nearest 中得到的返回值为 76。它始终为每个图像提供相同的值
我做了什么来调试
- 用代码检查以确保我提供给 KNN 的尺寸是否正确
- 也检查了 matlab 中的 Hu-moments 值,发现与 opencv 几乎相似
- 还确保测试图像的 hu-moments 计算正确
- 通过更改 k 值进行测试(当 k=1 时 retval 为 76,当 k=3 时 retval 为 75)
我不知道我在这里做错了什么。请帮忙
import os
import sys
import numpy
import cv2
import cv2.cv as cv
import xlwt
def main():
pth = sys.argv[1]
lsfolds = os.listdir(pth)
files_path = []
all_moments = numpy.empty((0,7))
train_samples = []
responses = []
cnt=0
for di in lsfolds:
img_path = os.path.join(pth,di)
lsfiles = os.listdir(img_path)
for ls in lsfiles:
comp_path = os.path.join(img_path,ls)
files_path.append(comp_path)
if (comp_path[-4:] == 's.db'):
continue
img_bin = cv2.imread(comp_path,-1)
#cv2.imshow('Image', img_bin)
#cv2.waitKey()
#################### Moments as Feature ###############################
moments = cv2.moments(img_bin,1)
hu_moments = cv2.HuMoments(moments)
hu_moments = hu_moments.reshape((1,7))
all_moments = numpy.append(all_moments,hu_moments,0)
train_samples.append(comp_path)
responses.append(int(cnt))
########################################################################
cnt += 1
responses = numpy.float32(responses)
all_moments = numpy.float32(all_moments)
################## KNN #####################################
knn_train_eng = cv2.KNearest()
knn_train_eng.train(all_moments,responses)
#######################################Testing######################################
timg_pth = sys.argv[2]
tfolds = os.listdir(timg_pth)
wb = xlwt.Workbook()
ws = wb.add_sheet('Test Results')
c=0
for tdi in tfolds:
timg_dir = os.path.join(timg_pth,tdi)
tfiles = os.listdir(timg_dir)
for fl in tfiles:
timg_path = os.path.join(timg_dir,fl)
if (timg_path[-4:] == 's.db'):
continue
timg = cv2.imread(timg_path,-1)
timg_bin = timg;
#cv2.imshow('test_bin',timg_bin)
tmoments = cv2.moments(timg_bin)
thu_moments = cv2.HuMoments(tmoments)
thu_moments = thu_moments.reshape((1,7))
thu_moments = numpy.float32(thu_moments)
retval, results, neigh_resp, dists = knn_train_eng.find_nearest(thu_moments,1) # Predict using KNN
res,dist = int(results[0][0]),dists[0][0]
op_answ = str(int((results[0][0])))
print op_answ
print train_samples[int(op_answ)]
op = cv2.imread(train_samples[int(op_answ)])
c+=1
cv2.destroyAllWindows()
##############################################################################
cv2.destroyAllWindows()
if __name__ == '__main__':
main()