车牌识别项目总结2019.9

2023-10-31

最近学了Python感觉很强大,对计算机视觉有些兴趣,于是来做一个车牌识别项目,其中学习了OpenCV-Python、MATLAB等,收获颇丰,写一篇文章记录一下。

整体思路

车牌识别,LPR,License Plate Recognition,又叫ALPR。本项目使用蓝底白字,共7个字符加1个点的传统车牌。查阅资料发现实现的方式很多,本项目实现的流程为:

  1. 牌照检测:
    这一步是从图片中找到车牌区域,用OpenCV-Python实现。
  2. 字符分割:
    这里把牌照的每个字符分割开,用OpenCV-Python实现。
  3. 字符识别:
    功能如其名。用Scikit-Learn实现。

下面具体来看:

牌照检测

首先我初始图片是这样的:
在这里插入图片描述

开始我用的是网上找的真车实拍图,但是处理到后面发现图片全糊了,原因应该是户外的光照和阴影吧,我太难了。。于是换了这种低级版。

第一步导入图片并灰度化,我也不知道为啥,大家到这么做:

# 导入图片
img_raw = cv.imread('C:/Users/Administrator/Desktop/pic3.jpg')
# 灰度化
img = cv.cvtColor(img_raw, cv.COLOR_BGR2GRAY)

我这个图片显示出来太大了,所以把它调小:

# 等比缩放
rows, cols = img.shape
ratio = rows/cols
img = cv.resize(img, (800,int(800*ratio)))
img_raw = cv.resize(img_raw, (800,int(800*ratio)))

接下来就是平滑图像,为啥要平滑图像呢,我查了资料的理解是:平滑图像的作用是消除图像噪声,图像噪声是一些由于某些因素随机生成的像素点,留着他们会对之后的效果有影响。这里用了高斯平滑,代码就一行:

# 平滑图像
img = cv.GaussianBlur(img, (5,5), 0)

接下来是很重要的一步了——二值化,先上代码:

# 二值化
img = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 11, 2)

官网提供了三种阈值化方法:简单阈值,自适应阈值和大津算法。
就我实验来看,在肉眼上自适应阈值的效果是最好的,但是并不代表对以后的操作就是友好的,开始在处理户外实拍照的时候用的是大津算法,在下文中还会用到简单阈值。
这里放一下二值化后的图像:在这里插入图片描述
接下来是Canny边缘检测,官网上有一句话:It is a multi-stage algorithm and we will go through each stages.意思就是在这一步之前你需要做很多“前戏”,就是为什么前面要做那么多步骤,算解开了我的疑惑吧,下面是代码:

# Canny边缘检测
img = cv.Canny(img, 100, 200)

就一行,很简单,然后是效果图:
在这里插入图片描述
画风变成暗黑系了,接下来这一步很重要,可以帮我们找出车牌的轮廓,叫做形态学处理,还是先上代码和效果图:

# 形态学处理
kernel = np.ones((40,40), np.uint8)
img = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel)
img = cv.morphologyEx(img, cv.MORPH_OPEN, kernel)

在这里插入图片描述
这部分内容官网讲的很清楚,大家可以看一下:Morphological Transformations。这里说一下,kernel很关键,如果是换了一张风格和现在差别很大的图片(比如变成了户外实拍图,车牌位置变得很小),kernel的值是一定要变换的,找到最好的效果。

开运算:先腐蚀后膨胀,去除周围小点。
闭运算:先膨胀后腐蚀,不会去除周围小点,使距离近的图形相连。
至于为啥是先闭运算后开运算,我看别人是这么做的。。

可以看到车牌的轮廓已经很明显了,下面的步骤就是将它选出来。
这里贴一张官网的截图,消除了我当初的疑惑:
在这里插入图片描述
主要是第一条和第三条:

  • 为了更好的准确性,请使用二值图像。所以在查找轮廓之前,先阈值化或者Canny边缘检测。
  • 在OpenCV里,找到轮廓是从黑色背景里找白色对象,所以要记住,要被查找的对象应该是白色的,背景应该是黑色的。

当初听说可以轮廓检测,就纳闷为啥不能直接拿生图去检测,非要经过前面一系列处理。

