OpenCV——总结《车牌识别》之《常用的函数介绍》
1.
cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10))element = cv2.getStructuringElement(shape, ksize[, anchor])
用于创建形态学操作的结构元素(structuring element)。
参数解释:
shape:结构元素的形状,可以是以下值之一:
cv2.MORPH_RECT:矩形结构元素。
cv2.MORPH_CROSS:十字形结构元素。
cv2.MORPH_ELLIPSE:椭圆形结构元素。
ksize:结构元素的尺寸,表示结构元素的宽度和高度。可以是一个整数,表示正方形结构元素的边长;或者是一个元组 (width, height),表示矩形结构元素的宽度和高度。
anchor:可选参数,表示结构元素的锚点位置,默认为 (-1, -1),表示将锚点设置在结构元素的中心位置。
返回值:
element:创建的结构元素,可以用于形态学操作(如膨胀、腐蚀、开运算、闭运算等)。
2.
cv2.morphologyEx(img_edge, cv2.MORPH_CLOSE, kernel)#进行闭运算,sd。首先进行膨胀后进行腐蚀操作,去除白色中的黑色点。dst = cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
形态学操作函数之一,用于对图像进行形态学运算。
参数解释:
src:输入图像,可以是单通道(灰度图)或多通道(彩色图)。
op:形态学操作类型,可以是以下值之一:
cv2.MORPH_ERODE:腐蚀操作。
cv2.MORPH_DILATE:膨胀操作。
cv2.MORPH_OPEN:开运算(先腐蚀后膨胀)。
cv2.MORPH_CLOSE:闭运算(先膨胀后腐蚀)。
cv2.MORPH_GRADIENT:形态学梯度(膨胀图像与腐蚀图像的差异)。
cv2.MORPH_TOPHAT:顶帽运算(原始图像与开运算结果的差异)。
cv2.MORPH_BLACKHAT:黑帽运算(闭运算结果与原始图像的差异)。
kernel:结构元素(kernel)用于指定形态学操作的范围和形状。
dst:可选参数,输出图像,与输入图像具有相同的大小和通道数。
anchor:可选参数,锚点位置,默认为 (-1, -1),表示将锚点设置在结构元素的中心位置。
iterations:可选参数,指定形态学操作的迭代次数,默认为 1。
borderType:可选参数,边界扩充类型,默认为 cv2.BORDER_CONSTANT。
borderValue:可选参数,边界填充值,默认为 0。
返回值:
dst:形态学操作的结果图像。
3.
cv2.threshold(img_opening, 0, 255, cv2.THRESH_BINARY)#可以理解为简单滤波ret, thresh = cv2.threshold(src, thresh, maxval, type[, dst])
用于将图像进行二值化处理。
参数解释:
src:输入的图像,通常为灰度图像(单通道图像)。
thresh:阈值,用于将图像的像素值与该阈值进行比较。
maxval:当像素值大于阈值时,设置的像素值。
type:二值化类型,指定了如何将像素值与阈值进行比较和赋值。常用的类型有:
cv2.THRESH_BINARY:大于阈值的像素值设置为 maxval,小于等于阈值的像素值设置为 0。
cv2.THRESH_BINARY_INV:大于阈值的像素值设置为 0,小于等于阈值的像素值设置为 maxval。
cv2.THRESH_TRUNC:大于阈值的像素值设置为阈值,小于等于阈值的像素值保持不变。
cv2.THRESH_TOZERO:大于阈值的像素值保持不变,小于等于阈值的像素值设置为 0。
cv2.THRESH_TOZERO_INV:大于阈值的像素值设置为 0,小于等于阈值的像素值保持不变。
dst:可选参数,输出的二值化图像,与输入图像 src 的大小和类型相同。
返回值:
ret:计算得到的阈值。
thresh:二值化后的图像。
例子代码
import cv2# 读取灰度图像
image = cv2.imread('image.jpg', 0)# 进行二值化处理
ret, thresh = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)# 显示原图和二值化图像
cv2.imshow('Original Image', image)
cv2.imshow('Thresholded Image', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.
# 查找图像边缘整体形成的矩形区域,可能有很多,车牌就在其中一个矩形区域中
contours, hierarchy = cv2.findContours(img_edge2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
参数解释:
image:输入图像,通常为二值图像(黑白图像)。
mode:轮廓检索模式,定义了轮廓的层次结构。常见的取值有:
cv2.RETR_EXTERNAL:仅检测外部轮廓。
cv2.RETR_LIST:检测所有轮廓,不建立层次关系。
cv2.RETR_CCOMP:检测所有轮廓,建立两层层次关系。
cv2.RETR_TREE:检测所有轮廓,建立完整的层次结构。
method:轮廓近似方法,用于压缩轮廓。常见的取值有:
cv2.CHAIN_APPROX_NONE:存储所有的轮廓点。
cv2.CHAIN_APPROX_SIMPLE:仅存储轮廓的端点。
cv2.CHAIN_APPROX_TC89_L1:使用 Teh-Chin 链逼近算法。
cv2.CHAIN_APPROX_TC89_KCOS:使用 Teh-Chin 链逼近算法。
contours:可选参数,检测到的轮廓列表。
hierarchy:可选参数,轮廓层次结构。
返回值:
contours:检测到的轮廓列表。
hierarchy:轮廓的层次结构,每个轮廓对应四个整数 [Next, Previous, First_Child, Parent]。
这个是contours返回的值的内容。

5.
for c in contours:x, y, w, h = cv2.boundingRect(c)#这个函数就是用来返回值使用的。x, y, w, h = cv2.boundingRect(contour)
函数用于计算轮廓的边界矩形,即给出包围轮廓的最小矩形框。
参数解释:
contour:输入的轮廓。
返回值:
x:边界矩形左上角点的 x 坐标。
y:边界矩形左上角点的 y 坐标。
w:边界矩形的宽度。
h:边界矩形的高度。
使用 cv2.boundingRect() 函数可以获取轮廓的边界矩形信息,包括左上角点的坐标 (x, y) 以及矩形的宽度 w 和高度 h。这些信息可以用于进一步分析和处理轮廓,例如在图像中绘制边界矩形或提取矩形区域内的图像内容。在这里能够找到车牌的信息。
6.
rect = cv2.minAreaRect(c)retval, box = cv2.minAreaRect(points)
用于计算给定点集的最小外接矩形。最小外接矩形是能够完全包围点集并且具有最小面积的矩形。
参数解释:
points:要计算最小外接矩形的输入点集,可以是一个 Numpy 数组或者一个包含点的 Python 列表。
retval:返回值,表示最小外接矩形的相关信息。通常不会使用到该返回值。
box:最小外接矩形的信息,返回一个 ((center_x, center_y), (width, height), angle) 的元组,其中:
(center_x, center_y):最小外接矩形的中心点坐标。
(width, height):最小外接矩形的宽度和高度。
angle:最小外接矩形相对于水平方向的旋转角度。
例子
import cv2
import numpy as np# 定义一个点集
points = np.array([[100, 50], [200, 100], [150, 200], [50, 150]], dtype=np.int32)# 计算最小外接矩形
retval, box = cv2.minAreaRect(points)# 提取最小外接矩形的信息
center, size, angle = box
width, height = size# 在图像上绘制最小外接矩形
rect_points = cv2.boxPoints(box).astype(np.int32)
cv2.drawContours(image, [rect_points], 0, (0, 255, 0), 2)# 显示图像
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
7.
area = cv2.contourArea(contour)
用于计算给定轮廓的面积。轮廓是由一系列连续的点组成的闭合曲线。
参数解释:
contour:要计算面积的轮廓,可以是一个包含点的 Numpy 数组。
返回值:
area:轮廓的面积,以像素为单位。
代码
import cv2
import numpy as np# 读取图像并进行灰度化和二值化处理
image = cv2.imread("image.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)# 寻找轮廓
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 计算轮廓的面积
for contour in contours:area = cv2.contourArea(contour)print("Contour Area:", area)# 绘制轮廓
cv2.drawContours(image, contours, -1, (0, 255, 0), 2)# 显示图像
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
9.
points = cv2.boxPoints(box)
参数解释:
box:输入的旋转矩形,可以通过 cv2.minAreaRect() 函数计算得到。
返回值:
points:旋转矩形的四个角点坐标,返回的是一个包含四个坐标点的 Numpy 数组。
示例用法:
import cv2# 创建一个旋转矩形
center = (100, 100)
size = (200, 100)
angle = 30
rect = (center, size, angle)# 计算旋转矩形的四个角点坐标
points = cv2.boxPoints(rect)
print("Points:", points)# 将浮点型坐标点转换为整数型
points = np.int0(points)# 绘制旋转矩形
image = np.zeros((200, 200), dtype=np.uint8)
cv2.drawContours(image, [points], 0, 255, 2)# 显示图像
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.boxPoints() 函数的输入参数是一个旋转矩形,该旋转矩形可以通过 cv2.minAreaRect() 函数计算得到。cv2.boxPoints() 函数返回的角点坐标是按照顺时针方向排列的。
10.
cv2.drawContours() 和 cv2.rectangle() 是 OpenCV 中用于绘制轮廓和矩形的函数,它们之间有以下区别:
绘制对象:
cv2.drawContours(image, contours, contourIdx, color, thickness) 用于绘制轮廓,其中 image 是要在其上绘制轮廓的图像,contours 是轮廓的列表或数组,contourIdx 是要绘制的轮廓索引(-1 表示绘制所有轮廓),color 是轮廓的颜色,thickness 是轮廓的线宽度。
cv2.rectangle(image, pt1, pt2, color, thickness) 用于绘制矩形,其中 image 是要在其上绘制矩形的图像,pt1 是矩形的左上角坐标,pt2 是矩形的右下角坐标,color 是矩形的颜色,thickness 是矩形的边框线宽度。
使用场景:
cv2.drawContours() 适用于绘制复杂的轮廓,可以绘制闭合的和非闭合的轮廓,可以选择绘制单个轮廓或多个轮廓,常用于轮廓检测和分析。
cv2.rectangle() 适用于绘制简单的矩形,绘制的矩形是一个闭合的四边形,常用于标记和定位目标区域。
总结:cv2.drawContours() 用于绘制轮廓,而 cv2.rectangle() 用于绘制矩形。它们的主要区别在于绘制的对象不同,cv2.drawContours() 可以绘制任意形状的轮廓,而 cv2.rectangle() 绘制的是矩形。
相关文章:
OpenCV——总结《车牌识别》之《常用的函数介绍》
1. cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10))element cv2.getStructuringElement(shape, ksize[, anchor])用于创建形态学操作的结构元素(structuring element)。 参数解释: shape:结构元素的形状,可以…...
chatgpt赋能python:如何利用Python进行自动化办公
如何利用Python进行自动化办公 在现代办公环境中,自动化成为了一种趋势。利用计算机程序自动处理重复性劳动,可以提高生产效率和工作质量,同时也能够让工作更加轻松。Python作为一种常用的编程语言,在自动化办公中发挥了重要作用…...
linux-2.6.22.6内核网卡驱动框架分析
网络协议分为很多层,而驱动这层对应于实际的物理网卡部分,这也是最底层的部分,以cs89x0.c这个驱动程序为例来分析下网卡驱动程序框架。 正常开发一个驱动程序时,一般都遵循以下几个步骤: 1.分配某个结构体 2.设置该结…...
机器学习7:特征工程
在传统的软件工程中,核心是代码,然而,在机器学习项目中,重点则是特征——也就是说,开发人员优化模型的方法之一是增加和改进其输入特征。很多时候,优化特征比优化模型带来的增益要大得多。 笔者曾经参与过一…...
coverage代码覆盖率测试介绍
coverage代码覆盖率测试介绍 背景知识补充 1、什么是覆盖率 测试过程中提到的覆盖率,指的是已测试的内容,占待测内容的百分比,在一定程度上反应测试的完整程度。 覆盖率有可以根据要衡量的对象细分很多种,比如接口覆盖率、分支…...
使用 Debian、Docker 和 Nginx 部署 Web 应用
前言 本文将介绍基于 Debian 的系统上使用 Docker 和 Nginx 进行 Web 应用部署的过程。着重介绍了 Debian、Docker 和 Nginx 的安装和配置。 第 1 步:更新和升级 Debian 系统 通过 SSH 连接到服务器。更新软件包列表:sudo apt update升级已安装的软件…...
Redis原理 - 内存策略
原文首更地址,阅读效果更佳! Redis原理 - 内存策略 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-memery-strategy.html Redis 本身是一个典型的 key-value 内存存储数据库,因此所有的 key、value 都保存在之前学习…...
【计算机网络】IP 地址处理函数
目录 1.struct sockaddr_in的结构 2.一般我们写的结构 3.常见的“点分十进制” 到 ” uint32_t 的转化接口 3.1. inet_aton 和 inet_ntoa (ipv4) 3.2. inet_pton 和 inet_ntop (ipv4 和 ipv6) 3.3. inet_addr 和 inet_network 3…...
9i物联网浏览器(cef_114.2.110114.2.100支持H264视频)WinForm-CefSharp114(5735)视频版本体验
更新:2023.6.25 版本:Cef_114.2.110和114.2.100+chromium-114.0.5735.134的32位和64位 说明:支持图片,mp3,mp4(H264)多媒体 测试环境:windows server 2019 测试网址:www.html5test.com 1.包下载地址 1.1 https://www.nuget.org/packages/CefSharp.Common/ 1.2 https…...
如何在本地运行一个已关服但具有客户端的游戏
虽然游戏服务器关闭后,我们通常无法再进行在线游戏,但对于一些已经关服但仍保留客户端的游戏来说,我们仍然可以尝试在本地进行游玩。本文将介绍如何在本地运行一个已关服但具有客户端的游戏的方法。 一、获取游戏客户端 要在本地运行一个已关…...
C语言编程—预处理器
预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。我们将把 C 预处理器(C Preprocessor)简写为 CP…...
使用 Maya Mari 设计 3D 波斯风格道具(p1)
今天瑞云渲染小编给大家带来了Simin Farrokh Ahmadi 分享的Persian Afternoon 项目过程,解释了 Maya 和 Mari 中的建模、纹理和照明过程。 介绍 我的名字是西敏-法罗赫-艾哈迈迪,人们都叫我辛巴 在我十几岁的时候,我就意识到我喜欢艺术和创造…...
Redis分布式问题
Redis实现分布式锁 Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系Redis中可以使用SETNX命令实现分布式锁。当且仅当 key 不存在,将 key 的值设为 value。 若给定的 key 已经存在&…...
synchronized原理
目录 一、基本特点 二、加锁过程 2.1、偏向锁 2.2、轻量级锁 2.3、重量级锁 三、其它的优化操作 3.1、锁消除 3.2、锁粗化 一、基本特点 synchronized有以下特性: 开始是乐观锁,如果锁冲突频繁,就转换为悲观锁。开始是轻量级锁,…...
10G光模块能兼容千兆光口吗
当涉及到光网络设备和光模块的兼容性时,确保正确的匹配是至关重要的。本期文章内容,我们将探讨10G光模块与千兆光口之间的兼容性。 一、10G光模块和千兆光口的基本概念 首先,我们需要了解10G光模块和千兆光口的基本概念。10G光模块是一种用…...
css 显示省略号 和 动态显示省略号
省略是非常常见的功能。 简单的实现省略号 下面的代码就可以实现省略号,超过宽度的时候就会出现省略号 .text-name{//宽高是一定要设置的不然是会无效延伸的width: 200rpx;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;}稍微复杂点的情况&#…...
LeetCode 1253. 重构 2 行二进制矩阵
【LetMeFly】1253.重构 2 行二进制矩阵 力扣题目链接:https://leetcode.cn/problems/reconstruct-a-2-row-binary-matrix/ 给你一个 2 行 n 列的二进制数组: 矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是 0 就是 1。第 0 行的元素之…...
【八股】【C++】内存
这里写目录标题 内存空间分配new和delete原理C有几种newmalloc / free 与 new / delete区别malloc和free原理?delete和delete[]区别?C内存泄漏malloc申请的存储空间能用delete释放吗?malloc、calloc函数、realloc函数C中浅拷贝与深拷贝栈和队列的区别C里…...
数据库G等待
> db^Cgbasedbtpc:~$ dbaccess db10 -Database selected.> call insert_t();Routine executed.Elapsed time: 811.630 sec 磁盘逻辑日志,无BUF库> ^Cgbasedbtpc:~$ gbasedbtpc:~$ dbaccess db10 -Database selected.> call insert_t();Routine executed.Elapse…...
PCB封装设计指导(一)基础知识
PCB封装设计指导(一)基础知识 PCB封装是PCB设计的基础,也是PCB最关键的部件之一,尺寸需要非常准确且精确,关系到设计,生产加工,贴片等后续一系列的流程。 下面以Allegro为例介绍封装创建前的一些基础知识 1.各个psm文件代表什么 mechanical symbol 是.bsm Package sy…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
