opencvocr识别手机摄像头拍摄的指定区域文字,文字符合规则就语音报警

  1. 安装python,pycharm,自行安装。

  2. Python下安装OpenCv
    2.1 打开cmd,先安装opencv-python

pip install opencv-python --user -i https://pypi.tuna.tsinghua.edu.cn/simple

2.2 再安装opencv-contrib-python

pip install opencv-contrib-python --user -i https://pypi.tuna.tsinghua.edu.cn/simple

3.Pycharm安装opencv-python
打开pycharm,然后打开setting,打开python解析器
在这里插入图片描述
点击Go to tool window。下面红框处管理和下载python依赖包
在这里插入图片描述
点击下图的设置,然后点击管理仓库
在这里插入图片描述
新增python包仓库: https://pypi.tuna.tsinghua.edu.cn/simple/
在这里插入图片描述
在这里搜索并下载opencv-python,numpy在这里插入图片描述
下载完成,新建py文件,执行代码。有窗口输出该路径的图片就说明成功了。

import cv2 as cv# 这段代码是测试opencv是否正常安装。运行下面这段代码出现图片就是成功的
src = cv.imread("C:\\Users\Administrator\Desktop\\city1.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
cv.waitKey(0)
cv.destroyAllWindows()
print("hi python")
  1. 下载Tesseract OCR,去官网 https://github.com/UB-Mannheim/tesseract/wiki
    下载exe。安装完成后,需要设置Tesseract-OCR的系统环境。详细看这篇文章
    https://blog.csdn.net/qq_38463737/article/details/109679007

  2. 下载Tesseract OCR的语言包,中文语言包和英文语言包。
    去官网 https://github.com/tesseract-ocr/tessdata 下载eng.traineddata和chi_sim.traineddata
    在这里插入图片描述
    然后把那两个文件放到**/Tesseract-OCR/tessdata
    在这里插入图片描述

  3. pycharm 的python包 安装pytesseract
    在这里插入图片描述

  4. 在项目文件.venv/Lib/site-packages/pytesseract/pytesseract.py 文件中修改变量tesseract_cmd,路径自行修改。 这是为了解决BUG:”tesseract is not installed or it‘s not in your PATH“
    在这里插入图片描述

  5. 安装gTTS 谷歌语音播报,pillow,pyttsx3 离线语音播报。
    在这里插入图片描述

  6. 在手机上下载“IP 摄像头”,并安装。这里我在应用宝里下载了 IP 摄像头。使用该软件,要电脑连接手机热点,同处在局域网内。
    在这里插入图片描述
    10,全部py代码如下

# 本代码参考了https://blog.csdn.net/weixin_35752233/article/details/142606296  , https://blog.csdn.net/m0_58892312/article/details/120923578 和 AI
# 人脸模型库文件“ haarcascade_frontalface_default.xml ”,帮助摄像头获取的画面去对比
# 1. 第二句代码中的admin为我的IP摄像头用户名, admin为我的IP摄像头密码,这个可以在手机APP的设置里查看和修改,代码中的要使用自己的用户名、密码。
# 2. @后面的地址是局域网IP地址,这个在打开IP摄像头服务器之后的界面就能看到,也需要修改为自己的地址。
# 3.代码的其他部分无需修改。
import time
import cv2 as cv
import pytesseract
import numpy as np
import pyttsx3
from gtts import gTTS# 图像的裁剪和缩放是图像预处理的两个基本操作。裁剪主要是根据需要对图像的特定区域进行选取,剔除无效或干扰信息。缩放则是为了满足特定的分辨率或图像尺寸需求,对图像的大小进行调整。
# 裁剪图片
def crop_image(image, x, y, width, height):return image[y:y + height, x:x + width]# 缩放图片
def resize_image(image, width, height):return cv.resize(image, (width, height))# 灰度化.        图像的灰度化和二值化是将图像从彩色转换到灰度图像和黑白图像的过程,这些转换对于提高OCR的准确性和效率至关重要。
def to_grayscale(image):return cv.cvtColor(image, cv.COLOR_BGR2GRAY)# 二值化.
def to_binary(image, threshold=127, maxval=255):return cv.threshold(image, threshold, maxval, cv.THRESH_BINARY)[1]# 噪声去除是图像预处理中非常重要的一步。它通常通过滤波技术实现,可以减少图像中的随机噪声,提高图像质量,有助于后续的文字检测和识别。
def remove_noise(image, kernel_size=3):return cv.medianBlur(image, kernel_size)# 文本行检测                     和字符分割是预处理的高级步骤,它们是为了从图像中准确地分离出单独的字符或文本行,这对于OCR识别至关重要。
def detect_text_lines(image):# 使用Canny边缘检测算法edged = cv.Canny(image, 100, 200)# 找到轮廓contours, _ = cv.findContours(edged, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)return contours# 字符分割
def segment_characters(image, contours):characters = []for contour in contours:x, y, w, h = cv.boundingRect(contour)roi_image = image[y:y + h, x:x + w]characters.append(roi_image)return characters# 识别并截取红色区域
def extract_red_region(image):# 转换为HSV颜色空间hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)# 定义红色的范围lower_red = np.array([0, 120, 70])upper_red = np.array([10, 255, 255])mask1 = cv.inRange(hsv, lower_red, upper_red)lower_red = np.array([170, 120, 70])upper_red = np.array([180, 255, 255])mask2 = cv.inRange(hsv, lower_red, upper_red)# 合并两个掩码mask = mask1 + mask2# 形态学操作kernel = np.ones((5, 5), np.uint8)mask = cv.morphologyEx(mask, cv.MORPH_CLOSE, kernel)mask = cv.morphologyEx(mask, cv.MORPH_OPEN, kernel)return mask# 文字保存为临时mp3文件
def text_to_speech(text, lang='en'):# 创建gTTS对象tts = gTTS(text=text, lang=lang)# 保存为临时文件temp_file = "temp_audio.mp3"tts.save(temp_file)return temp_file# 读取视频信息。 # @前为账号密码,@后为ip地址
cap = cv.VideoCapture("http://admin:admin@192.168.169.143:8081/video")
# cap = cv.VideoCapture(0)
while cap.isOpened():# 读取一帧图片f, image = cap.read()# 保存当前帧为图片文件cv.imwrite('captured_image.jpg', image)print("图片已保存为 captured_image.jpg")time.sleep(0.5)# 项目相对路径下captured_image.jpg,自行修改文件路径picture = cv.imread("D:\\download_software\\python_project\\camera_test\\captured_image.jpg")# 提取红色区域 -> 红色底纹白颜色文字red_mask = extract_red_region(picture)# 查找轮廓contours, _ = cv.findContours(red_mask, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)for contour in contours:x, y, w, h = cv.boundingRect(contour)roi = picture[y:y + h, x:x + w]# ps:没有必要灰度处理和二值化处理,因为红色区域的图像已经很清楚了# # 转换为灰度图像# gray_picture = cv.cvtColor(roi, cv.COLOR_BGR2GRAY)# # 二值化处理# _, binary_picture = cv.threshold(gray_picture, 200, 255, cv.THRESH_BINARY_INV)# 使用Tesseract OCR识别文字text = pytesseract.image_to_string(roi, config='--psm 6',lang="eng")print("OCR识别结果:" + text)cv.imshow("Red Region", roi)# 如果文本包含MAU或者AHU,播放mp3语音进行报警if "MAU" in text or "AHU" in text:# 创建语音引擎engine = pyttsx3.init()# 进行语音播报 指定要播报的文本engine.say(text)# 阻止 没播报完程序就退出engine.runAndWait()# 使用OpenCV的自定义函数进行图像预处理# # 设定裁剪区域的坐标和尺寸# x, y, width, height = 100, 100, 200, 200# cropped_image = crop_image(image, x, y, width, height)## # 设定缩放尺寸# new_width, new_height = 300, 300# resized_image = resize_image(cropped_image, new_width, new_height)# 读取图片并转换为灰度图# gray_picture = cv.cvtColor(picture, cv.COLOR_BGR2GRAY)# 读取图片并进行二值化# _, binary_picture = cv.threshold(gray_picture, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)# 读取图片并去除噪声# noise_free_picture = remove_noise(binary_picture)# 使用Tesseract进行OCR处理     chi_sim | eng# text = pytesseract.image_to_string(noise_free_picture,lang="eng")# 打印OCR结果# print("OCR识别结果:" + text)# cv.imshow("Video Stream", picture)#退出视频识别if cv.waitKey(1) & 0xFF == ord('q'):breakcap.release()
cv.destroyAllWindows()
  1. 运行效果展示。我手机的IP摄像头拍摄正对着wps那块区域,识别出来的红色区域在左上角。因为OCR识别使用我用的是english语言包,所以识别文字内容不太准确,汉字没有识别出来,但是我这里的需求只要识别英文单词就可以了。此时,电脑正在播放识别出来的文字内容。大致需求已经实现了。
    在这里插入图片描述

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

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

相关文章

微信小程序购物车全选反选功能以及合计

微信小程序基于Vant Weapp的购物车功能实现 1、单选 使用微信小程序原生表单组件checkbox和checkbox-group 注意&#xff1a;checkbox原生不支持bind:change事件&#xff0c;checkbox-group支持 <checkbox-group bindchange"handleCheck"><checkbox val…

Linux输入设备应用编程

本章学习输入设备的应用编程&#xff0c;首先要知道什么是输入设备&#xff1f;输入设备其实就是能够产生输入事件的设备就称为输入设备&#xff0c;常见的输入设备包括鼠标、键盘、触摸屏、按钮等等&#xff0c;它们都能够产生输入事件&#xff0c;产生输入数据给计算机系统。…

Unity 利用Button 组件辅助Scroll View 滚动

实现 创建枚举类ScrollDir 以区分滚动方向。每组两个按钮负责同方向上左右/上下滚动。 Update 中实时获取Scroll View 滚动条当前位置。 if (dir.Equals(ScrollDir.vertical)) {posCurrent scroll.verticalNormalizedPosition; } else if (dir.Equals(ScrollDir.horizontal)…

Mac快速安装 chromedriver驱动

全篇大概1200字&#xff08;含代码&#xff09;&#xff0c;建议阅读时间5分钟。 什么是chromedriver&#xff1f; ChromeDriver 充当了 Selenium WebDriver 和 Chrome 浏览器之间的桥梁&#xff0c;允许开发者通过编程控制浏览器进行自动化测试或操作。 一、下载chromedriver…

【网络安全】网站常见安全漏洞 - 网站基本组成及漏洞定义

文章目录 引言1. 一个网站的基本构成2. 一些我们经常听到的安全事件3. 网站攻击者及其意图3.1 网站攻击者的类型3.2 攻击者的意图 4. 漏洞的分类4.1 按来源分类4.2 按危害分类4.3 常见漏洞与OWASP Top 10 引言 在当今的数字化时代&#xff0c;安全问题已成为技术领域不可忽视的…

快速上手 RabbitMQ:使用 Docker 轻松搭建消息队列系统

在现代的分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信、解耦系统组件、提高系统可扩展性和可靠性的重要工具。RabbitMQ 是一个广泛使用的开源消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;&#xf…

字符串函数和内存函数

字符串函数 1、strlcpy 【字符串拷贝】 &#xff08;将原字符串中的字符拷贝到目标字符数组中&#xff0c;包括终止符号\0&#xff0c;并在这里停止&#xff1b;为了避免越界&#xff0c;目标字符串数组应该足够大去接收&#xff09;&#x1f446; &#xff08;返回值是 dest…

【机器学习】窥数据之序,悟算法之道:机器学习的初心与远方

文章目录 机器学习入门&#xff1a;从零开始学习基础与应用前言第一部分&#xff1a;什么是机器学习&#xff1f;1.1 机器学习的定义1.1.1 举个例子&#xff1a;垃圾邮件分类器 1.2 机器学习的核心思想1.2.1 数据驱动的模式提取1.2.2 为什么机器学习比传统方法更灵活&#xff1…

Dataset用load_dataset读图片和对应的caption的一个坑

代码&#xff1a; data_files {} if args.train_data_dir is not None:data_files["train"] os.path.join(args.train_data_dir, "**")dataset load_dataset("imagefolder",data_filesdata_files,cache_dirargs.cache_dir,) 数据&#xff1…

SpringBoot连接多数据源MySQL、SqlServer等(MyBatisPlus测试)

SpringBoot连接多数据源MySQL、SqlServer等&#xff08;MyBatisPlus测试&#xff09; 在实际的项目开发中&#xff0c;我们往往需要同时连接多个数据源对数据进行处理。本文将详细介绍在SpringBoot下配合MybatisPlus如何连接多数据源&#xff0c;实例将会使用连接MySQL、SqlSe…

GPS模块/SATES-ST91Z8LR:电路搭建;直接用电脑的USB转串口进行通讯;模组上报定位数据转换地图识别的坐标手动查询地图位置

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…

认识自定义协议

经过前面的介绍&#xff0c;我们知道TCP/IP协议有一组五层模型&#xff0c;从上往下为应用层、传输层、网络层、数据链路层和物理层&#xff0c;且在网络中传输的数据都必须经过这几层模型的封装和分用&#xff0c;作为程序员&#xff0c;我们最经常打交道的就是应用层。程序员…

【论文复现】隐式神经网络实现低光照图像增强

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 隐式神经网络实现低光照图像增强 引言那么目前低光照图像增强还面临哪些挑战呢&#xff1f; 挑战1. 不可预测的亮度降低和噪声挑战2.度量友好…

电商项目-微服务网关限流

一、微服务网关限流 我们之前说过&#xff0c;网关可以做很多的事情&#xff0c;比如&#xff0c;限流&#xff0c;当我们的系统被频繁的请求 的时候&#xff0c;就有可能将系统压垮&#xff0c;所以为了解决这个问题&#xff0c;需要在每一个微服务中做限流 操作&#xff0c;但…

数据链路层(四)---PPP协议的工作状态

1 PPP链路的初始化 通过前面几章的学习&#xff0c;我们学了了PPP协议帧的格式以及组成&#xff0c;那么对于使用PPP协议的链路是怎么初始化的呢&#xff1f; 当用户拨号上网接入到ISP后&#xff0c;就建立起了一条个人用户到ISP的物理链路。这时&#xff0c;用户向ISP发送一…

模拟机器故障

模拟机器故障情况 #!/bin/bashdeclare -a aryfor i in seq 40 49 doary[$i]" "echo -en "\e[$i;5m ${ary[]}\e[;0m"donedeclare -a ary for s in seq 1 10000 dofor i in seq 40 49doary[$i]" "echo -en "\e[$i;5m ${ary[]}\e[;0m" …

创建的空 OpenCV 安卓应用程序以支持摄像头

在本节中&#xff0c;我们将扩展上一节中创建的空 OpenCV 应用程序以支持摄像头。我们将获取摄像头帧并将其显示在屏幕上。 告诉系统我们需要相机权限。将以下代码添加到文件MyApplication/app/src/main/AndroidManifest.xml&#xff1a; <uses-permission android:name&qu…

JAVA 架构师面试 100套含答案:JVM+spring+ 分布式 + 并发编程》...

今年的行情&#xff0c;让招聘面试变得雪上加霜。已经有不少大厂&#xff0c;如腾讯、字节跳动的招聘名额明显减少&#xff0c;面试门槛却一再拔高&#xff0c;如果不用心准备&#xff0c;很可能就被面试官怼得哑口无言&#xff0c;甚至失去了难得的机会。 现如今&#xff0c;…

Web3与区块链如何通过智能合约实现自动化生态?

Web3和区块链正在重塑互联网的未来&#xff0c;其核心在于去中心化和用户数据自主权。而作为区块链技术的重要组成部分&#xff0c;智能合约通过自动执行预设规则&#xff0c;大大提升了效率和安全性。本文将探讨Web3与区块链如何通过智能合约实现生态的自动化。 什么是智能合约…

【机器学习】机器学习的基本分类-监督学习-随机森林(Random Forest)

随机森林是一种基于集成学习&#xff08;Ensemble Learning&#xff09;思想的算法&#xff0c;由多个决策树构成。它通过结合多棵决策树的预测结果来提升模型的泛化能力和准确性&#xff0c;同时减少过拟合的风险。 1. 随机森林的核心思想 多样性&#xff1a; 随机森林通过引…