Opencv识别车牌

news2024/11/26 12:44:12

Opencv识别车牌

#encoding:utf8
import cv2
import numpy as np
Min_Area = 50
#定位车牌
def color_position(img,output_path):
colors = [#([26,43,46], [34,255,255]), # 黄色
([100,43,46], [124,255,255]), # 蓝色
([35, 43, 46], [77, 255, 255]) # 绿色
]
hsv =cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
for (lower, upper) in colors:
lower = np.array(lower, dtype=“uint8”) # 颜色下限
upper = np.array(upper, dtype=“uint8”) # 颜色上限

    # 根据阈值找到对应的颜色
    mask = cv2.inRange(hsv, lowerb=lower, upperb=upper)
    cv2.imshow("mask", mask)
    cv2.waitKey(0)        
    output = cv2.bitwise_and(img, img, mask=mask)
    cv2.imshow("output", output)
    cv2.waitKey(0)         
    k = mark_zone_color(output,output_path)
    if k==1:
        return 1
    # 展示图片
    #cv2.imshow("image", img)
    #cv2.imshow("image-color", output)
    #cv2.waitKey(0)
return 0

def mark_zone_color(src_img,output_img):
#根据颜色在原始图像上标记
#转灰度
gray = cv2.cvtColor(src_img,cv2.COLOR_BGR2GRAY)
cv2.imshow(“gray”, gray)
cv2.waitKey(0)
#图像二值化
#ret,binary_OTSU = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
ret,binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY)
cv2.imshow(“binary”, binary)

cv2.waitKey(0)     
#轮廓检测
contours,hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)   
drawing = img.copy()
if len(contours)>0:
    cv2.drawContours(drawing, contours, -1, (0, 0, 255), 3) # 填充轮廓颜色
    cv2.imshow('drawing', drawing)
    cv2.waitKey(0)
#print(contours)

temp_contours = [] # 存储合理的轮廓
car_plates=[]
if len(contours)>0:
    for contour in contours:
        if cv2.contourArea(contour) > Min_Area:
            temp_contours.append(contour)
        car_plates = []
        for temp_contour in temp_contours:
            rect_tupple = cv2.minAreaRect(temp_contour)
            rect_width, rect_height = rect_tupple[1]
            if rect_width < rect_height:
                rect_width, rect_height = rect_height, rect_width
            aspect_ratio = rect_width / rect_height
            # 车牌正常情况下宽高比在2 - 5.5之间
            if aspect_ratio > 2 and aspect_ratio < 5.5:
                car_plates.append(temp_contour)
                #rect_vertices = cv2.boxPoints(rect_tupple)
                #rect_vertices = np.int0(rect_vertices)
        if len(car_plates)==1:
            #oldimg = cv2.drawContours(img, [rect_vertices], -1, (0, 0, 255), 2)
            #cv2.imshow("che pai ding wei", oldimg)
            #print(rect_tupple)
            break

