基于python的红绿灯识别day2

先用一个简单的方法实现红绿灯识别(基于opencv的模板匹配)

1.先使用美图秀秀,采集足够多的模板用于模板匹配

2.使用python将图片数据按顺序编号

          感谢博主做出的贡献https://blog.csdn.net/m0_37592397/article/details/80372009
          可以使用这个代码用来给样本数据和模板数据编号

3.使用opencv内置函数进行模板匹配,通过相似程度检测红绿灯`

import cv2 as cv 
import numpy as np
import os
import time



def template_demo():
    kernel_sharpen_3 = np.array([
        [-1,-1,-1,-1,-1],
        [-1,2,2,2,-1],
        [-1,2,8,2,-1],
        [-1,2,2,2,-1], 
        [-1,-1,-1,-1,-1]])/8.0#锐化使用的内核
    filelist = os.listdir("frames") #获取文件路径
    total_num = len(filelist)#获取文件长度(个数)
    
    methods = [cv.TM_SQDIFF_NORMED]#将模板匹配的方法存入元组中
    same=1#相似程度大小
    for item in range(total_num):
        file = "frames\\"+str(item+1)+".jpg"#待检测图片路径
        target = cv.imread(file)
        c=0
        print(file)
        for md in methods:
            targetcopy = np.copy(target)
            for i in range(7):
                filename = "model\\1."+str(i+1)+".jpg"#模板图片路径
                tpl = cv.imread(filename)
               # print(filename)
                b=1
                while b:
                    tpl = cv.filter2D(tpl,-1,kernel_sharpen_3)#利用内核实现对图像的卷积运算
                    result = cv.matchTemplate(targetcopy,tpl,md)#模板匹配
                    min_val,max_val,min_loc,max_loc = cv.minMaxLoc(result)#相似度,位置
                    if md == cv.TM_SQDIFF_NORMED:#cv.TM_SQDIFF_NORMED方法找min_val,min_val越小匹配度越好
                        tl = min_loc
                        same = min_val
                      #  print(min_val)
                        if same < 0.3:
                            br1 = (tl[0]+tpl.shape[1],tl[1]+tpl.shape[0])#获得匹配区域
                            cv.rectangle(targetcopy,tl,br1,(0,0,255),2)#将匹配区域用矩形框起来
                            c+=1
                        else:
                            b=0
                    else:#剩下的方法找max_val,这个越大匹配度越好
                        tl = max_loc
                        same = max_val
                       # print(max_val)
                        if same > 0.9:
                            br1 = (tl[0]+19,tl[1]+33)
                            cv.rectangle(targetcopy,tl,br1,(0,0,255),2)
                        else:
                            b=0
           # cv.imshow("match"+np.str(md),targetcopy)
            print(c)
            with open("redgreen.txt", 'a') as f:
                f.write(file+","+str(c)+"\n\r")
            f.close()
        
    
        
template_demo()
cv.waitKey(0)
            
        
    
  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值