-
2021-04-24 12:07:09
基本概念
自动识别技术(Automatic Identification and Data Capture)就是应用一定的识别装置,通过被识别物品和识别装置之间的接近活动,自动地获取被识别物品的相关信息,并提供给后台的计算机处理系统来完成相关后续处理的一种技术。自动识别技术将计算机、光、电、通信和网络技术融为一体,与互联网、移动通信等技术相结合,实现了全球范围内物品的跟踪与信息的共享,从而给物体赋予智能,实现人与物体以及物体与物体之间的沟通和对话。
物联网中非常重要的技术就是自动识别技术,自动识别技术融合了物理世界和信息世界,是物联网区别于其他网络(如:电信网,互联网)最独特的部分。自动识别技术可以对每个物品进行标识和识别,并可以将数据实时更新,是构造全球物品信息实时共享的重要组成部分,是物联网的基石。通俗讲,自动识别技术就是能够让物品“开口说话”的一种技术。技术分类(按照应用领域和具体特征的分类标准,自动识别技术可以分为如下七种)
-
条码识别技术
一维条码是由平行排列的宽窄不同的线条和间隔组成的二进制编码。比如:这些线条和间隔根据预定的模式进行排列并且表达相应记号系统的数据项。宽窄不同的线条和间隔的排列次序可以解释成数字或者字母。可以通过光学扫描对一维条码进行阅读,即根据黑色线条和白色间隔对激光的不同反射来识别。二维条码技术是在一维条码无法满足实际应用需求的前提下产生的。比如:由于受信息容量的限制,一维条码通常对物品的标示,而不是对物品的描述。二维条码能够在横向和纵向两个方向同时表达信息,因此能在很小的面积内表达大量的信息。 -
生物识别技术 指通过获取和分析人体的身体和行为特征来实现人的身份的自动鉴别。 生物特征分为物理特征和行为特点两类。指通过获取和分析人体的身体和行为特征来实现人的身份的自动鉴别。
生物特征分为物理特征和行为特点两类。
物理特征:包括指纹、掌形、眼睛(视网膜和虹膜)、人体气味、脸型、皮肤毛孔、手腕、手的血管纹理和DNA等;
行为特点包括:签名、语音、行走的步态、击打键盘的力度等。如:声音识别技术,人脸识别技术,指纹识别技术。 -
图像识别技术
在人类认知的过程中,图形识别指图形刺激作用于感觉器官,人们进而辨认出该图像是什么的过程,也叫图像再认。在信息化领域,图像识别,是利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对象的技术。例如:地理学中指将遥感图像进行分类的技术。图像识别技术的关键信息,既要有当时进入感官(即输入计算机系统)的信息,也要有系统中存储的信息。只有通过存储的信息与当前的信息进行比较的加工过程,才能实现对图像的再认。 -
磁卡识别技术
磁卡是一种磁记录介质卡片,由高强度、高耐温的塑料或纸质涂覆塑料制成,能防潮、耐磨且有一定的柔韧性,携带方便、使用较为稳定可靠。磁条记录信息的方法是变化磁的极性,在磁性氧化的地方具有相反的极性,识别器才能够在磁条内分辨到这种磁性变化,这个过程被称作磁变。一部解码器可以识读到磁性变化,并将它们转换回字母或数字的形式,以便由一部计算机来处理。磁卡技术能够在小范围内存储较大数量的信息,在磁条上的信息可以被重写或更改。 -
IC卡识别技术
IC卡即集成电路卡,是继磁卡之后出现的又一种信息载体。IC卡通过卡里的集成电路存储信息,采用射频技术与支持IC卡的读卡器进行通讯。射频读写器向IC卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,这样在电磁波激励下,LC谐振电路产生共振,从而使电容内有了电荷;在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内存储,当所积累的电荷达到2 V时,此电容可作为电源为其它电路提供工作电压,将卡内数据发射出去或接受读写器的数据。按读取界面将IC卡分为下面两种。接触式IC卡,该类卡通过IC卡读写设备的触点与IC卡的触点接触后进行数据的读写。国际标准ISO7816对此类卡的机械特性、电器特性等进行了严格的规定。非接触式IC卡,该类卡与IC卡读取设备无电路接触,通过非接触式的读写技术进行读写(例如光或无线技术)。卡内所嵌芯片除了CPU、逻辑单元、存储单元外,增加了射频收发电路。国际标准ISO10536系列阐述了对非接触式IC卡的规定。该类卡一般用在使用频繁、信息量相对较少、可靠性要求较高的场合。 -
光学字符识别技术(OCR)
OCR(Optical Character Recognition),是属于图形识别的一项技术 。其目的就是要让计算机知道它到底看到了什么,尤其是文字资料。针对印刷体字符(比如一本纸质的书),采用光学的方式将文档资料转换成为原始资料黑白点阵的图像文件,然后通过识别软件将图像中的文字转换成文本格式,以便文字处理软件进一步编辑加工的系统技术。一个OCR识别系统,从影像到结果输出,必须经过影像输入、影像预处理、文字特征抽取、比对识别、最后经人工校正将认错的文字更正,最后将结果输出。 -
射频识别技术(RFID)
射频识别技术是通过无线电波进行数据传递的自动识别技术,是一种非接触式的自动识别技术。它通过射频信号自动识别目标对象并获取相关数据,识别工作无需人工干预,可工作于各种恶劣环境。与条码识别、磁卡识别技术和IC卡识别技术等相比,它以特有的无接触、抗干扰能力强、可同时识别多个物品等优点,逐渐成为自动识别中最优秀的和应用的领域最广泛的技术之一,是最重要的自动识别技术。
整理来源:自动识别技术
更多相关内容 -
-
自动识别技术应用案例分析
2016-10-13 13:31:59《自动识别技术应用案例分析》作为自动识别技术系列教材之一,对国内外自动识别技术应用情况作了全面的介绍和细致的分析,力图使读者能对自动识别技术应用有全面和系统的了解。作为国内高等院校自动识别技术的专业... -
按键精灵自动识别图片验证码
2018-10-09 15:39:58按键精灵自动识别图片验证码,内有代码和操作方法视频,简单明了 -
java身份证自动识别源码
2019-03-16 14:04:01java身份证自动识别源码 -
快递地址信息自动识别实例
2018-07-27 11:22:50快递地址信息识别实例,客户上传地址图片,识别图片内的内容,识别出,收件人,电话,地址等信息。客户上传地址图片,客户上传地址图片, -
图片数字自动识别工具
2012-11-19 11:36:43这个小工具可以自动的识别图片中的数字,可以用于一般的拍照设备拍出来的图片中数字的识别 -
自动识别插入电脑设备的代码c#USB串口
2014-06-20 15:36:40C# CSharp 自动识别设备 USB 串口 -
一起用Python做个车牌自动识别系统,好玩又实用!
2021-08-18 14:23:24今天就继续给大家分享一个实战案例,带大家一起用Python的PyQt5开发一个车牌自动识别系统! 首先一起来看看最终实现的车牌识别系统效果图: 下面,我们就开始介绍如何实现这款自动车牌识别系统。 一、核心功能设计 ...前言
前段时间,用PyQt5写了两篇文章,关于Python自制一款炫酷音乐播放器、自定义桌面动画挂件。有粉丝问我,为什么要用PyQt5?之前没接触过PyQt5,能不能多分享一些这方面的开发案例?
今天就继续给大家分享一个实战案例,带大家一起用Python的PyQt5开发一个车牌自动识别系统!
首先一起来看看最终实现的车牌识别系统效果图:
下面,我们就开始介绍如何实现这款自动车牌识别系统。直接跳到文末获取粉丝专属福利。
一、核心功能设计
总体来说,我们首先要进行UI界面构建设计,根据车牌识别系统功能进行画面排版布局;其次我们的这款车牌识别系统的主要功能车辆图片读取识别显示、图片中车牌ROI区域获取、车牌识别结果输出显示。
对于结果输出显示,我们主要包含了读取图片名称、读取录入时间、识别车牌号码、识别车牌颜色、识别车牌所属地。最后我们还可以将车牌识别系统的数据信息导出本地存储。
拆解需求,大致可以整理出核心功能如下:
-
UI设计排版布局
- 左侧区域进行识别信息显示,包含图片名称、读取录入时间、识别车牌号码、识别车牌颜色、识别车牌所属地信息
- 右侧可以分成3个区域,顶部区域包含窗体最小化,最大化,关闭功能;中间区域显示读取车辆图片;底部区域包含车牌显示区域、图片读取、车牌信息存储功能
-
车牌识别
- 通过读取图片进行车牌区域提取输出
- 车牌自动识别结果输出
-
车牌信息显示存储
- 根据自动识别结果对车牌各类信息显示
- 对录入识别的车辆车牌识别信息存储
二、实现步骤
1. UI设计排版布局
根据车牌识别需要的功能,首先进行UI布局设计,我们这次还是使用的pyqt5。核心设计代码如下:
# author:CSDN-Dragon少年 def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(1213, 670) MainWindow.setFixedSize(1213, 670) # 设置窗体固定大小 MainWindow.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.scrollArea = QtWidgets.QScrollArea(self.centralwidget) self.scrollArea.setGeometry(QtCore.QRect(690, 40, 511, 460)) self.scrollArea.setWidgetResizable(True) self.scrollArea.setObjectName("scrollArea") self.scrollAreaWidgetContents = QtWidgets.QWidget() self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 500, 489)) self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.label_0 = QtWidgets.QLabel(self.scrollAreaWidgetContents) self.label_0.setGeometry(QtCore.QRect(10, 10, 111, 20)) font = QtGui.QFont() font.setPointSize(11) self.label_0.setFont(font) self.label_0.setObjectName("label_0") self.label = QtWidgets.QLabel(self.scrollAreaWidgetContents) self.label.setGeometry(QtCore.QRect(10, 40, 481, 420)) self.label.setObjectName("label") self.label.setAlignment(Qt.AlignCenter) self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.scrollArea_2 = QtWidgets.QScrollArea(self.centralwidget) self.scrollArea_2.setGeometry(QtCore.QRect(10, 10, 671, 631)) self.scrollArea_2.setWidgetResizable(True) self.scrollArea_2.setObjectName("scrollArea_2") self.scrollAreaWidgetContents_1 = QtWidgets.QWidget() self.scrollAreaWidgetContents_1.setGeometry(QtCore.QRect(0, 0, 669, 629)) self.scrollAreaWidgetContents_1.setObjectName("scrollAreaWidgetContents_1") self.label_1 = QtWidgets.QLabel(self.scrollAreaWidgetContents_1) self.label_1.setGeometry(QtCore.QRect(10, 10, 111, 20)) font = QtGui.QFont() font.setPointSize(11) self.label_1.setFont(font) self.label_1.setObjectName("label_1") self.tableWidget = QtWidgets.QTableWidget(self.scrollAreaWidgetContents_1) self.tableWidget.setGeometry(QtCore.QRect(10, 40, 651, 581)) # 581)) self.tableWidget.setObjectName("tableWidget") self.tableWidget.setColumnCount(5) self.tableWidget.setColumnWidth(0, 140) # 设置1列的宽度 self.tableWidget.setColumnWidth(1, 130) # 设置2列的宽度 self.tableWidget.setColumnWidth(2, 110) # 设置3列的宽度 self.tableWidget.setColumnWidth(3, 90) # 设置4列的宽度 self.tableWidget.setColumnWidth(4, 181) # 设置5列的宽度 self.tableWidget.setHorizontalHeaderLabels(["图片名称", "录入时间", "车牌号码", "车牌类型", "车牌信息"]) self.tableWidget.setRowCount(self.RowLength) self.tableWidget.verticalHeader().setVisible(False) # 隐藏垂直表头) self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers) self.tableWidget.raise_() self.scrollArea_2.setWidget(self.scrollAreaWidgetContents_1) self.scrollArea_3 = QtWidgets.QScrollArea(self.centralwidget) self.scrollArea_3.setGeometry(QtCore.QRect(690, 510, 341, 131)) self.scrollArea_3.setWidgetResizable(True) self.scrollArea_3.setObjectName("scrollArea_3") self.scrollAreaWidgetContents_3 = QtWidgets.QWidget() self.scrollAreaWidgetContents_3.setGeometry(QtCore.QRect(0, 0, 339, 129)) self.scrollAreaWidgetContents_3.setObjectName("scrollAreaWidgetContents_3") self.label_2 = QtWidgets.QLabel(self.scrollAreaWidgetContents_3) self.label_2.setGeometry(QtCore.QRect(10, 10, 111, 20)) font = QtGui.QFont() font.setPointSize(11) self.label_2.setFont(font) self.label_2.setObjectName("label_2") self.label_3 = QtWidgets.QLabel(self.scrollAreaWidgetContents_3) self.label_3.setGeometry(QtCore.QRect(10, 40, 321, 81)) self.label_3.setObjectName("label_3") self.scrollArea_3.setWidget(self.scrollAreaWidgetContents_3) self.scrollArea_4 = QtWidgets.QScrollArea(self.centralwidget) self.scrollArea_4.setGeometry(QtCore.QRect(1040, 510, 161, 131)) self.scrollArea_4.setWidgetResizable(True) self.scrollArea_4.setObjectName("scrollArea_4") self.scrollAreaWidgetContents_4 = QtWidgets.QWidget() self.scrollAreaWidgetContents_4.setGeometry(QtCore.QRect(0, 0, 159, 129)) self.scrollAreaWidgetContents_4.setObjectName("scrollAreaWidgetContents_4") self.pushButton_2 = QtWidgets.QPushButton(self.scrollAreaWidgetContents_4) self.pushButton_2.setGeometry(QtCore.QRect(20, 50, 121, 31)) self.pushButton_2.setObjectName("pushButton_2") self.pushButton = QtWidgets.QPushButton(self.scrollAreaWidgetContents_4) self.pushButton.setGeometry(QtCore.QRect(20, 90, 121, 31)) self.pushButton.setObjectName("pushButton") self.label_4 = QtWidgets.QLabel(self.scrollAreaWidgetContents_4) self.label_4.setGeometry(QtCore.QRect(10, 10, 111, 20)) font = QtGui.QFont() font.setPointSize(11) self.label_4.setFont(font) self.label_4.setObjectName("label_4") self.scrollArea_4.setWidget(self.scrollAreaWidgetContents_4) MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) self.pushButton.clicked.connect(self.__openimage) # 设置点击事件 self.pushButton.setStyleSheet('''QPushButton{background:#222225;border-radius:5px;}QPushButton:hover{background:#2B2B2B;}''') self.pushButton_2.clicked.connect(self.__writeFiles) # 设置点击事件 self.pushButton_2.setStyleSheet('''QPushButton{background:#222225;border-radius:5px;}QPushButton:hover{background:#2B2B2B;}''') self.retranslateUi(MainWindow) self.close_widget = QtWidgets.QWidget(self.centralwidget) self.close_widget.setGeometry(QtCore.QRect(1130, 0, 90, 50)) self.close_widget.setObjectName("close_widget") self.close_layout = QGridLayout() # 创建左侧部件的网格布局层 self.close_widget.setLayout(self.close_layout) # 设置左侧部件布局为网格 self.left_close = QPushButton("") # 关闭按钮 self.left_close.clicked.connect(self.close) self.left_visit = QPushButton("") # 空白按钮 self.left_visit.clicked.connect(MainWindow.big) self.left_mini = QPushButton("") # 最小化按钮 self.left_mini.clicked.connect(MainWindow.mini) self.close_layout.addWidget(self.left_mini, 0, 0, 1, 1) self.close_layout.addWidget(self.left_close, 0, 2, 1, 1) self.close_layout.addWidget(self.left_visit, 0, 1, 1, 1) self.left_close.setFixedSize(15, 15) # 设置关闭按钮的大小 self.left_visit.setFixedSize(15, 15) # 设置按钮大小 self.left_mini.setFixedSize(15, 15) # 设置最小化按钮大小 self.left_close.setStyleSheet( '''QPushButton{background:#F76677;border-radius:5px;}QPushButton:hover{background:red;}''') self.left_visit.setStyleSheet( '''QPushButton{background:#F7D674;border-radius:5px;}QPushButton:hover{background:yellow;}''') self.left_mini.setStyleSheet( '''QPushButton{background:#6DDF6D;border-radius:5px;}QPushButton:hover{background:green;}''') QtCore.QMetaObject.connectSlotsByName(MainWindow) self.ProjectPath = os.getcwd() # 获取当前工程文件位置 self.scrollAreaWidgetContents.setStyleSheet(sc) self.scrollAreaWidgetContents_3.setStyleSheet(sc) self.scrollAreaWidgetContents_4.setStyleSheet(sc) b = ''' color:white; background:#2B2B2B; ''' self.label_0.setStyleSheet(b) self.label_1.setStyleSheet(b) self.label_2.setStyleSheet(b) self.label_3.setStyleSheet(b) MainWindow.setWindowOpacity(0.95) # 设置窗口透明度 MainWindow.setAttribute(Qt.WA_TranslucentBackground) MainWindow.setWindowFlag(Qt.FramelessWindowHint) # 隐藏边框 # author:CSDN-Dragon少年 def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "车牌识别系统")) self.label_0.setText(_translate("MainWindow", "原始图片:")) self.label.setText(_translate("MainWindow", "")) self.label_1.setText(_translate("MainWindow", "识别结果:")) self.label_2.setText(_translate("MainWindow", "车牌区域:")) self.label_3.setText(_translate("MainWindow", "")) self.pushButton.setText(_translate("MainWindow", "打开文件")) self.pushButton_2.setText(_translate("MainWindow", "导出数据")) self.label_4.setText(_translate("MainWindow", "事件:")) self.scrollAreaWidgetContents_1.show()
UI实现效果如下:
2. 车牌识别
接下来我们需要实现两个核心功能,包括获取车牌ROI区域和车牌自动识别功能。
车牌ROI区域提取:
根据读取的车辆图片,预处理进行车牌ROI区域提取,主要通过Opencv的图像处理相关知识点来完成。主要包括对图像去噪、二值化、边缘轮廓提取、矩形区域矫正、蓝绿黄车牌颜色定位识别。核心代码如下:
# author:CSDN-Dragon少年 # 预处理 def pretreatment(self, car_pic): if type(car_pic) == type(""): img = self.__imreadex(car_pic) else: img = car_pic pic_hight, pic_width = img.shape[:2] if pic_width > self.MAX_WIDTH: resize_rate = self.MAX_WIDTH / pic_width img = cv2.resize(img, (self.MAX_WIDTH, int(pic_hight * resize_rate)), interpolation=cv2.INTER_AREA) # 图片分辨率调整 blur = self.cfg["blur"] # 高斯去噪 if blur > 0: img = cv2.GaussianBlur(img, (blur, blur), 0) oldimg = img img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) kernel = np.ones((20, 20), np.uint8) img_opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) # 开运算 img_opening = cv2.addWeighted(img, 1, img_opening, -1, 0); # 与上一次开运算结果融合 # cv2.imshow('img_opening', img_opening) # 找到图像边缘 ret, img_thresh = cv2.threshold(img_opening, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) # 二值化 img_edge = cv2.Canny(img_thresh, 100, 200) # cv2.imshow('img_edge', img_edge) # 使用开运算和闭运算让图像边缘成为一个整体 kernel = np.ones((self.cfg["morphologyr"], self.cfg["morphologyc"]), np.uint8) img_edge1 = cv2.morphologyEx(img_edge, cv2.MORPH_CLOSE, kernel) # 闭运算 img_edge2 = cv2.morphologyEx(img_edge1, cv2.MORPH_OPEN, kernel) # 开运算 # cv2.imshow('img_edge2', img_edge2) # cv2.imwrite('./edge2.png', img_edge2) # 查找图像边缘整体形成的矩形区域,可能有很多,车牌就在其中一个矩形区域中 image, contours, hierarchy = cv2.findContours(img_edge2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) contours = [cnt for cnt in contours if cv2.contourArea(cnt) > self.Min_Area] # 逐个排除不是车牌的矩形区域 car_contours = [] for cnt in contours: # 框选 生成最小外接矩形 返回值(中心(x,y), (宽,高), 旋转角度) rect = cv2.minAreaRect(cnt) # print('宽高:',rect[1]) area_width, area_height = rect[1] # 选择宽大于高的区域 if area_width < area_height: area_width, area_height = area_height, area_width wh_ratio = area_width / area_height # print('宽高比:',wh_ratio) # 要求矩形区域长宽比在2到5.5之间,2到5.5是车牌的长宽比,其余的矩形排除 if wh_ratio > 2 and wh_ratio < 5.5: car_contours.append(rect) box = cv2.boxPoints(rect) box = np.int0(box) # 矩形区域可能是倾斜的矩形,需要矫正,以便使用颜色定位 card_imgs = [] for rect in car_contours: if rect[2] > -1 and rect[2] < 1: # 创造角度,使得左、高、右、低拿到正确的值 angle = 1 else: angle = rect[2] rect = (rect[0], (rect[1][0] + 5, rect[1][1] + 5), angle) # 扩大范围,避免车牌边缘被排除 box = cv2.boxPoints(rect) heigth_point = right_point = [0, 0] left_point = low_point = [pic_width, pic_hight] for point in box: if left_point[0] > point[0]: left_point = point if low_point[1] > point[1]: low_point = point if heigth_point[1] < point[1]: heigth_point = point if right_point[0] < point[0]: right_point = point if left_point[1] <= right_point[1]: # 正角度 new_right_point = [right_point[0], heigth_point[1]] pts2 = np.float32([left_point, heigth_point, new_right_point]) # 字符只是高度需要改变 pts1 = np.float32([left_point, heigth_point, right_point]) M = cv2.getAffineTransform(pts1, pts2) dst = cv2.warpAffine(oldimg, M, (pic_width, pic_hight)) self.__point_limit(new_right_point) self.__point_limit(heigth_point) self.__point_limit(left_point) card_img = dst[int(left_point[1]):int(heigth_point[1]), int(left_point[0]):int(new_right_point[0])] card_imgs.append(card_img) elif left_point[1] > right_point[1]: # 负角度 new_left_point = [left_point[0], heigth_point[1]] pts2 = np.float32([new_left_point, heigth_point, right_point]) # 字符只是高度需要改变 pts1 = np.float32([left_point, heigth_point, right_point]) M = cv2.getAffineTransform(pts1, pts2) dst = cv2.warpAffine(oldimg, M, (pic_width, pic_hight)) self.__point_limit(right_point) self.__point_limit(heigth_point) self.__point_limit(new_left_point) card_img = dst[int(right_point[1]):int(heigth_point[1]), int(new_left_point[0]):int(right_point[0])] card_imgs.append(card_img) #使用颜色定位,排除不是车牌的矩形,目前只识别蓝、绿、黄车牌 colors = [] for card_index, card_img in enumerate(card_imgs): green = yellow = blue = black = white = 0 try: # 有转换失败的可能,原因来自于上面矫正矩形出错 card_img_hsv = cv2.cvtColor(card_img, cv2.COLOR_BGR2HSV) except: print('BGR转HSV失败') card_imgs = colors = None return card_imgs, colors if card_img_hsv is None: continue row_num, col_num = card_img_hsv.shape[:2] card_img_count = row_num * col_num # 确定车牌颜色 for i in range(row_num): for j in range(col_num): H = card_img_hsv.item(i, j, 0) S = card_img_hsv.item(i, j, 1) V = card_img_hsv.item(i, j, 2) if 11 < H <= 34 and S > 34: # 图片分辨率调整 yellow += 1 elif 35 < H <= 99 and S > 34: # 图片分辨率调整 green += 1 elif 99 < H <= 124 and S > 34: # 图片分辨率调整 blue += 1 if 0 < H < 180 and 0 < S < 255 and 0 < V < 46: black += 1 elif 0 < H < 180 and 0 < S < 43 and 221 < V < 225: white += 1 color = "no" # print('黄:{:<6}绿:{:<6}蓝:{:<6}'.format(yellow,green,blue)) limit1 = limit2 = 0 if yellow * 2 >= card_img_count: color = "yellow" limit1 = 11 limit2 = 34 # 有的图片有色偏偏绿 elif green * 2 >= card_img_count: color = "green" limit1 = 35 limit2 = 99 elif blue * 2 >= card_img_count: color = "blue" limit1 = 100 limit2 = 124 # 有的图片有色偏偏紫 elif black + white >= card_img_count * 0.7: color = "bw" # print(color) colors.append(color) # print(blue, green, yellow, black, white, card_img_count) if limit1 == 0: continue # 根据车牌颜色再定位,缩小边缘非车牌边界 xl, xr, yh, yl = self.accurate_place(card_img_hsv, limit1, limit2, color) if yl == yh and xl == xr: continue need_accurate = False if yl >= yh: yl = 0 yh = row_num need_accurate = True if xl >= xr: xl = 0 xr = col_num need_accurate = True card_imgs[card_index] = card_img[yl:yh, xl:xr] \ if color != "green" or yl < (yh - yl) // 4 else card_img[yl - (yh - yl) // 4:yh, xl:xr] if need_accurate: # 可能x或y方向未缩小,需要再试一次 card_img = card_imgs[card_index] card_img_hsv = cv2.cvtColor(card_img, cv2.COLOR_BGR2HSV) xl, xr, yh, yl = self.accurate_place(card_img_hsv, limit1, limit2, color) if yl == yh and xl == xr: continue if yl >= yh: yl = 0 yh = row_num if xl >= xr: xl = 0 xr = col_num card_imgs[card_index] = card_img[yl:yh, xl:xr] \ if color != "green" or yl < (yh - yl) // 4 else card_img[yl - (yh - yl) // 4:yh, xl:xr] # cv2.imshow("result", card_imgs[0]) # cv2.imwrite('1.jpg', card_imgs[0]) # print('颜色识别结果:' + colors[0]) return card_imgs, colors
至此我们就可以输出车牌ROI区域和车牌颜色了,效果如下:
车牌自动识别:车牌识别博主自己写了一个基于Opencv和SVM的识别系统,由于代码篇幅较长,本篇不进行展示(感兴趣的可以私信博主获取源码)。本篇介绍调用百度AI提供的车牌识别接口 – 百度AI开放平台链接,识别效果也非常不错。
这里面我们可以创建一个车牌识别的应用,其中的API Key及Secret Key后面我们调用车牌识别检测接口时会用到。
我们可以看到官方提供的帮助文档,介绍了如何调用请求URL数据格式,向API服务地址使用POST发送请求,必须在URL中带上参数access_token,可通过后台的API Key和Secret Key生成。这里面的API Key和Secret Key就是我们上面提到的。
接下来我们看看调用车牌识别接口代码示例。
那我们如何获取识别的车牌号码呢?API文档可以看到里面有个words_result字典 ,其中的color代表车牌颜色 ,number代表车牌号码 。这样我就可以知道识别的车牌颜色和车牌号了。
车牌识别的接口调用流程基本已经清楚了,下面就可以进行代码实现了。# author:CSDN-Dragon少年 def get_token(self): host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + self.client_id + '&client_secret=' + self.client_secret response = requests.get(host) if response: token_info = response.json() token_key = token_info['access_token'] return token_key # author:CSDN-Dragon少年 def get_license_plate(self, car_pic): result = {} card_imgs, colors = self.pretreatment(car_pic) request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/license_plate" # 二进制方式打开图片文件 f = open(car_pic, 'rb') img = base64.b64encode(f.read()) params = {"image": img} access_token = self.get_token() request_url = request_url + "?access_token=" + access_token headers = {'content-type': 'application/x-www-form-urlencoded'} response = requests.post(request_url, data=params, headers=headers) if response: print(response.json()) license_result = response.json()['words_result']['number'] card_color = response.json()['words_result']['color'] if license_result != []: result['InputTime'] = time.strftime("%Y-%m-%d %H:%M:%S") result['Type'] = self.cardtype[card_color] result['Picture'] = card_imgs[0] result['Number'] = ''.join(license_result[:2]) + '·' + ''.join(license_result[2:]) try: result['From'] = ''.join(self.Prefecture[license_result[0]][license_result[1]]) except: result['From'] = '未知' return result else: return None
这样我们就可以拿到车牌颜色和车牌号码了,效果如下:
3. 车牌信息显示存储
3.1 车牌信息显示:
# author:CSDN-Dragon少年 def __show(self, result, FileName): # 显示表格 self.RowLength = self.RowLength + 1 if self.RowLength > 18: self.tableWidget.setColumnWidth(5, 157) self.tableWidget.setRowCount(self.RowLength) self.tableWidget.setItem(self.RowLength - 1, 0, QTableWidgetItem(FileName)) self.tableWidget.setItem(self.RowLength - 1, 1, QTableWidgetItem(result['InputTime'])) self.tableWidget.setItem(self.RowLength - 1, 2, QTableWidgetItem(result['Number'])) self.tableWidget.setItem(self.RowLength - 1, 3, QTableWidgetItem(result['Type'])) if result['Type'] == '蓝色牌照': self.tableWidget.item(self.RowLength - 1, 3).setBackground(QBrush(QColor(3, 128, 255))) elif result['Type'] == '绿色牌照': self.tableWidget.item(self.RowLength - 1, 3).setBackground(QBrush(QColor(98, 198, 148))) elif result['Type'] == '黄色牌照': self.tableWidget.item(self.RowLength - 1, 3).setBackground(QBrush(QColor(242, 202, 9))) self.tableWidget.setItem(self.RowLength - 1, 4, QTableWidgetItem(result['From'])) self.tableWidget.item(self.RowLength - 1, 4).setBackground(QBrush(QColor(255, 255, 255))) # 显示识别到的车牌位置 size = (int(self.label_3.width()), int(self.label_3.height())) shrink = cv2.resize(result['Picture'], size, interpolation=cv2.INTER_AREA) shrink = cv2.cvtColor(shrink, cv2.COLOR_BGR2RGB) self.QtImg = QtGui.QImage(shrink[:], shrink.shape[1], shrink.shape[0], shrink.shape[1] * 3, QtGui.QImage.Format_RGB888) self.label_3.setPixmap(QtGui.QPixmap.fromImage(self.QtImg))
效果如下:
3.2 信息导出存储:
# author:CSDN-Dragon少年 def __writexls(self, DATA, path): wb = xlwt.Workbook(); ws = wb.add_sheet('Data'); # DATA.insert(0, ['文件名称','录入时间', '车牌号码', '车牌类型', '车牌信息']) for i, Data in enumerate(DATA): for j, data in enumerate(Data): ws.write(i, j, data) wb.save(path) QMessageBox.information(None, "成功", "数据已保存!", QMessageBox.Yes) def __writecsv(self, DATA, path): f = open(path, 'w') # DATA.insert(0, ['文件名称','录入时间', '车牌号码', '车牌类型', '车牌信息']) for data in DATA: f.write((',').join(data) + '\n') f.close() QMessageBox.information(None, "成功", "数据已保存!", QMessageBox.Yes) def __writeFiles(self): path, filetype = QFileDialog.getSaveFileName(None, "另存为", self.ProjectPath, "Excel 工作簿(*.xls);;CSV (逗号分隔)(*.csv)") if path == "": # 未选择 return if filetype == 'Excel 工作簿(*.xls)': self.__writexls(self.Data, path) elif filetype == 'CSV (逗号分隔)(*.csv)': self.__writecsv(self.Data, path)
效果如下:
导出车牌信息数据如下:
至此,整个车牌自动识别系统就完成了~今天我们就到这里,明天继续努力!
源码及数据已上传,关注文末公众号回复【源码】即可获取完整源码Python往期精彩:
-
-
非常好验证码自动识别代码-C# OCR光学识别数字识别率达100
2011-12-03 19:56:35可用的验证码自动识别 非常好验证码自动识别代码-C# OCR光学识别数字识别率达100 自动识别邮政快递EMS验证码 自动识别顺风快递验证码 -
Python 自动化办公之自动识别并点击按钮
2021-11-10 16:23:37Python 自动化办公之自动识别并点击按钮前言过程使用pyautogui自动点击按钮使用OpenCV和pyscreeze加速 前言 遇到一个需要电脑的体力劳动,找到了Python控制鼠标的库,结合之前用过的OpenCV识别可以屏幕内容,可以...Python 自动化办公之自动识别并点击按钮
前言
遇到一个需要电脑的体力劳动,找到了Python控制鼠标的库,结合之前用过的OpenCV识别可以屏幕内容,可以实现略微复杂的自动化办公操作。
过程
安装用到的库
库 安装方法 作用 pillow pip install pillow
加载图片 pyscreeze pip install pyscreeze
截屏 pyautogui pip install pyautogui
代码操作鼠标键盘 opencv-python pip install opencv-python
识别并匹配图片 使用pyautogui自动点击按钮
检查屏幕上是否有某个按钮,有的话就点击
from time import sleep import pyautogui from PIL import ImageGrab, Image #事先对按钮截图 zhengnengliangImg= Image.open("zhengnengliang.png") #截图当前屏幕并找到之前加载的按钮截图 msg = pyautogui.locateOnScreen(zhengnengliangImg, grayscale=True,confidence=.9) if msg==None: print ("没找到") else: x,y,width,height=msg print ("该图标在屏幕中的位置是:X={},Y={},宽{}像素,高{}像素".format(x,y,width,height)) #左键点击屏幕上的这个位置 pyautogui.click(x,y,button='left')
使用OpenCV和pyscreeze加速
写好上面的程序发现了一个问题,就是使用
pyautogui.locateOnScreen
速度太慢了,不如用之前玩过的OpenCV识别图片,所以略微修改程序,同样,为了加速截图速度使用pyscreeze
截图。这样识别位置操作差不多快了10倍左右from time import sleep import pyautogui from PIL import ImageGrab, Image import pyscreeze import cv2 # 屏幕缩放系数 mac缩放是2 windows一般是1 screenScale=1 #事先读取按钮截图 target= cv2.imread(r"zhengnengliang.png",cv2.IMREAD_GRAYSCALE) # 先截图 screenshot=pyscreeze.screenshot('my_screenshot.png') # 读取图片 灰色会快 temp = cv2.imread(r'my_screenshot.png',cv2.IMREAD_GRAYSCALE) theight, twidth = target.shape[:2] tempheight, tempwidth = temp.shape[:2] print("目标图宽高:"+str(twidth)+"-"+str(theight)) print("模板图宽高:"+str(tempwidth)+"-"+str(tempheight)) # 先缩放屏幕截图 INTER_LINEAR INTER_AREA scaleTemp=cv2.resize(temp, (int(tempwidth / screenScale), int(tempheight / screenScale))) stempheight, stempwidth = scaleTemp.shape[:2] print("缩放后模板图宽高:"+str(stempwidth)+"-"+str(stempheight)) # 匹配图片 res = cv2.matchTemplate(scaleTemp, target, cv2.TM_CCOEFF_NORMED) mn_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) if(max_val>=0.9): # 计算出中心点 top_left = max_loc bottom_right = (top_left[0] + twidth, top_left[1] + theight) tagHalfW=int(twidth/2) tagHalfH=int(theight/2) tagCenterX=top_left[0]+tagHalfW tagCenterY=top_left[1]+tagHalfH #左键点击屏幕上的这个位置 pyautogui.click(tagCenterX,tagCenterY,button='left') else: print ("没找到")
这个速度就比较满意了
参考
-
自动识别USB设备转换的串口号
2011-10-18 14:18:33系统自动识别USB转换的虚拟串口,使用于USBKEY,USB转串口线。 自动获取端口号。 10分的资源分只是希望有需要的人士下载。 -
中文地址识别api的使用测试,快递地址自动补全,自动识别省市区,地址清洗,到底哪个好用?
2020-05-03 18:55:48关于地址解析中文地址识别api接口的文章,看这一篇应该够了. 最近有个项目中要做到自动填写省市区电话姓名的效果. 以往填写地址都是手动选择 先上下拉动选择...市面上已经有这样的app可以实现地址自动识别.就是从...关于地址解析中文地址识别api接口的文章,看这一篇应该够了.
补充关于 小程序智能识别快递收货地址,自动解析出省市区等信息,让地址标准化格式的实现(使用腾讯云api) 代码分享查看连接
最近有个项目中要做到自动填写省市区电话姓名的效果.
以往填写地址都是手动选择 先上下拉动选择河北省--->再通过上下拉动选择沧州市--->再通过下拉选中东光县--->切换到姓名输入框输入姓名--->切换到电话输入框输入电话-----等等这一系列的操作.
市面上已经有这样的app可以实现地址自动识别.就是从微信或者从其他地方复制过来一个地址(格式可能是错乱的),粘贴到输入框就可以自动填写省市区电话邮编姓名等.会去掉一些没有用的信息之类的.
比如:顺丰在线下单app(虽然识别烂的很)
仔细研究了一下,实现这个功能的方法可以是正则也可以是机器算法之类的.写了几篇演草纸后,决定放弃造轮子,于是翻遍全网,搜到了如下几个 伸手党拿来主义的方案,下面我们来对比一下接入上手难易度,跳一下坑,再爬出来告诉你们,对比下识别效率,羊毛量,优缺点之类的各方面.
都有哪些?
先给伸手党一个我的评测(排名不按优良先后):
天行
百度
快递100内两款中的快递100官方的
快递100内两款中的绿图标的
smartParsePro
快宝
腾讯云内两款中的绿图标的
腾讯云内两款中的蓝图标的
京东万象-地址清洗(太贵直接放弃)
菜鸟物流云(一年前折腾一个月没给处理,一年后我也不想提了)
第4和第7个实际上是同一个.就是在不同的平台
名称 上手难易度 是否免费 免费每天用量 支持多条 反馈速度 功能性 识别准确 推荐指数 天行 一般 总免费5000次 15 否 一般 5 5 3 百度 一般 不免费 无 否 一般 5 8 3 快递100官方 简单 不免费 无 否 一般 5 5 3 快递100绿图标 简单 不免费 无 否 快 8 10 9 smartParsePro 复杂 免费 无限 否 快 3 1 6 快宝 一般 不免费 1000 是 一般 5 3 6 腾讯云绿图标 简单 不免费 无 否 快 8 10 10 腾讯云蓝图标 简单 不免费 无 否 一般 8 10 8 但是腾讯云的secret跟其他所有的我测试这些云api一样,我没找到更换的地方.虽然更新不会频繁,可能以后官方会出重置功能吧.总的来说就是上面这样了.我更推荐绿图标那个,速度,识别准确度,地区编码,邮编,也带清洗,都不错,价格也是这些当中除了开源项目最优方案,具体选快递100平台还是腾讯云平台看个人了.我觉得还是大厂稳定性应该没问题,所以腾讯吧.
下面逐一进行测试:
天行api:
我进来以后一看,升级高级会员?那就一定是一个收费的了.不管了.看看能不能测试一下先.
果不其然,就知道不花钱也许用不了.那就申请下试试
要经过验证邮件,然后申请接口.验证了邮件以后不知道以后会有啥问题.也许只是为了安全.
赠送的5000次,你要每天只能用15次的用完...不过申请倒是没有人工审核之类的,直接秒过,可以直接测试
识别后的json如下
{ "code": 200, "msg": "success", "newslist": [ { "mobile": "13800138000", "name": "马云", "province": "浙江省", "city": "杭州市", "district": "滨江区", "postcode": "310052", "detail": "浙江省杭州市滨江区网商路699号" } ] }
以上是他的默认测试内容,
但是通常我们的顾客给的地址是本土化的地址,就是说只告诉你一个区就好了然后是详细地址门牌号之类的.两个人聊天时候或者是在物流发货之类的,不可能傻子一样的跟一个本地人,报一个本地地址还告诉别人咱们是那个省,哪个市,所以,解决需求才是我们要做的.还有,有的时候人们习惯把电话和地址之类的不管前后的直接说出来不会根据格式写的.这就是人,自由度高.
给他加点难度,信息混排,缺省能否补全?:东光县科技园南路444号马晓姐13243214321
结果,识别的一塌糊涂
{ "code": 200, "msg": "success", "newslist": [ { "mobile": "13243214321", "name": null, "province": null, "city": null, "district": null, "postcode": null, "detail": "东光县科技园南路444号马晓姐" } ] }
Pass,不用接入了,继续寻找下一个
如果你好奇,可以注册试试:
https://www.tianapi.com/signup.html
坑:
注册页面随便写了个昵称提示注册过了,然后改了昵称再点注册,验证码就不能刷新了...但是那都是小事儿,刷新一下重新填写就好.
地址混排不支持
注册送的5000一次15个不如不送.
百度api
有一篇网友写的正反解析地址的文章,虽然都是代码,大家可以先看一下,但如果你不只是要通过读别人代码的方式来学习的话,我建议就不用看了.不如直接看官方实例
使用步骤,也是要登陆注册百度账号(大多数人应该都有的)
然后创建应用
当然你不创建应用也是可以直接测试一下效果的:
这里还是使用难倒天行api的那个地址测试:
哦,又是失败的例子.百度???智能汽车???中国最大搜索引擎???
此时的我真的是一脸黑人问号
Pass,不好用,不用接入了
快递100
我以前查快递都是用快递100,因为那时候申通圆通之类的官网查询地址还需要验证码太麻烦,所以直接快递100查询.
搜到这个页面的时候,我还是觉得有希望了的,毕竟好像在快递行业摸爬滚打了很久的样子,应该可靠(也许不可靠,百度都让我大跌眼镜了......)
进来看了下,他做了个云平台,里面是有他自己的业务也有别人的.在电子商务的api下面找到了俩好像可以用的
what? 一快钱100次? 多钱?
1/100=0.01,哦不算贵,一天我的一个客户订单两百单才2块钱.100个客户...好吧,先不想价格了,也许用钱的就稳定呢,就好用呢,不像前两个那么坑呢...
看了产品详情
就一句话介绍我也是醉了.有没有测试页面?有,仍然需要注册......
注册什么的,我很讨厌的,可是 竟然测试的时候要收费...1块钱...100次 反正一快钱也发不了家,也不会让我倾家荡产来吧.开始测试吧.
解析的仍然是一塌糊涂.一快钱废了...
反正md一快钱都花了,又把另外一个买了一下
哎?这个貌似行!
本来到这里,我应该进行下一项直接到项目和代码中接入了.但是上瘾了,既然要做一个入坑记录文章,那就把所有的都给大家踩一遍吧.这个暂时先做备用
看了一下产品描述觉得还行,就是我想要的功能,你们要看点一下,这是连接
进入下一个
smartParsePro
这是一个开源的项目,介绍是地址智能识别Pro(支持vue、小程序)/省市区街道四级联动(支持省市区街道/电话/邮编/姓名/身份证号识别)
同样我也给他出了那道题东光县科技园南路444号马晓姐13243214321
人名呢??????
省市区是自动给补上了,人名没了.马晓姐就不是人吗...Pass还是不能用
如果对完全开源感兴趣的,可以点此连接查看,有网友发的博文
快宝
也是一样,要注册,公司名字随便写,当然 别人也可以随便写,写完了你就用不了....
服务市场内,有地址清洗和智能解析,每天免费1000次,对一般小卖家是应该够用了吧,规模app是不可能够的了.
优点:
免费1000次每天
多行地址可以\r\n换行一起识别(不知道按照一条计费还是多条计费)
缺点:
没有测试接口的便捷地址,对接代码导入后还不能直接用,花了半小时弄好后,效果还不行.坑指数满分五颗星我给他6颗
代码粘进来后就是这样的
我知道我是采坑的,但是踩上了雷我也要把雷拆了.并且得测试一下效果如何
喏,得到的结果就是这样的,收件人姓名呢?没提取出来,是不是它不认识马晓姐,认识马小姐?测试一下.also不行~~~
所以我怀疑是不是拿了smartParsePro的代码出来卖
关于他上面宣传的可以用图片识别的方式来操作,我个人认为,应该用图片识别就行了.因为图片里面有空格之类的,虽然业务场景中有很多人输入的微信发过来的地址是没空格或者格式混排的他识别不行,但是如果业务量不大,接受人名识别可能会有问题的,可以试试.但是我个人总结一下:
过程复杂,没有测试页面,识别结果也不行,Pass,下一个
腾讯云市场Api
在百度搜索地址识别api发现
好奇进来看看,发现根本没有这个api,但是我印象中腾讯云市场,阿里云市场,都有很多api可以使用,虽然收费但是可靠性比较好,于是,搜腾讯云市场,找到以下两个接口.
嗯?第一个在快递100中看到过,效果挺不错,看看第二个
还是要注册??哦不发现可以微信扫一扫进入.
第二个的介绍说:
传入国内收货地址任意混排文本,接口将自动分词、智能匹配国内行政区,自动识别区分出省、市、区、街道、姓名、手机号等,方便用户将复制的文本内容一键填写到收货订单表单中,提高用户体验,缩短用户下单时间。
看起来不错.看了一下示例代码,也挺全面
基本的东西都提示了 代码粘贴进来基本不用改,改了secretid和secretkey,发现代码还是有md5签名校验的地方不通的,简单修改后可以了.测试发现...需要订购...
好,订购,5块钱1000次够我测试了.但是没有免费次数
识别后的结果这样:
{"code":0,"message":"成功","result":{"street":"科技园南路444号","full_name":"马晓姐","telephone":"13243214321","mobile":"13243214321","province":"河北省","city":"沧州市","area":"东光县"}}
行,也是可以用的.识别也不错.
用此代码改了请求url,也能请求那个绿色的1块钱1000次那个.
那个绿色图片的跟这个识别的都可以.就进行一个更深入的测试吧,对比两者.
发现价格差不多,速度上,100次连续请求,绿色的用时9秒多,蓝色图标的,用时24秒.既然这绿色的表现不错,最后决定用这个绿色的不折腾了.也没有在google和baidu上查到更多的地址识别api,价钱可以接受的情况下,就不享用免费的午餐了.
我本以为阿里云市场作为国内的api综合市场领头羊,能有一个比前面更好的api(其实已经满足需求了现在)但是阿里云市场内:并,没,有,.....
前几天,有网友留言说:
京东万象-地址清洗:
我认为,如果是你们看到这个价格,也不会购买使用的.我不管他识别的多准,这个价格...识别一次,一根烟,识别20次,一盒中华没了???
高德API接口(地理/逆地理编码) :
显然跟我们所需要的使用场景是不一样的.完全两码事,pass
菜鸟物流云-地址纠正服务:
我之所以之前就申请了但是没把他拿出来说,是因为,短期内接入成功的可能性很低.
我19年2月就申请过了,但是想使用这个,还是非常不容易的,首先你要追着小二屁股后面跑个一两个月,然后你还不一定能通过审核,然后,菜鸟的应用是需要发布上线的,
看这状态都是申请中和编辑中的,申请后要联系钉钉,钉钉没人回复要发工单,发工单后要再加另外的人的钉钉,再等回复之类的.
我印象中,当时是要先申请应用,再订阅内容,只能订阅10个,多了不行少了也不行,然后还有绑定资源之类的好多参数和设置,最后也是都没给处理.聊天记录和工单我就不发截图了.影响也不好.我之前其他的技术文章就吐槽过阿里的小二...
所以,我个人选择pass,你们如果要折腾,真的能成功了,我佩服
补充:
2020年05月20日12:16:39:
腾讯云的secret信息如果需要重置,联系商家或者工单即可,前两天重置过了分享给大家.
-
自动识别语音生成字幕
2020-10-27 18:23:30录音文件识别产品已上线音视频领域模型 了解更多 导航锚点 产品子功能 实时语音识别对不限时长的实时音频流进行识别 识别结果自动断句 标记每句话的开始和结束时间可应用于智能语音助手 法庭庭审记录等实时音频流... -
自动识别图片验证码登录
2019-03-05 14:48:39自动识别图片验证码登录 目标:从需要会有登录的网站抓取数据。 场景:A网站需要会员登录才能查阅信息,A网站采用了AntiForgery防止XSRF攻击。 创建windows应用,采用webBrowser模拟加载页面,识别验证码然后登录。 ... -
教你如何使用pr语音自动生成字幕,pr自动识别声音添加字幕
2022-03-10 17:34:32pr自动语音识别字幕教程,教你如何使用pr语音自动生成字幕 -
验证码机制之验证码自动识别
2020-11-02 16:15:23验证码自动识别就是指通过自动化的技术对图片验证码中的字符或公式等内容进行还原,从而突破验证码的安全限制。 危害 突破验证码的安全限制,使验证码功能失效 原理 一般对于图片验证码的识别流程为:图像二值化... -
自动识别技术的分类
2020-03-02 21:09:53自动识别技术是应用一定的识别装置,通过被识别物品和识别装置之间的接近活动,自动地获取被识别物品的相关信息,并提供给后台的计算机处理系统来完成相关后续处理的一种技术。 按照应用领域和具体特征,自动识别... -
android身份证自动识别
2017-10-17 10:14:10android身份证自动识别 -
Capo可自动识别音乐生成乐谱
2021-07-27 03:10:24Capo可以让用户对其iTunes媒体库中的所有音乐进行“逆向扫描”,自动生成歌曲的指法谱。此外,对于比较难弹的曲子还可以在不影响其音调的同时放慢音速,以便添加有用的标记。 说实话,这款应用不够完美,Capo并不... -
c#图片文字-字母-数字自动识别-深入代码-非常好
2011-12-03 20:54:12c#图片文字-字母-数字自动识别-深入代码-非常好 -
java车牌识别系统 自动识别车牌系统的工作原理
2021-02-12 23:10:20基于java程序车牌识别系统的成了现在停车管理的主流,那么自动识别车牌系统的工作原理是什么呢?南天瑞丰分享给大家。java车牌识别系统javaCV图像处理是一款开源的图像处理程序,它可以实现以下功能1、车牌检测(支持... -
根据字幕自动配音的软件 如何自动识别语音识别语音生成字幕
2020-10-27 17:51:34那么今天,小编就给大家整理了一些关于根据字幕自动配音的软件以及自动生成字幕的软件。这样,我们的工作量就会大大减少啦!感兴趣的小伙伴们快来一起看看吧!相信很多的制作视频的小伙伴,像是UP主或者是自媒体人更... -
python openCv实现批量图像自动识别裁剪区域进行裁剪保存
2022-04-01 18:26:37# -*- coding: utf-8 -*- import cv2 import numpy as np import copy import cv2 as cv import os def read_path(file_pathname): # 遍历该目录下的所有图片文件 for filename in os.listdir(file_pathname): ... -
Python 自动识别图片文字—OCR实战教程
2021-06-11 00:48:07OCR 是光学字符识别(英语:Optical Character Recognition,OCR)是指对文本资料的图像文件进行分析识别处理,获取文字及版面信息的过程。很早之前就有同学在公众... -
基于RFID自动识别技术的智能试卷管理系统
2022-04-20 11:55:36RFID技术的智能试卷管理系统,采用先进的RFID自动识别技术和计算机软件技术,以RFID电子标签为媒介,利用RFID读写设备与后天系统结合,极大的提高了试卷管理的工作效率。 -
自动识别地址省市区、手机号、姓名,淘宝的地址自动识别
2019-09-28 22:09:55类似淘宝的地址自动识别,研究了一个下午加一个上午,换了好多种算法。 手机号这个不难,将字符串用特定的符号分割,如:英文逗号、中文逗号、空格分割出来的数组进行字数统计,找到11位字符且可以转换为数字的... -
AIS船舶自动识别系统原理
2020-05-14 13:53:10AIS船舶自动识别系统原理 一、AIS简介: 海上航行中,船舶之间常常需要掌握彼此之间的动、静态消息,避免船舶在航行过程中发生碰撞事故。因此实现船舶的自动识别是海上航行安全、海上交通管理和航海技术发展的重要... -
浏览器自动识别验证码插件
2021-02-24 22:38:24浏览器自动识别验证码插件 今天分享一款chrome浏览器的插件可以自动识别验证码并填充 在chrome商店中搜索autoverify 插件的控制面板 右键对着 验证码识别–> 识别效果图 这个自动识别验证码的插件识别速度还是... -
基于python自动识别字符集模块chardet
2012-04-25 20:54:00chardet 可以很方便的实现字符串/文件的编码检测. -
【word操作】公式自动识别+mathtype自动编号
2020-03-08 22:11:34文章目录自动识别公式mathtype自动编号mathtype插入wordmathtype自动编号编号格式设置下一章节自动编号修改章节顺序自动编号文章中写到公式的地方与公式链接 自动识别公式 推荐一款软件—— mathpix snipping tool ...