#把车牌号所在的位置截取出来
if len(car_plates)==1:
    # 方法1 利用轮廓的坐标点来获取左上角 右下角的坐标
    #for car_plate in car_plates:
        ## 左上角的坐标
        #row_min,col_min = np.min(car_plate[:,0,:],axis=0)
        ## 右下角的坐标
        #row_max,col_max = np.max(car_plate[:,0,:],axis=0)
        #cv2.rectangle(img,(row_min,col_min),(row_max,col_max),(0,255,0),2)
        #card_img = img[col_min:col_max,row_min:row_max,:]
        #cv2.imshow("img",img)
    # 方法2,利用外接矩形来定位
    x,y,w,h = cv2.boundingRect(car_plates[0])
    cv2.rectangle(img,(x,y),(x+w, y+h),(0,255,0),2)
    cv2.imshow("img",img)
    cv2.waitKey(0)
    card_img = img[y:y+h,x:x+w,:]
    cv2.imwrite('card_img.jpg',card_img)
    cv2.imshow("card_img.",card_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    return 1
return 0

if name == “main”:
img = cv2.imread(‘…\Opencv-6-datas\cartest.png’)
color_position(img, ‘’)
在这里插入图片描述

#encoding:utf8
import  cv2
import numpy as np
Min_Area = 50
#定位车牌
def color_position(img,output_path):
    colors = [#([26,43,46], [34,255,255]), # 黄色
           ([100,43,46], [124,255,255]), # 蓝色
    ([35, 43, 46], [77, 255, 255]) # 绿色
    ]
    hsv =cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    for (lower, upper) in colors:
        lower = np.array(lower, dtype="uint8") # 颜色下限
        upper = np.array(upper, dtype="uint8") # 颜色上限

        # 根据阈值找到对应的颜色
        mask = cv2.inRange(hsv, lowerb=lower, upperb=upper)
        cv2.imshow("mask", mask)
        cv2.waitKey(0)        
        output = cv2.bitwise_and(img, img, mask=mask)
        cv2.imshow("output", output)
        cv2.waitKey(0)         
        k = mark_zone_color(output,output_path)
        if k==1:
            return 1
        # 展示图片
        #cv2.imshow("image", img)
        #cv2.imshow("image-color", output)
        #cv2.waitKey(0)
    return 0
def mark_zone_color(src_img,output_img):
    #根据颜色在原始图像上标记
    #转灰度
    gray = cv2.cvtColor(src_img,cv2.COLOR_BGR2GRAY)
    cv2.imshow("gray", gray)
    cv2.waitKey(0)     
    #图像二值化
    #ret,binary_OTSU = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    ret,binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY)
    cv2.imshow("binary", binary)    

    cv2.waitKey(0)     
    #轮廓检测
    contours,hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)   
    drawing = img.copy()
    if len(contours)>0:
        cv2.drawContours(drawing, contours, -1, (0, 0, 255), 3) # 填充轮廓颜色
        cv2.imshow('drawing', drawing)
        cv2.waitKey(0)
    #print(contours)

    temp_contours = [] # 存储合理的轮廓
    car_plates=[]
    if len(contours)>0:
        for contour in contours:
            if cv2.contourArea(contour) > Min_Area:
                temp_contours.append(contour)
            car_plates = []
            for temp_contour in temp_contours:
                rect_tupple = cv2.minAreaRect(temp_contour)
                rect_width, rect_height = rect_tupple[1]
                if rect_width < rect_height:
                    rect_width, rect_height = rect_height, rect_width
                aspect_ratio = rect_width / rect_height
                # 车牌正常情况下宽高比在2 - 5.5之间
                if aspect_ratio > 2 and aspect_ratio < 5.5:
                    car_plates.append(temp_contour)
                    #rect_vertices = cv2.boxPoints(rect_tupple)
                    #rect_vertices = np.int0(rect_vertices)
            if len(car_plates)==1:
                #oldimg = cv2.drawContours(img, [rect_vertices], -1, (0, 0, 255), 2)
                #cv2.imshow("che pai ding wei", oldimg)
                #print(rect_tupple)
                break

    #把车牌号所在的位置截取出来
    if len(car_plates)==1:
        # 方法1 利用轮廓的坐标点来获取左上角 右下角的坐标
        #for car_plate in car_plates:
            ## 左上角的坐标
            #row_min,col_min = np.min(car_plate[:,0,:],axis=0)
            ## 右下角的坐标
            #row_max,col_max = np.max(car_plate[:,0,:],axis=0)
            #cv2.rectangle(img,(row_min,col_min),(row_max,col_max),(0,255,0),2)
            #card_img = img[col_min:col_max,row_min:row_max,:]
            #cv2.imshow("img",img)
        # 方法2,利用外接矩形来定位
        x,y,w,h = cv2.boundingRect(car_plates[0])
        cv2.rectangle(img,(x,y),(x+w, y+h),(0,255,0),2)
        cv2.imshow("img",img)
        cv2.waitKey(0)
        card_img = img[y:y+h,x:x+w,:]
        cv2.imwrite('card_img.jpg',card_img)
        cv2.imshow("card_img.",card_img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
        return 1
    return 0

if __name__ == "__main__":
    img = cv2.imread('..\Opencv-6-datas\cartest.png')           
    color_position(img, '')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/459602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

推荐 7 个超牛的 Spring Cloud 实战项目

个 把一个大型的单个应用程序和服务拆分为数个甚至数十个的支持微服务&#xff0c;这就是微服务架构的架构概念&#xff0c;通过将功能分解到各个离散的服务中以实现对解决方案的解耦。 关于微服务相关的学习资料不多&#xff0c;而 GitHub 上的开源项目可以作为你微服务之旅…

STM32平衡小车 mpu6050学习

MPU6050简介 MPU6050是一款性价比很高的陀螺仪,可以读取X Y Z 三轴角度,X Y Z 三轴加速度,还有内置的温度传感器,在姿态解析方面应用非常广泛。 二、硬件连接 由于采用IIC通信,最基本的只需要采用四根线就可以了。分别VCC,GND,SCL,SDA连接到单片机 SCL-----PB6 SDA---…

23种设计模式之观察者模式(黑马程序员)

观察者模式 一、概述二、结构三、实现四、总结在最后 一、概述 观察者模式又被称为发布-订阅模式(Publish/Subscribe)模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时&#xff0c;会通知所有…

java 键值对详解及java键值对代码

在 Java中&#xff0c;对象可以理解为一个列表。这个列表里面的每个元素都是一个“键”&#xff0c;而每个“键”都是一个值。 键值对的概念&#xff0c;并不是在 Java中第一次出现&#xff0c;在 java 1.x中就已经有了。那时候它的意思是在一个命名空间中建立两个名字相同的对…

利用三维CNN对阿尔茨海默病进行多模态研究

文章目录 Is a PET All You Need? A Multi-modal Study for Alzheimer’s Disease Using 3D CNNs摘要方法实验结果讨论结论 Is a PET All You Need? A Multi-modal Study for Alzheimer’s Disease Using 3D CNNs 摘要 提出了一个系统评估多模态dnn的框架重新评估基于FDG-P…

Android-实现一个登录页面(kotlin)

准备工作 首先&#xff0c;确保你已经安装了 Android Studio。如果还没有安装&#xff0c;请访问 Android Studio 官网 下载并安装。 前提条件 - 安装并配置好 Android Studio Android Studio Electric Eel | 2022.1.1 Patch 2 Build #AI-221.6008.13.2211.9619390, built …

如何使用命令行添加配置码云仓库SSH秘钥-git仓库也一样

使用命令行添加配置码云仓库SSH秘钥 为什么要如何使用命令行添加配置码云仓库SSH秘钥&#xff1f;生成密钥你可以按如下命令来生成 sshkey:可以参考下图执行指令 添加密钥登录你的码云&#xff0c;鼠标移入头像&#xff0c;设置。点击 SSH公钥&#xff0c;打开配置页面&#x…

新型数字智慧城市综合趋势解决方案(ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除 新型智慧城市解决方案总体架构 新型智慧城市顶层规划&#xff08;咨询&#xff09;服务概述 服务定义&#xff1a;提供面向城市及其产业的智慧化咨询服务&#xff0c;涵盖需求…

linux——进程的概念与状态

大家好&#xff0c;我是旗帜僵尸。今天我将带领大家学习进程的概念。 本篇文章将继续收录于我的linux专栏中&#xff0c;若想查看关于linux其它知识的文章也可以点击右方链接。旗帜僵尸——linux 文章目录 一、进程概念冯诺依曼体系结构OS&#xff08;操作系统Operator System&…

突破传统监测模式:业务状态监控HM的新思路

作者&#xff1a;京东保险 管顺利 一、传统监控系统的盲区&#xff0c;如何打造业务状态监控。 在系统架构设计中非常重要的一环是要做数据监控和数据最终一致性&#xff0c;关于一致性的补偿&#xff0c;已经由算法部的大佬总结过就不在赘述。这里主要讲如何去补偿&#xff…

电子阅读器市场角力,AI成为关键变量

配图来自Canva可画 近年来&#xff0c;随着国家“书香型社会”建设政策的出台&#xff0c;公众的阅读需求正在逐年增加&#xff0c;各类读书产品和读书活动&#xff0c;也如同雨后春笋般涌现&#xff0c;人们的阅读体验日益得到丰富。比如&#xff0c;昨天世界读书日举行的“不…

Photoshop在启动时出现读取计算机特定首选项时出错,或者提示暂存盘已满导致打不开该如何处理

上午还能用&#xff0c;下午打开Photoshop时就报此错误 点击确定后&#xff0c;出现下图错误 首先&#xff0c;先试试删除设置文件。在长按shiftctrlalt的情况下用鼠标右键点击Photoshop图标&#xff0c;点击打开&#xff08;此间别松手&#xff09;&#xff0c;就会出现下图&a…

“智慧赋能 强链塑链”|工程物资供应链管理中的数字化应用

工程项目中的供应链管理至关重要 工程建设行业是国民经济的重要支柱之一&#xff0c;虽然在总产值上持续保持增长态势&#xff0c;但近年来行业的利润总额增速已连续多年呈现下降趋势。究其原因&#xff0c;可以大体从两个方面来看&#xff1a;一是行业盈利能力出现下降&#x…

Xshell CentOs Linux命令2

上一次我们说了几个命令&#xff0c;文件的创建删除等&#xff0c;还有就是文件查看&#xff0c;今天我们继续看几个命令。 echo echo命令 我们看到我们在echo 后面跟一个字符串&#xff0c;不同会帮我们打印在屏幕上&#xff0c;这里我们需要补充一些东西&#xff0c;在Linu…

多线程常见的锁策略

目录 1.1 乐观锁 和 悲观锁 1.2 轻量级锁 和 重量级锁 1.3 自旋锁 和 挂起等待锁 1.4 互斥锁 和 读写锁 1.5 可重入锁 和 不可重入锁 1.6 公平锁 和 非公平锁 1.7 synchronized 锁的属性 一、锁策略 说到锁&#xff0c;Java 里面常用的锁有 synchronized &#xff0c;锁…

安全防御 --- 态势感知、VPN

一、态势感知 1、概念 态势感知&#xff08;SA --- Situational Awareness&#xff09;是对一定时间和空间内的环境元素进行感知&#xff0c;并对这个元素的含义进行理解&#xff0c;最终预测这些元素在未来的发展状态。 作用&#xff1a; 态势感知能够检测出超过20大类的云上…

使用nvm(node.js version management)安装管理nodejs

鉴于目前网络上关于NVM安装NodeJS操作步骤的文章&#xff0c;大家都在互相借鉴&#xff0c;很少看到原创文章&#xff0c;很多操作步骤已经冗余和过时。因此&#xff0c;本人根据实际的前端项目开发经验&#xff0c;在此重新梳理了一遍目前最新的NVMNodeJS的安装步骤&#xff0…

微信小程序原生开发功能合集十二:编辑界面的实现

本章实现编辑界面的实现处理,包括各编辑组件的使用及添加数据保存数据流程的实现处理。   另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实现等内容,具体如下:    1. CSDN课程: https://edu.csdn.net/course/…

BOSHIDA 模块电源高低温试验箱测试原理

BOSHIDA 模块电源高低温试验箱测试原理 电源模块是可以直接贴装在印刷电路板上的电源供应器&#xff0c;其特点是可为专用集成电路&#xff08;ASIC&#xff09;、数字信号处理器 &#xff08;DSP&#xff09;、微处理器、存储器、现场可编程门阵列 &#xff08;FPGA&#xf…

OpenShift:关于OpenShift(OKD)通过命令行的方式部署镜像以及S2I流程Demo

写在前面 因为参加考试&#xff0c;会陆续分享一些 OpenShift 的笔记博文内容为安装完 OpenShift, 利用 OpenShift 引擎部署一个镜像应用和一个 S2I 流程部署应用 Demo学习环境为 openshift v3 的版本&#xff0c;有些旧这里如果专门学习 openshift &#xff0c;建议学习 v4 版…