1

我有一组十二个形状,我正在尝试使用我的数据库确定查询图像的形状为了方便起见,我已经在 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()
4

0 回答 0