python-opencv3 kmeans图像分类

参考:http://blog.csdn.net/willduan1/article/details/70335146
异常:
    reshape_feature = des.reshape(-1, 1)
AttributeError: 'tuple' object has no attribute 'reshape'
原因:
错误写法:
des = sift.detectAndCompute(gray, None)  # 检测并计算描述符
正确写法:
Kp,des=sift.detectAndCompute(gray,None)#检测并计算描述符

注意:detect和Compute可以一起写,也可以分开写,


import os, codecs
import cv2
import numpy as np
from sklearn.cluster import KMeans


def get_file_name(path):
    '''''
    Args: path to list;  Returns: path with filenames
    '''
    filenames = os.listdir(path)
    path_filenames = []
    filename_list = []
    for file in filenames:
        if not file.startswith('.'):
            path_filenames.append(os.path.join(path, file))
            filename_list.append(file)

    return path_filenames


def knn_detect(file_list, cluster_nums, randomState=None):
    features = []
    files = file_list

    sift = cv2.xfeatures2d.SIFT_create()
    for file in files:
        print(file)
        img = cv2.imread(file)
        img = cv2.resize(img, (32, 32), interpolation=cv2.INTER_CUBIC)

        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        print(gray.dtype)
        kp,des = sift.detectAndCompute(gray, None)  # 检测并计算描述符
        # Kp,des=sift.detectAndCompute(gray,None)#检测并计算描述符
        # des =sift.detect(gray, None)# sift.detectAndCompute(gray, None)
        # # # 找到后可以计算关键点的描述符
        # Kp, des = sift.compute(gray, des)
        if des is None:
            file_list.remove(file)
            continue

        reshape_feature = des.reshape(-1, 1)
        features.append(reshape_feature[0].tolist())

    input_x = np.array(features)

    kmeans = KMeans(n_clusters=cluster_nums, random_state=randomState).fit(input_x)

    return kmeans.labels_, kmeans.cluster_centers_


def res_fit(filenames, labels):
    files = [file.split('/')[-1] for file in filenames]

    return dict(zip(files, labels))


def save(path, filename, data):
    file = os.path.join(path, filename)
    with codecs.open(file, 'w', encoding='utf-8') as fw:
        for f, l in data.items():
            fw.write("{}\t{}\n".format(f, l))


def main():
    path_filenames = get_file_name("./picture/")

    labels, cluster_centers = knn_detect(path_filenames, 2)

    res_dict = res_fit(path_filenames, labels)
    save('./', 'knn_res.txt', res_dict)


if __name__ == "__main__":
    main()


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值