用opencv3写的超详细注释的车牌检测

2023-11-07

#include"iostream"
#include"opencv2/opencv.hpp"
#include"opencv2/highgui/highgui.hpp"
#include"opencv2/core/core.hpp"
#include"opencv2/imgproc/imgproc.hpp"
using namespace std;
using namespace cv;
Mat grayimage, gaussianimage, threshimage;
int cols_start = 0, cols_end = 0;//记录车牌开始、结束列
int rows_start = 0, rows_end = 0;//记录车牌开始、结束行
const int row_thresh = 27;//判断一行是不是车牌有效值的阈值
const int col_thresh = 2;//判断一列是不是车牌有效值的阈值
int row[200];//存放含有车牌有效信息的第j行,把所有有效行放在一个数组里,统一管理,便于判断
int col[30];//存放含有车牌有效信息的第j列

int main()
{
 Mat srcimage = imread("E://opencv//car_plate1.jpg");
 if (!srcimage.data)
 {
  cerr << "Read picture error!" << endl;
  return 0;
 }
 cout << "输入图片的size为" << "(" << srcimage.rows << "," << srcimage.cols << ")" << endl << endl;
 grayimage.create(srcimage.size(), CV_8UC1);
 threshimage.create(srcimage.size(), CV_8UC1);
 gaussianimage.create(srcimage.size(), CV_8UC1);
 void find_UpandDown_row(Mat_<uchar> dstimage,Mat src);//查找车牌的上边线和下边线
 void find_LeftandRight_col(Mat_<uchar> dstimage, Mat src);//查找车牌的左边线和右边线
 void find_ROI(Mat src);//查找车牌区域
 cvtColor(srcimage, grayimage, COLOR_BGR2GRAY);//灰度化
 GaussianBlur(grayimage, gaussianimage, Size(5, 5), 0, 0);//高斯滤波
 Canny(gaussianimage, threshimage, 200, 100);//Canny边缘检测
 imshow("canny", threshimage);
 
 find_UpandDown_row(threshimage,srcimage);
 find_LeftandRight_col(threshimage, srcimage);
 find_ROI(srcimage);
 waitKey(0);
 return 0;
}
void find_UpandDown_row(Mat_<uchar> dstimage,Mat src)
{
 int k = 0;//统计符合车牌信息的行数
 /*判断每行是否是含有车牌信息的行,通过查看白点黑点交换的次数来决定的*/
 for (int j = 100; j < dstimage.rows -10; j++)//一般车牌位于中下方,而且图像上方和下方环境复杂,所以不去检查
 {
  int count = 0;//记录每行白点的个数
  for (int i = 0; i < dstimage.cols - 1; i++)
  {
   if (dstimage.at<uchar>(j, i) != dstimage.at<uchar>(j, i + 1))//比较同一行相邻两个像素值
    count++;
   if (count > row_thresh)
   {
    row[k++] = j;
    break;
   }
  }
 }
 cout <<"符合阈值的行数有:"<< k+1 << endl;
 /*从上边开始,三行连续时认为是起始行*/
 for (int i = 0; i < k-2; i++)
 {
  if ((row[i] == row[i + 1] - 1) && (row[i] == row[i + 2] - 2))
  {
   rows_start = row[i];
   cout << "上划线所在的行数:" << rows_start << endl;
   break;
  }
 }
 line(src, Point(0, rows_start), Point(dstimage.cols - 1, rows_start), Scalar(0, 0, 255));
 /*从下边开始,三行连续时认为是起始行*/
 for (int i = k - 1; i > 1; i--)
 {
  if ((row[i] == row[i - 1] + 1) && (row[i] == row[i - 2] + 2))
  {
      rows_end = row[i];
   cout << "下划线所在的行数:"<<rows_end << endl;
   break;
  }
 }
    line(src, Point(0, rows_end), Point(dstimage.cols - 1, rows_end), Scalar(0, 0, 255));
 imshow("原图", src);
}
void find_LeftandRight_col(Mat_<uchar> dstimage, Mat src)
{
 int k = 0;//统计符合车牌信息的列数
 /*判断每行是否是含有车牌信息的列,通过查看白点像素的个数*/
 for (int j = 10; j <  dstimage.cols -10; j++)
 {
  int count = 0;//记录每列白点的个数
  for (int i = rows_start; i < rows_end; i++)
  {
   if (dstimage.at<uchar>(i, j) != dstimage.at<uchar>(i+1, j))
    count++;
   if (count > 2)
   {
    col[k++] = j;
    break;
   }
  }
 }
 cout << "符合阈值的列数有:" << k + 1 << endl;
 /*从左边开始,三行连续时认为是起始行*/
 for (int i = 0; i < k - 2; i++)
 {
  if ((col[i] == col[i + 1] - 1) && (col[i] == col[i + 2] - 2))
  {
   cols_start = col[i];
   cout << "左划线所在的列数:" << cols_start << endl;
   break;
  }
 }
 line(src, Point(cols_start, rows_start), Point(cols_start, rows_end), Scalar(0, 0, 255));
 /*从右边开始,三行连续时认为是起始行*/
 for (int i = k - 1; i > 1; i--)
 {
  if ((col[i] == col[i - 1] + 1) && (col[i] == col[i - 2] + 2))
  {
   cols_end = col[i];
   cout << "右划线所在的列数:" << cols_end << endl;
   break;
  }
 }
 line(src, Point(cols_end, rows_start), Point(cols_end, rows_end), Scalar(0, 0, 255));
 imshow("原图", src);
}
void find_ROI(Mat src)
{
 /*构建以(cols_start,rows_start)为左上角,长为cols_end - cols_start,宽为rows_end - rows_start的矩阵*/
 Rect rect=Rect(cols_start, rows_start, cols_end - cols_start, rows_end - rows_start);
 Mat ROI=src(rect);//建立车牌的图像
 imshow("car_plate", ROI);
}
该代码只能从图片中找出车牌位置并分割出来,还不可以识别车牌字符;还有该代码只能识别图片内容比较简单和清晰的图片,不能识别模糊、环境复杂的图片,还有车牌倾斜的也不行,只适合供初学者参考学习,遇到不明白的地方可以在评论中提出问题;同样也希望大神们指点一下,让我有所改进。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用opencv3写的超详细注释的车牌检测 的相关文章

  • OpenCV IP 相机应用程序崩溃 [h264 @ 0xxxxx] 访问单元中缺少图片

    我在 cpp 中有一个 opencv 应用程序 它使用 opencv 的简单结构捕获视频流并将其保存到视频文件中 它与我的网络摄像头完美配合 但是 当我运行它从 IP 摄像机捕获流时 它可能会在大约十秒后崩溃 我的编译命令是 g O3 IP
  • 使用 OpenCV 改进特征点匹配

    我想匹配立体图像中的特征点 我已经用不同的算法找到并提取了特征点 现在我需要一个良好的匹配 在本例中 我使用 FAST 算法进行检测和提取 BruteForceMatcher用于匹配特征点 匹配代码 vector lt vector
  • opencv人脸检测示例

    当我在设备上运行应用程序时 应用程序崩溃并显示以下按摩 java lang UnsatisfiedLinkError 无法加载 detector based tracker findLibrary 返回 null 我正在使用 OpenCV
  • 如何使用 opencv python 计算乐高积木上的孔数?

    我正在开发我的 python 项目 我需要计算每个乐高积木组件中有多少个孔 我将从输入 json 文件中获取有关需要计算哪个程序集的信息 如下所示 img 001 red 0 blue 2 white 1 grey 1 yellow 1 r
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • Opencv Mat内存管理

    内存管理对于图像类至关重要 在opencv中 图像类是cv Mat 它有一个微妙的内存管理方案 假设我已经有了自己的图像类SelfImage class SelfImage public int width int height unsig
  • 在 Visual Studio 2012 中安装 OpenCV

    我正在尝试安装 OpenCV 来与 Visual Studio 一起使用 我使用的是2012Pro版本 但我认为它应该与vs10相同 我正在关注这个教程 http docs opencv org doc tutorials introduc
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt
  • cv2.VideoWriter:请求一个元组作为 Size 参数,然后拒绝它

    我正在使用 OpenCV 4 0 和 Python 3 7 创建延时视频 构造 VideoWriter 对象时 文档表示 Size 参数应该是一个元组 当我给它一个元组时 它拒绝它 当我尝试用其他东西替换它时 它不会接受它 因为它说参数不是
  • “没有名为‘cv2’的模块”,但已安装

    我已经安装了包含 opencv 贡献的 whl 文件 因为我想使用 SIFT 算法 我在 conda 环境中使用 pip 安装了它 所以当我在 conda list 中提示时 它会向我显示 opencv python 3 4 5 contr
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • Python:Urllib2 和 OpenCV

    我有一个程序 可以将图像保存在本地目录中 然后从该目录中读取图像 但我不想保存图像 我想直接从url读取它 这是我的代码 import cv2 cv as cv import urllib2 url http cache2 allposte
  • 从扫描文档中提取行表 opencv python

    我想从扫描的表中提取信息并将其存储为 csv 现在我的表提取算法执行以下步骤 应用倾斜校正 应用高斯滤波器进行去噪 使用 Otsu 阈值进行二值化 进行形态学开局 Canny 边缘检测 进行霍夫变换以获得表格行 去除重复行 10像素范围内相
  • 如何检测斑点并将其裁剪成 png 文件?

    我一直在开发一个网络应用程序 我陷入了一个有问题的问题 我会尝试解释我想要做什么 在这里您看到第一个大图像 其中有绿色形状 我想要做的是将这些形状裁剪成不同的 png 文件 并使它们的背景透明 就像大图像下面的示例裁剪图像一样 第一张图像将
  • 使用卡尔曼滤波器跟踪位置和速度

    我正在使用卡尔曼滤波器 恒定速度模型 来跟踪物体的位置和速度 我测量对象的 x y 并跟踪 x y vx vy 这是有效的 但是如果在传感器读数 x y vx vy 上添加 20 mm 的高斯噪声 即使该点没有移动 只是噪声也会发生波动 对
  • HoughLinesP后如何合并线?

    My task is to find coordinates of lines startX startY endX endY and rectangles 4 lines Here is input file 我使用下一个代码 img c
  • Opencv 对象检测:ORB GPU 检测器和 SURF GPU 描述符提取器

    我只是做了一个小实验来尝试不同的检测器 描述符组合 我的代码使用 ORB GPU 检测器来检测特征 并使用 SURF GPU 描述符来计算描述符 我使用 BruteForceMatcher GPU 来匹配描述符 并使用 knnMatch 方
  • C++ OpenCV 3.4 / FFMPEG 3.4.1 VideoWriter 和 MP4 输出文件格式

    我正在运行 Linux 内核 4 9 35 ti r44 的 ARM BeagleBone X 15 Debian 机器 在我的 C Qt 5 应用程序中 我想将 cv Mat 帧保存为 MP4 格式视频 我安装了 libx264 并从头开
  • 如何选择图像插值方法? (Emgu/OpenCV)

    Emgu OpenCV的 net包装器 提供的图像调整大小功能可以使用四种插值方法中的任意一种 http www emgu com wiki files 1 4 0 0 html 596dd03d 301e d3c6 4c53 c42855
  • 在 Tensorflow-lite Android 中将位图转换为 ByteBuffer(浮点)

    在用于图像分类的tensorflow lite android演示代码中 图像首先转换为ByteBuffer格式以获得更好的性能 这种从位图到浮点格式的转换以及随后到字节缓冲区的转换似乎是一个昂贵的操作 循环 按位运算符 float mem