好了,再回来,官网提供了函数可以帮你选出所有轮廓:

# 找出所有轮廓
contours, hierarchy = cv.findContours(img, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

返回值contours是个数组,包含找到的所有轮廓,每一个元素都是轮廓的点集。找出来之后当然也要画出来看一下:

# 绘制所有轮廓
img = cv.drawContours(img_raw, contours, -1, (0,0,255), 3)

contourIdx参数如果是0、1、2、3等,就是绘制contours里面的指定轮廓,如果是-1,就是绘制所有轮廓。
这个函数不仅可以绘制轮廓,还可以把边界点进行连线。

cv.drawContours函数中的contourId参数为0时:
前一个参数如果是轮廓的集合,则打印第一条直线。
前一个参数如果是点的集合,则打印第一个点,如果想打印所有点连成的直线,则要加[]。

咱看一下效果吧(我是在原图上绘制的,这样方便看框定的区域是否准确):
在这里插入图片描述
可以看到车牌区域是完完整整地被框在某一个轮廓内,效果还是可以的,但计算机并不知道哪一个才是车牌轮廓,我们要把它筛选出来,这里我写了一个函数,是返回车牌图片,如图:
在这里插入图片描述
先上代码,再说一下我的思路:

def ContoursSelect(img_raw, contours):
    rectangle = []
    for cnt in contours:
        if cv.contourArea(cnt) > 15000:
            # img = cv.drawContours(img_raw, [cnt], 0, (0,0,255), 3)
            box_info = cv.minAreaRect(cnt)
            width, height = box_info[1]
            if width < height:
                width,height = height,width
            if 2 < width/height < 5:
                box_float = cv.boxPoints(box_info)
                box = np.intc(box_float)
                rectangle.append(box)
    if not len(rectangle) == 1:
        print('筛选错误!')
        return -1
    else:
        location_level = np.float32([[0,height],[0,0],[width,0],[width,height]])
        location_tilt = np.float32([[width,height],[0,height],[0,0],[width,0]])
        location = location_level if box_info[2] == 0 else location_tilt
        M = cv.getPerspectiveTransform(box_float, location)
        img_plate = cv.warpPerspective(img_raw, M, (int(width),int(height)))
        return img_plate
  1. 找到车牌轮廓

官网上给出了很多轮廓特征我们可以参考一下,比如说算轮廓的长度(也就是围成区域的周长)、轮廓围成的区域的面积等。

这里我用的两个条件去筛选(其实第一个经过第一个条件之后就只剩一个轮廓了,就是车牌轮廓):
第一个是面积,首先我查看所有轮廓的面积,确定合适的阈值,就是15000。
第二个我用到了边界矩形中的旋转矩形,这个特征非常适合本项目,因为车牌就是个矩形嘛。

下面我来具体解释一下,它会用一个矩形框住轮廓,并且是可以旋转的,因此可以保证面积最小。这不仅可以帮助我们筛选(车牌的长宽比是一定比例的),对截取车牌也是很方便的。可以去官网详细地看一下Contour Features

在实践过程中我遇到了一个问题:在我计算长宽比的时候,发现有时会出现小于0的情况,说明函数对于长宽的定义有他自己的想法,具体原因在这里:python opencv minAreaRect 生成最小外接矩形

  1. 把车牌截出来并返回

上一步已经用一个矩形把车牌位置框出来,由于他有可能是倾斜的,我们要把它摆正然后截出来返回。用到了透视变换,官网有实现步骤Geometric Transformations of Images,需要的边界点、中心点上面的旋转矩形都提供了,还是很方便的。

在实践过程中也遇到了问题:如果我车牌的外接矩形本来就是水平的,没错可以这么巧,我就遇到了,那么四个边界的定义顺序就和倾斜的不一样(详情还是见上面那篇文章),所以要分开讨论。

这样,这个函数就写完了,会返回一个摆正的车牌图:
在这里插入图片描述

字符分割

这一步的实现方法有很多,比如用机器学习的聚类算法,但是我没做出来,我用的算法生硬且暴力,大家看一下就知道了。

首先我们还是要得到车牌二值图,但是这里二值化的方法和上面就不一样了,这里采用简单阈值法,阈值是自己实验选择出来的:

# 车牌二值化
img_plate = cv.cvtColor(img_plate_raw, cv.COLOR_BGR2GRAY)
img_plate = cv.GaussianBlur(img_plate, (5,5), 0)
ret, img_plate = cv.threshold(img_plate, 225, 255, cv.THRESH_BINARY)

看一下效果:
在这里插入图片描述
还行吧,接着我进行了一步开运算,因为我实验发现车牌号周围有许多小点:
在这里插入图片描述

这样看还不如不搞这一步。。

接下来就是切割了,我写了两个函数:

  1. LevelCut

这个函数的作用是把车牌号上下面的多余部分去掉。原理是找到图像中间的一行像素,从左向右检测,遇到白色就向上(下)移动,重复,直到有一行完全没有白色,认为是边界。上代码:

def LevelCut(img_plate):
    rows, cols = img_plate.shape
    line = rows//2 # line是图片中水平中线
    boundaries = []
    for boundary in range(line, 0, -1): # 向上扫描找到上边界
        flag = 1
        for point in img_plate[boundary]:
            if point == 255:
                flag = 0
                break
        if flag:
            boundaries.append(boundary)
            break
    for boundary in range(line, rows-1, 1): # 向下扫描找到下边界
        flag = 1
        for point in img_plate[boundary]:
            if all(point == [255,255,255]): # point == 255
                flag = 0
                break
        if flag == 1:
            boundaries.append(boundary)
            break
    img_plate_temp = img_plate[boundaries[0]:boundaries[1],:]
    return img_plate_temp

效果如图:
在这里插入图片描述
其实这个算法可以优化,把“遇到白色就向上(下)移动”改为统计每一行的像素值和从而找到一个阈值,毕竟一行像素完全完全是黑色这个条件有点太苛刻了。

这一步操作之后要调整一下图片大小,因为下面操作会用到字符间和字符本身的宽度,不然阈值就用不了了。

  1. VerticalCut

垂直切割要考虑的情况更多,原理和水平切割类似,统计每一列的像素值和,相当于把图片垂直压缩成一行,如果前后两值从0变成非0为左边界,或从非0变0为右边界,每一对左右边界框定出一个字符。算法会遇到以下问题:
第一个问题是,省份简写中例如“沪”、“浙”、“津”等,在图片预处理的过程中很容易把偏旁腐蚀,这个算法就会把一个字的偏旁当做一个字符框起来,更不要说“川”这种字,算法会把它拆成三块,这里我解决的办法是判断两个字符的间距,如果小于某个阈值就认为是一个字,进行合并。
第二个问题是,车牌的组成里有个点,我的算法会把也会把它框出来当做一个字符,方法是,这个判断字符本身的宽度,很小的就剔除。
还会有其他细节问题,大家自行看代码:

def VerticalCut(img_plate_temp):
    imgs = [] # 用于存放7张图片
    boundaries = [] # 用于存放边界
    img_one_dim = np.sum(img_plate_temp//255, axis=0) # 这是一个一维矩阵,表示二值图压缩成一行,每个元素表示一列像素的像素值之和(除255使矩阵中只有0和1,方便观察)
    left_boundary = -1
    for val in enumerate(img_one_dim):
        if val[0] == 0:
            before = val
            continue
        elif before[1] == 0 and val[1] != 0:
            left_boundary = before[0]
        elif before[1] != 0 and val[1] == 0:
            right_boundary = val[0]
            if not left_boundary == -1:
                boundaries.append([left_boundary,right_boundary])
        before = val
    distance = [(boundaries[i+1][0]-boundaries[i][1]) for i in range(len(boundaries)-1)] # 查看每两组区域间的距离
    for dis in enumerate(distance):
        if dis[1] < 8: # 两组区域间距离小于8的认为是一片区域,进行合并
            x = boundaries[dis[0]][0]
            y = boundaries[dis[0]+1][1]
            del boundaries[dis[0]], boundaries[dis[0]]
            boundaries.insert(dis[0], [x,y])
    length = [(j-i) for i,j in boundaries]
    if len(boundaries) == 7:
        imgs = Cut(img_plate_temp, boundaries)
    else:
        for i in range(len(boundaries)-7):
            index = length.index(min(length))
            del length[index], boundaries[index]
        imgs = Cut(img_plate_temp, boundaries)
    return imgs

def Cut(img_plate_temp, boundaries):
    imgs = []
    rows, cols = img_plate_temp.shape
    for boundary in boundaries:
        imgs.append(img_plate_temp[0:rows,boundary[0]:boundary[1]])
    return imgs

在测试过程中我犯了个不细心的错误,这里记录一下:
a = [1,2,3,4,5,6,7] # 想删除前两个元素
del a[0],a[0] # 不要写成 del a[0],a[1]

上效果图:
在这里插入图片描述
看效果还是不错的,不过不得不说,我这算法太傻了,大家尽量别用。

还有一个问题自己遇到了,在这里提一下:有时候我喜欢去Jupyter里测试代码,比较方便,但是二值图保存到本地再在Jupyter里面读就不是二维矩阵了,又变成三维了。导致我有的代码在Jupyter里跑地好好的,移到主程序里就出错,都是教训啊!

字符识别

学习机器学习的时候做过MNIST手写数字识别,用的是神经网络算法,我觉得和这个很类似,决定如法炮制。
在网上找了个数据集如图,里面包括数字0到9,24个大写英文字母(I和O没有,太容易和1和0搞混吧)还有部分省份简称,大小是40*32,共5062张。
在这里插入图片描述
拿到图片之后就要打标签了,这个以前没做过,于是我打算看看MNIST数据集长什么样子,是一个mat文件,于是下载了MATLAB,打开后长这样:
在这里插入图片描述
我决定按它的格式复刻一份,5000多张图片挨个打标签肯定是不现实的,那就来写个脚本:

main_path = uigetdir('请选择文件夹:');
cd (main_path);
folders = dir('.');
for i = 1:length(folders);
    if i >= 3;
        cd (folders(i).name);
        imgs = dir('*.bmp');
         for j = 1:length(imgs);
             path = fullfile((main_path), (folders(i).name), (imgs(j).name));
             img = imread(path);
             lb = str2num(folders(i).name);
             img = img(:);
             data = [data,img];
             pause(1);
             label = [label,lb];
         end
         cd ..;
    end
end

我把我的数据集的文件夹做了下整理,一共是3层,第二层是40个文件夹,文件夹名就是标签,所以打标签的过程就完全不用人参与了,为了防止跑乱,中间加了1秒的延时。

第一次写MATLAB脚本遇到点问题,这里记录一下:

  1. cd 变量,一定要给变量加上括号,不然出错;
  2. 文件夹展开第三项才是第一个文件夹,不然就跑乱了;
  3. 打完标签后记得返回上一层。。

程序跑了一个多小时,成功了,还是很开心的,如下:
在这里插入图片描述
一模一样复制了一份,名字都没改,可见我求生欲有多强。下面就可以开始训练了:

from sklearn.datasets import fetch_mldata
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.externals import joblib
ALPR = fetch_mldata('MLSET', data_home='C:\\Users\\Administrator\\Desktop\\datasets\\MLSET\\')
X = ALPR.data/255
y = ALPR.target
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 4602, test_size=1000, random_state=62)
mlp_alpr = MLPClassifier(solver='lbfgs',hidden_layer_sizes=[100,100], activation='relu', alpha=1e-5, random_state=62)
mlp_alpr.fit(X_train, y_train)
joblib.dump(mlp_alpr, 'C:\\Users\\Administrator\\Desktop\\mlp_alpr.pkl')
print('测试数据集得分:{:.2f}%'.format(mlp_alpr.score(X_test,y_test)*100))

打印出来测试集得分99.5%,把我高兴坏了,但是实际上效果很差。下面是预测代码:

label = ['0','1','2','3','4','5','6','7','8','9',
        'A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z',
        '沪','京','闽','苏','粤','浙']
def Predict(nums):
    mlp_alpr = joblib.load('C:\\Users\\Administrator\\Desktop\\mlp_alpr.pkl')
    plate_number = ''
    for num in nums:
        num = num/255
        arr = []
        for j in range(32):
            for i in range(40):
                arr.append(num[i][j])
        arr1 = np.array(arr).reshape(1,-1)
        c = label[mlp_alpr.predict(arr1)[0]]
        plate_number = plate_number + c
    return plate_number

第一,要注意把测试图片resize成数据集中图片一样的大小,就是一样的特征数。
第二,图片的展开方式一定要相同,我的MATLAB脚本上是这样展开的:
在这里插入图片描述
但是测试图片如果这样展开就肯定错了:
在这里插入图片描述
好了,我的测试结果为:

(root) C:\Users\Administrator>D:/mypython/Anaconda3/python.exe c:/Users/Administrator/Desktop/ALPR.py
U6P7087

一共7个字符对了4个,结果挺失望的,问了下朋友,他建议数据集的数据自己采集。唉,不管怎么说这一条线也算走下来了。

如有错误,欢迎指正!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

车牌识别项目总结2019.9 的相关文章

  • 在 Pandas 中按日期获取有效合约

    我在检测 pandas DataFrame 中的活动合约方面遇到了一些困难 假设每一行都是一个协商 对于每一行 我有两列 initial date 和 end date 我想知道的是按日期划分的活跃合约数量 到目前为止我做了一个非常低效的方
  • 从正在运行的 python 脚本检测优化标志是否为 -O 或 -OO

    有时我想生成一个子进程 其优化标志与启动父进程时使用的优 化标志相同 我可以使用类似的东西 optimize not debug 但这样我就可以匹配两者 O and OO flags 是否有一些 python 内部状态包含该信息 经过一番深
  • 为什么 .setGeometry() 不改变 QWidget 实例的大小?

    我想使用 QWidget 更改 QPushButton 的大小 setGeometry https doc qt io qtforpython 5 PySide2 QtWidgets QWidget html PySide2 QtWidge
  • 在Python3.6中调用C#代码

    由于完全不了解 C 编码 我希望在我的 python 代码中调用 C 函数 我知道有很多关于同一问题的问答 但由于一些奇怪的原因 我无法从示例 python 模块导入简单的 c 类库 以下是我所做的事情 C 类库设置 我使用的是 VS 20
  • 如何在Python中循环并存储自变量中的值

    我对 python 很陌生 所以这听起来可能很愚蠢 我进行了搜索 但没有找到解决方案 我在 python 中有一个名为 ExcRng 的函数 我可以对该函数执行什么样的 for 循环 以便将值存储在独立变量中 我不想将它们存储在列表中 而是
  • 如何从 PyCharm 项目中获取我的“exe”[重复]

    这个问题在这里已经有答案了 通过 PyCharm 在 Python 上编写一些项目 我想从中获取一个exe文件 我尝试过 另存为 gt XXX exe 但是 当我尝试执行它时出现错误 此类操作系统不支持该文件 附注 我有win7 x64 它
  • 如何使用Python将WebP图像转换为Gif?

    我已经尝试过这个 from PIL import Image im Image open this webp im save that gif gif save all True 这给了我这个错误 类型错误 不支持的操作数类型 tuple
  • python 中分割字符串以获得一个值?

    需要帮助 假设我在名为 input 的变量中有一个字符串 Sam Person name kind input split 通过执行上述操作 我得到两个具有不同字符串 Sam 和 Person 的变量 有没有办法只获取第一个值 name S
  • 优化 Keras 以使用所有可用的 CPU 资源

    好吧 我真的不知道我在说什么 所以请耐心听我说 我正在使用 Theano 后端运行 Keras 以在 MNIST 图像上运行基本的神经网络 目前只是一个教程 过去 我一直使用我的旧 HP 笔记本电脑 因为我有 Windows 和 Ubunt
  • Paramiko - 使用私钥连接 - 不是有效的 OPENSSH 私钥/公钥文件

    我正在尝试找到解决方案 但无法理解我做错了什么 在我的 Linux 服务器上 我运行了以下命令 ssh keygen t rsa 这产生了一个id rsa and id rsa pub file 然后我将它们复制到本地并尝试运行以下代码 s
  • PIL Image.size 返回相反的宽度/高度

    使用PIL确定图像的宽度和高度 在特定图像上 幸运的是只有这一个 但这很麻烦 从 image size 返回的宽度 高度是相反的 图片 http storage googleapis com cookila 533ebf752b9d1f7c
  • Python igraph:从图中删除顶点

    我正在使用安然电子邮件数据集 并尝试删除没有 enron com 的电子邮件地址 即我只想拥有安然电子邮件 当我尝试删除那些没有 enron com 的地址时 一些电子邮件由于某些原因被跳过 下面显示了一个小图 其中顶点是电子邮件地址 这是
  • 创建一个类似于 Tkinter 的表

    我希望创建类似于 Tkinter 中的表格的东西 但它不一定是这样的 例如 我想创建标题 Name1 Name2 Value 并在每个标题下面有几个空白行 然后 我希望稍后用我计算的值或名称的字符串值填充这些行 因此是标签 对于 Name2
  • 如何在python中检索aws批处理参数值?

    流程 Dynamo DB gt Lambda gt 批处理 如果将角色 arn 插入动态数据库 它是从 lambda 事件中检索的 然后使用submit job角色 arn 的 API 被传递为 parameters role arn ar
  • 具有多个元素的数组的真值是二义性错误吗? Python

    from numpy import from pylab import from math import def TentMap a x if x gt 0 and x lt 0 5 return 2 a x elif x gt 0 5 a
  • Matlab 中是否有相当于 R 的 dput() 的函数?

    Matlab 中是否有相当于 R 的 dput 的函数 dput 将 R 对象的 ASCII 文本表示形式写入文件或连接 UPDATE 1 添加了递归和对单元格的支持 UPDATE 2 添加了对结构的支持 UPDATE 3 增加了对逻辑 整
  • Pandas Dataframe:将包含列表的行扩展到多行,并为所有列提供所需的索引

    我在 pandas 数据框中有时间序列数据 索引为测量开始时的时间 列中包含以固定采样率记录的值列表 连续索引 列表中元素数量的差异 这是它的样子 Time A B Z 0 1 2 3 4 1 2 3 4 2 5 6 7 8 5 6 7 8
  • 查找给定节点的最高权重边

    我在 NetworkX 中有一个有向图 边缘的权重从 0 到 1 表示它们发生的概率 网络连通性非常高 所以我想修剪每个节点的边缘 只保留最高概率的节点 我不确定如何迭代每个节点并仅保留最高权重in edges在图中 有没有一个networ
  • Python - 如何查询定义方法的类?

    我的问题有点类似于this one https stackoverflow com questions 5520580 how do you get all classes defined in a module but not impor
  • 如何在sphinx中启用数学?

    我在用sphinx http sphinx pocoo org index html与pngmath http sphinx pocoo org ext math html module sphinx ext pngmath扩展来记录我的代

随机推荐

  • 将excel数据格式转成tableau

    import pandas as pd data pd read excel 世界各国人口统计数据 2000 2020 世界银行 xlsx data head print data columns tolist 将上面显示出来的列名列表 选
  • 复合查询

    复合查询 1 单表查询 查询工资高于500或岗位为MANAGER的雇员 同时还要满足他们的姓名首字母为大写的J select empno ename sal job from emp where sal gt 500 or job MANA
  • 倒排索引学习笔记

    概述 顺序扫描法 正向搜索法 举个例子 比如我们有大量的文件 文件编号从A B C 需求 要找出文件内容中包含有java的所有文件 需求实现 从A文件开始查找 再找B文件 然后再找C文件 以此类推 弊端 如果文件数量很多 查找速度慢 倒排索
  • JavaScript中的基本数据类型与引用数据类型

    JavaScript中的基本数据类型与引用数据类型 转载自 https www cnblogs com c2016c articles 9328725 html 1 栈 stack 和堆 heap stack为自动分配的内存空间 它由系统自
  • Aliyun本地化部署WebPageTest--前端性能测量工具

    1 有阿里云 创建一个ECS实例 2 设置阿里云docker源加速器 拉取对应的镜像 docker pull webpagetest server docker pull webpagetest agent 1 运行server实例 doc
  • C语言全局变量和局部变量总结

    只有不断的学习 不断的进步 才能不被替代 只有你的不可替代性才决定你的价值 2016年11月18日 第一部分问题 今天一个小伙伴问我一个问题 如图程序1 咋一看没有问题啊 后来想想确实有问题 这个c a a 似乎是语句 必须在函数体内才能执
  • ESP32使用AT MQTT 固件发布主题信息返回ERROR解决

    目录 发布格式 原因及其解决方法 发布格式 AT MQTTPUB lt topic gt lt data gt 0 0 当需要发布对应主题的json数据包时 错误格式 AT MQTTPUB 0 device date msg1 22 msg
  • WAV文件格式详解

    概述 Waveform Audio File Format WAVE 又或者是因为WAV后缀而被大众所知的 它采用RIFF Resource Interchange File Format 文件格式结构 通常用来保存PCM格式的原始音频数据
  • Podman 从入门到精通

    腾讯云原生最佳实践 1 前言 在本文中 我们将了解 Podman Pod Manager的缩写 它的功能和用法 2 Podman Podman 是一个开源的容器管理工具 用于开发 管理和运行OCI容器 让我们来看看与其他容器管理工具相比 P
  • 图片拖到任意处并记录相应的位置

  • 备忘一下,vulkan android sample 编译错误:ninja: error: libshaderc.a', needed by

    又要编译vulkan API Sample 每次找这行命令要用很久 备个忘 不编译shaderc的对应的编译错误为 Build command failed Error while executing process C Users hon
  • GPT1,2,3

    GPT1 transformer解码器因为有掩码所以不看后面的东西 gpt就是transformer的解码器 bert 是transformer的编码器 gpt核心卖点 不管输入如何 transformer模型不会变 半监督 先在没有标号上
  • 华为OD机试真题-磁盘容量排序-2023年OD统一考试(B卷)

    题目描述 磁盘的容量单位常用的有M G T这三个等级 它们之间的换算关系为1T 1024G 1G 1024M 现在给定n块磁盘的容量 请对它们按从小到大的顺序进行稳定排序 例如给定5块盘的容量 1T 20M 3G 10G6T 3M12G9M
  • python获得用户输入的一个字符串、格式如下_第七章 用户输入和while语句

    大多数编程都旨在解决最终用户的问题 为此通常需要从用户那里获取一些信息 例如 假设有人要判断自己是否到了投票的年龄 要编写回答这个问题的程序 就需要知道用户的年龄 这样才能给出答案 因此 这种程序需要让用户输入其年龄 再将其与投票年龄进行比
  • .mdb文件导入到mysql(工具Navicat Premium 12)

    可能会报错 需要安装AccessDatabaseEngine 1打开数据库 2 选择你的mdb文件 跟着提示一步步往下就行了 如果选择文件后报错 安装一下AccessDatabaseEngine 网上找找 这个是64位的 链接 https
  • GRPC C++开发环境搭建

    本文章参与 lt 零声教育 gt 的C C Linux服务器高级架构系统教程学习 1 安装必要的依赖工具 安装必要的依赖工具 sudo apt get install autoconf automake libtool 如果cmake低于3
  • SLF4J

    日志是任何项目中最重要的东西之一 特别是遇到多线程环境下高压力导致的并发bug时 但是在实际项目中有使用slf4j api slf4j log4j12还有log4j的 作为程序员到底应该使用哪一种呢 要使用他们 我们首先要理清楚他们之间的关
  • 八进制数字字符转化为十进制详解

    include
  • C++ Primer Plus(第6版)第2章 开始学习C++

    复习题 1 函数 2 用iostream头文件的内容替换源代码中的 include语句 3 使std名称空间中的内容全部直接可用 4 std cout lt lt hello world lt
  • 车牌识别项目总结2019.9

    最近学了Python感觉很强大 对计算机视觉有些兴趣 于是来做一个车牌识别项目 其中学习了OpenCV Python MATLAB等 收获颇丰 写一篇文章记录一下 整体思路 车牌识别 LPR License Plate Recognitio