Toriyung

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

Opencv Q&A_11

2022/03/23

基于knn通过特征值识别和比较分类

 

代码_Feature_Detect.py(main)

复制代码
import cv2 as cv
import utlis

dirpath = 'D:\work\\automation\Skill\Python\pythonWORK\cv\material\Feature_sample'

cap = cv.VideoCapture(1)

imgs = utlis.getImg(dirpath)
feats1 = utlis.findFeature(imgs[0])

while True:
    flag,frame = cap.read()
    try:
        if frame is not None:
            feat2 = utlis.findFeature([frame])
            utlis.featureMatch(frame,feats1,feat2[0],imgs[1])
            cv.imshow('img',frame)
            cv.waitKey(1)
    except:
        print('something has happened')
复制代码

 

代码_utlis.py

复制代码
import cv2 as cv
import os



def getImg(path):
    ### 自动读取全部图片,返回图片数组和名字列表
    imgs = []
    namelist = []
    classlist = os.listdir(path)
    for item in classlist:
        name = item.rstrip('.jpg')
        namelist.append(name)
        img = cv.imread(path + '\\' + item)
        imgs.append(img)
    return [imgs,namelist]


def findFeature(imgs):
    ### 找到并返回特征值
    deslist = []
    orb = cv.ORB_create(3000)
    for img in imgs:
        kp,des = orb.detectAndCompute(img,None)
        deslist.append(des)
    return deslist

def featureMatch(img,des1,des2,namelist):
    ### 匹配特征值进行分类
    max = 0
    count = 0
    bf = cv.BFMatcher()
    for num,des in enumerate(des1):
        good = []
        matchs = bf.knnMatch(des,des2,k=2)
        for m,n in matchs:
            if m.distance < 0.75 * n.distance:
                good.append(m)
        len_good = len(good)
        if len_good > 15:
            if len_good > max:
                max = len_good
                count = num
    cv.putText(img,namelist[count],(80,80),cv.FONT_HERSHEY_SIMPLEX,3,(0,255,0),3)
复制代码

 

运行效果

 

遇到的问题

 

Q1:容易发生错误的点

A1:utlis.py中,findFeature()函数参数为图片数组集合,当输入只有一张图片时,应该加上[]

 

 

posted on   Toriyung  阅读(29)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示