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语言包,所以识别文字内容不太准确,汉字没有识别出来,但是我这里的需求只要识别英文单词就可以了。此时,电脑正在播放识别出来的文字内容。大致需求已经实现了。
    在这里插入图片描述

【更新于2024-12-10】本次更新步骤10中的代码。因为步骤10的代码运行一段时间后会卡顿,是while循环把1秒内所拍摄的每一帧画面都进行了处理,导致主进程处理缓慢,后续时间识别的图像帧堆积在主进程的栈中,会导致识别延迟。
本次更新代码结合了队列、fps、线程等概念优化代码。1. 降低fps,在1秒内仅识别几帧图像,降低图像处理次数。 2. 主进程仅识别图像,提取并分割红色区域。开另一个线程进行ocr识别红色区域内的文字。 3. 主进程识别到的红色区域,进入ocr_queue。详细代码如下:

# 本代码参考了https://blog.csdn.net/weixin_35752233/article/details/142606296  , https://blog.csdn.net/m0_58892312/article/details/120923578 和 AI
# 1. 第二句代码中的admin为我的IP摄像头用户名, admin为我的IP摄像头密码,这个可以在手机APP的设置里查看和修改,代码中的要使用自己的用户名、密码。
# 2. @后面的地址是局域网IP地址,这个在打开IP摄像头服务器之后的界面就能看到,也需要修改为自己的地址。
import time
import cv2 as cv
import pytesseract
import numpy as np
import pyttsx3
import keyboard
from queue import Queue
from threading import Thread# 识别并截取红色区域
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# 创建语音引擎
engine = pyttsx3.init()
# 设置发音速率,默认值为200
rate = engine.getProperty('rate')
engine.setProperty('rate', rate - 30)# 创建队列,队列存放每帧识别出来的红色区域
ocr_queue = Queue(maxsize=10)
#停止标志
stop_flag = False# OCR处理线程,处理红色区域
def ocr_thread():global stop_flag,jwhile not stop_flag:# start_time = time.time()if not ocr_queue.empty():roi = ocr_queue.get()# 在线程里面展示不了红色区域的图像 In OpenCV, the cv.imshow() function is not thread-safe,线程不安全# cv.imshow("Red Region in ocr_queue", roi)text = pytesseract.image_to_string(roi, lang="eng")if len(text) > 0:print("OCR识别结果:" + text)if any(keyword in text for keyword in ["MAU", "NAU", "nAU", "AHU","PHF-","PF-"]):# 打印高亮报警信息highlighted_text = "\033[1;31m" + text + "\033[0m"print(highlighted_text)engine.say("M A U机组或A H U机组或排风机报警,请确认。")engine.runAndWait()# end_time = time.time()# processing_time_ms = (end_time - current_time) * 1000# print(f"{processing_time_ms:.2f} milliseconds")  # 花费12毫秒else:print("ocr_queue is empty")time.sleep(0.1)# 启动OCR线程
ocr_thread = Thread(target=ocr_thread)
ocr_thread.start()# 读取视频信息
cap = cv.VideoCapture("http://admin:admin@10.31.51.173:8081/video")# 设置帧率 Frames Per Second
fps = 5
# 帧与帧之间的时间间隔
frame_interval = 1 / fpslast_frame_time = time.time()
i = 0while not stop_flag:current_time = time.time()if current_time - last_frame_time >= frame_interval:i += 1print(i)# 读取一帧图片ret, picture = cap.read()if not ret:break# 将图像顺时针旋转90度rotated_picture = cv.rotate(picture, cv.ROTATE_90_CLOCKWISE)# 提取红色区域red_mask = extract_red_region(rotated_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 = rotated_picture[y:y + h, x:x + w]if not ocr_queue.full():ocr_queue.put(roi)cv.imshow("Red Region", roi)# 显示图像(每5帧显示一次)if i % 5 == 0:cv.imshow("rotated_picture", rotated_picture)last_frame_time = current_time# end_time = time.time()# processing_time_ms = (end_time - current_time) * 1000# print(f"{processing_time_ms:.2f} milliseconds")   # 花费10毫秒# 检查退出条件if cv.waitKey(1) & 0xFF == ord('q') or keyboard.is_pressed('q'):stop_flag = True# 清理资源
cap.release()
cv.destroyAllWindows()
stop_flag = True
ocr_thread.join()
  1. 识别结果:右上角是识别的红色区域,右下是手机摄像头拍摄区域,左下红色打印是识别的文字
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能时代网络空间认知安全新观察

文章目录 前言一、历史上的四次认知革命二、人工智能革命掀起认知安全新浪潮三、人工智能技术塑造认知安全新范式四、人工智能治理应对认知安全新思考 前言 12月5日,在2024第三届北外滩网络安全论坛上以“智能时代网络空间认知安全新观察”为主题作主旨演讲&#x…

【Python标准库】subprocess

1. subprocess是什么? 输入终端命令进行操作 2.用法 run() 作用:创建新的进程执行外部命令,并等待它们完成​​​​​​​语法:run([command, arg1, arg2], capture_output=True, text=True,check,timeout) [command, arg1, arg2], 是单独运行的命令和参数,作为列表来处…

springboot417社区疫情管理系统-(论文+源码)_kaic

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统社区疫情管理系统信息管理难度大,容错率低&a…

信创国产化时代:打造安全高效的信创网站解决方案

在全球科技竞争日益激烈的背景下,信创国产化已经成为中国信息技术领域的重要战略选择。信创国产化,即信息技术应用创新与国产化,旨在通过自主研发和创新,推动核心技术的国产化,减少对外部技术的依赖,确保国…