随机推荐

  • qt_共享库的使用

    在 Windows 中 MinGW 将输出 a 和 dll MSVC 将输出 lib 和 dll 在 Linux 中 MinGW 将输出 so so 1 so 1 0 和 so 1 0 0 lib 其中 a 和 so 是导入库 它们有助于将
  • STM32的CAN过滤

    文章目录 简介 相关寄存器 代码实例 只过滤一个CAN ID 过滤多个CAN ID 简介 STM32的CAN控制器可以对接收到的数据报文进行过滤 只接收指定CAN ID的数据 对于其他CAN ID发送过来的数据 则不再触发CAN中断 根据芯
  • 关于C语言的二分法

    1 二分法 二分法所属现代词 指的是数学领域的概念 经常用于j计算机中的查找过程中 2 基本思想 把函数f x 的零点所在的区间 a b 满足f a f b lt 0 一分为二 得到 a m 和 m b 根据 f a f m lt 0 是否
  • Harmony OS 开发指南——源码下载和编译

    本文介绍了如何下载鸿蒙系统源码 如何一次性配置可以编译三个目标平台 Hi3516 Hi3518和Hi3861 的编译环境 以及如何将源码编译为三个目标平台的二进制文件 坑点总结 下载源码基本上没有太多坑 可以很顺利的进行 编译源码主要的一个
  • PS CJ37/CJ38/CJ34 增加/返回/转借预算

    目录 CJ37增加预算 CJ38返回预算 CJ34转借预算 01 CJ37增加预算 1 补充预算 调用事务代码CJ37 输入要增加的WBS要素的预算 点击保存即可 2 代码示例 预算补充代码 调用函数 KBPP EXTERN UPDATE
  • 【目标检测】基于yolov7的海上船舶检测和识别(附代码和数据集,Windows系统)

    写在前面 首先感谢兄弟们的订阅 让我有创作的动力 在创作过程我会尽最大能力 保证作品的质量 如果有问题 可以私信我 让我们携手共进 共创辉煌 本次项目是在Windows系统上运行的 Ubuntu系统上运行请看专栏的另外一篇文章 文末附项目代
  • 精练排序算法

    排序算法 1 首先列举一些经典的案例 皆为python编写 1 a 33 24 45 16 77 for i in range 2 for j in range 4 i 1 if a j gt a i a j a i a i a j pri
  • 计算机网络应用层协议分析总结

    1 应用层协议原理 1 1 网络应用程序体系结构 C S结构 有一个总是打开的主机称为服务器 它服务于来自许多其他称为客户机的主机请求 客户机主机既可能有时打开 也可能总是打开 C S结构之下 客户机之间不直接通信 服务器有固定的IP地址
  • 常用的专业医学分析和科研绘图工具合集

    专业的医学分析和科研绘图在医学研究 临床实践和教育培训中起到重要的作用 可以提高医学专业人员的工作效率和决策质量 同时也促进医学科学的发展和进步 详细的资源及不停更地址 科研常用资源合集 Fiji ImageJ Fiji自动包含了各种有用的
  • 权重确定方法之主成分分析法

    什么是权重呢 所谓权重 是指某指标在整体评价中的相对重要程度 权重越大则该指标的重要性越高 对整体的影响就越高 权重要满足两个条件 每个指标的权重在0 1之间 所有指标的权重和为1 权重的确定方法有很多 这里我们学习用主成分分析确定权重 一
  • HTML的爱心闪烁代码

    没有web编译器 就先用txt的记事本写好 将后缀txt格式改为html格式 代码1如下
  • 软件开发文档模板

    目录 1 范围 2 总体要求 2 1 总体功能要求 2 2 软件开发平台要求 2 3 软件项目的开发实施过程管理要求 2 3 1 软件项目实施过程总体要求 2 3 2 软件项目实施变更要求 2 3 3 软件项目实施里程碑控制 3 软件开发
  • 基于MapperScan注解的Mybatis动态代理加载机制

    1 如下图在代码开发中使用mybatis时 通过一个接口UserDao对应的方法selectUserNameById执行xml里配置的selectUserNameById查询sql语句 接口dao没有具体的实现方法 那真正执行时mybati
  • 字典排序什么意思_字典序排序

    查字典时 比如查单词 Love 我们是从第一个字母L 开始查找 在A Z开头中的单词中 不管是实际操作的二分查找还是别的方式查找 总能找到L打头的单词所在的位置范围 然后又在这个范围内开始查找O字母排第二的单词 之后又依次检索V字母 E字母
  • DVWA更改不了安全等级,一直卡在一个等级

    关于DVWA更改不了安全等级 一直卡在一个等级 今天在DVWA平台做实验 出现了问题 换不到想要的安全等级 自己动手找找问题 他是通过传参数来确定等级的 那就用burpsuite抓一下看看 当你把这个安全等级删了再发出去 会发现到了high
  • Python创建优化方法

    1 很多小伙伴在python中创建方法时 写的代码很冗余 并且也没有很多的异常格式 今天撰写一个简单的优化方法 2 例如首先我们定义一个方法 里边获取URL的信息 在返回状态值的时候 我们需要进行判断 下面我来讲解一下这个方法的实现过程 首
  • 华为OD机试 - We Are A Team(Java)

    题目描述 总共有 n 个人在机房 每个人有一个标号 1 lt 标号 lt n 他们分成了多个团队 需要你根据收到的 m 条消息判定指定的两个人是否在一个团队中 具体的 消息构成为 a b c 整数 a b 分别代表两个人的标号 整数 c 代
  • Java EE---Spring AOP

    本文是我在学习Java EE过程中记录学习的点点滴滴 仅仅为了学完之后巩固一下 日后忘记了也可以方便快速的复习 文章目录 前言 一 项目清单 二 全部代码 2 1 stuDao接口 2 2 StudentDaoImpl类 2 3 myAsp
  • 一、编写hello world

    1 开发环境 1 操作系统 Linux 2 编译 GCC编译 2 安装GCC 1 我们安装的Linux是Ubuntu 默认是不带GCC的 2 安装GCC命令 apt get install gcc 3 使用vim编写hello world
  • 用opencv3写的超详细注释的车牌检测

    include iostream include opencv2 opencv hpp include opencv2 highgui highgui hpp include opencv2 core core hpp include op