day10性能测试(2)——Jmeter

【没有所谓的运气🍬,只有绝对的努力✊】 目录 1、LoadRunner vs Jmeter 1.1 LoadRunner 1.2 Jmeter 1.3 对比小结 2、Jmeter 环境安装 2.1 安装jdk 2.2 安装Jmeter 2.3 小结 3、Jmeter 文件目录结构 4、Jmeter默认配置修改 5、Jmeter元件、组…

可造成敏感信息泄露!Spring Boot之Actuator信息泄露漏洞三种利用方式总结

1.介绍 Spring Boot是一个基于Spring的套件,它提供了一个即开即用的应用程序架构,可以简化Spring应用的创建及部署流程,帮助开发者更轻松快捷地构建出企业及应用。 Spring Boot项目中Actuator模块提供了众多HTTP接口端点(Endpoi…

KV Shifting Attention Enhances Language Modeling

基本信息 📝 原文链接: https://arxiv.org/abs/2411.19574👥 作者: Mingyu Xu, Wei Cheng, Bingning Wang, Weipeng Chen🏷️ 关键词: KV shifting attention, induction heads, language modeling📚 分类: 机器学习, 自然语言处…

MongoDB-固定集合(Capped Collection)

在 MongoDB 中,固定集合(Capped Collection)是一种具有特殊属性的集合。固定集合具有一个固定的最大大小,并且一旦达到该大小时,最早插入的文档将会被自动删除,以便为新的文档腾出空间。固定集合的这种特性…

力扣 螺旋矩阵-54

螺旋矩阵-54 class Solution { public:vector<int> spiralOrder(vector<vector<int>>& matrix) {int m matrix.size(),n matrix[0].size();//数组的行列大小int top0,downm-1,left 0,right n-1;//分别为矩阵上下左右的边界int index 0;//存放结果数…

设计模式——单例模式和工厂模式

单例模式:一个类只创建一个类对象&#xff08;节省内存减少类对象数量,一个类对象多次重复使用&#xff09; 格式: class a: pass ba() z1b z2b #z1和z2为同一个类对象 工厂模式&#xff1a;&#xff08;大批量创建具体的类对象,统一类对象入口便于维护&#xf…

【el-dialog关闭前重置表单】

el-dialog关闭前重置表单 问题描述区别解释 问题描述 el-dialog的before-close能接收一个回调函数&#xff0c;在对话框关闭前执行需要的动作&#xff0c;例如我需要的是重置对话框中的表单。 如果只有一个对话框&#xff0c;或者说回调函数不需要额外参数&#xff0c;那么对话…

Unity教程(十九)战斗系统 受击反馈

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…

从感知到认知:解读人工智能技术的核心突破

引言&#xff1a;感知与认知的人工智能之旅 人工智能的演进历程&#xff0c;就像人类的成长过程&#xff0c;从最初学会“看”“听”“感知”这个世界&#xff0c;到逐渐具备“理解”“推理”和“决策”的能力。这两个阶段——感知与认知&#xff0c;不仅是人工智能的技术核心&…

文生图模型开源之光!ComfyUI - AuraFlow本地部署教程

一、模型介绍 AuraFlow 是唯一一个真正开源的文生图模型&#xff0c;由Fal团队开源&#xff0c;其代码和权重都放在了 FOSS 许可证下。基于 6.8B 参数优化模型架构&#xff0c;采用最大更新参数化技术&#xff0c;还重新标注数据集提升指令遵循质量。在物体空间和色彩上有优势…

SpringMVC ——(1)

1.SpringMVC请求流程 1.1 SpringMVC请求处理流程分析 Spring MVC框架也是⼀个基于请求驱动的Web框架&#xff0c;并且使⽤了前端控制器模式&#xff08;是⽤来提供⼀个集中的请求处理机制&#xff0c;所有的请求都将由⼀个单⼀的处理程序处理来进⾏设计&#xff0c;再根据请求…

#HarmonyOS篇: 学习资料

学习课堂 https://developer.huawei.com/consumer/cn/training/ https://developer.huawei.com/consumer/cn/doc/start/training-introduction-0000001181392655 华为开发者指导手册 https://developer.huawei.com/consumer/cn/doc/start/guidebook-0000001056335559 博客…

Docker 安装 中文版 GitLab

Docker 安装系列 安装GitLab、解决服务器内存不足问题、使用域名/IP地址访问项目 1、拉取 [rootTseng ~]# docker pull twang2218/gitlab-ce-zh:latest latest: Pulling from twang2218/gitlab-ce-zh 8ee29e426c26: Pull complete 6e83b260b73b: Pull complete e26b65fd11…

python基于基于自然语言处理技术的话题文本分类

大家好我是君君学姐&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款《python基于基于自然语言处理技术的话题文本分类》毕业设计项目。项目源码以及部署相关请联系君君学姐&#xff0c;文末附上联系信息 。 &#x1f388;作者&#xff1a;君君学姐&#x1f388; …

iOS如何操作更新推送证书

最近收到一份邮件,应该如何操作呢,证书还是跟以前一样冲钥匙串直接申请吗 Hello, As we announced in October, the Certification Authority (CA) for Apple Push Notification service (APNs) is changing. APNs will update the server certificates in sandbox on January…

ShardingSphere-JDBC

1. 什么是分库分表&#xff1f; 分库分表是一种数据库扩展技术&#xff0c;通过将数据拆分到多个数据库&#xff08;分库&#xff09;或多个表&#xff08;分表&#xff09;中来解决单一数据库或表带来的性能瓶颈。分库分表可以有效提升系统的可扩展性、性能和高并发处理能力&…