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

news2025/1/23 17:26:03
  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'):
        break

cap.release()
cv.destroyAllWindows()

  1. 运行效果展示。我手机的IP摄像头拍摄正对着wps那块区域,识别出来的红色区域在左上角。因为OCR识别使用我用的是english语言包,所以识别文字内容不太准确,汉字没有识别出来,但是我这里的需求只要识别英文单词就可以了。此时,电脑正在播放识别出来的文字内容。大致需求已经实现了。
    在这里插入图片描述

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

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

相关文章

LabVIEW中“this VI‘s owning library is missing”错误及解决

问题描述 当加载或打开一个VI时,如果其所属的项目库未加载到内存,LabVIEW将提示错误:“this VIs owning library is missing”(该VI的所属库不存在)。 该问题通常发生在以下情况下: 项目库文件丢失或路径…

【效果】回到顶部功能实现

实现效果&#xff1a; 相关代码&#xff1a; <template><div class"cats" :style"{ top: catsTop }" ref"cats" click"catTop"></div> </template> 样式&#xff1a; /* 回到顶部 - 小猫咪 */ .cats {posi…

算法第一弹-----双指针

目录 1.移动零 2.复写零 3.快乐数 4.盛水最多的容器 5.有效三角形的个数 6.查找总价值为目标值的两个商品 7.三数之和 8.四数之和 双指针通常是指在解决问题时&#xff0c;同时使用两个指针&#xff08;变量&#xff0c;常用来指向数组、链表等数据结构中的元素位置&am…

计算机网络期末复习-part1-概述

1、互联网的组成 互联网由两大块组成。 1、边沿部分&#xff1a;由所有连接在互联网上的主机组成&#xff0c;是用户直接使用的部分。 2、核心部分&#xff0c;由大量网络和路由器组成&#xff0c;为边缘部分提供服务。 2、数据传送阶段的三种交换方式的主要特点 1、电路交…

【Linux系统编程】——理解冯诺依曼体系结构

文章目录 冯诺依曼体系结构硬件当代计算机是性价比的产物冯诺依曼的存储冯诺依曼的数据流动步骤冯诺依曼结构总结 冯诺依曼体系结构硬件 下面是整个冯诺依曼体系结构 冯诺依曼结构&#xff08;Von Neumann Architecture&#xff09;是现代计算机的基本结构之一&#xff0c;由数…

微信创建小程序码 - 数量不受限制

获取小程序码&#xff1a;小程序码为圆图&#xff0c;且不受数量限制。 目录 文档 接口地址 请求方式 功能描述 注意事项 获取 scene 值 请求参数 返回参数 对接 请求方法 获取小程序码 调用获取小程序码 总结 文档 接口地址 https://api.weixin.qq.com/wxa/get…

JDK8 下载与安装

下载安装包 官网下载 官网 找到适合的版本: 网盘下载 网盘链接 提取码: 6666 下载得到的安装包: 安装步骤 双击安装包开始安装. 安装路径不要有中文或者特殊符号如空格等. 更改安装路径: 跳出一个页面, 安装公共 JRE: 安装完成: 安装目录: 安装的公共 JRE: JDK 里面的 JR…

笔记本电脑usb接口没反应怎么办?原因及解决方法

笔记本电脑的USB接口是我们日常使用中非常频繁的一个功能&#xff0c;无论是数据传输、充电还是外接设备&#xff0c;都离不开它。然而&#xff0c;当USB接口突然没有反应时&#xff0c;这无疑会给我们的工作和学习带来不小的困扰。下面&#xff0c;我们就来探讨一下笔记本USB接…

Axure设计之模拟地图人员移动轨迹

在产品原型设计时&#xff0c;为了更好的表达和呈现预期的效果&#xff0c;让客户或开发看一眼就能理解要实现的功能&#xff0c;往往需要在产品设计时尽量去接近现实&#xff0c;这就需要我们在使用Axure制作原型时应具有高度细节和逼真度的原型设计。原型设计不仅包含了产品的…

【配置查询】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

error=‘null‘], commandType=io.lettuce.core.RedisPublisher$SubscriptionCommand]

问题 查看java应用启动日志输出下面错误&#xff1a; errornull], commandTypeio.lettuce.core.RedisPublisher$SubscriptionCommand] Completing command LatencyMeteredCommand [typeINFO, outputStatusOutput [output# Server redis_version:4.0.14 redis_git_sha1:000…

Python 数据分析用库 获取数据(二)

Beautiful Soup Python的Beautiful Soup&#xff08;常被称为“美丽汤”&#xff09;是一个用于解析HTML和XML文档的第三方库&#xff0c;它在网页爬虫和数据提取领域具有广泛的应用。 作用 HTML/XML解析&#xff1a; Beautiful Soup能够解析HTML和XML文档&#xff0c;包括不…

915DEBUG-obsidianTemplater使用

Templater使用 tp函数不正常显示相应数据 模板使用方式不正确 <% tp.date.now("YYYY-MM-DD") %> 应该被放置在一个被Templater识别为模板的文件中&#xff0c;或者在你使用Templater的插入模板功能时输入。如果只是在一个普通的Markdown文件中直接输入这段代码…

美畅物联丨智能监控,高效运维:视频汇聚平台在储能领域的实践探索

在当今全球能源格局不断变化的大背景下&#xff0c;对清洁能源的需求正以惊人的速度增长。储能项目作为平衡能源供需、提升能源利用效率的关键环节&#xff0c;其规模和复杂度也在不断攀升。在储能项目的运营管理过程中&#xff0c;安全监控、设备运维以及数据管理等方面面临着…

华为NPU服务器昇腾Ascend 910B2部署通义千问Qwen2.5——基于mindie镜像一路试错版(三)

文章目录 前言纯模型推理启动服务后面干什么?这可咋整啊?愁死了!总结前言 这是咱这个系列的第三个文章了。 毕竟,这是我好几天摸索出的经验,能帮助各位在几个小时内领会,我觉得也算是我的功劳一件了。 所以,一是希望大家耐心看下去,耐心操作下去;而是恳请各位多多关…

【C++】—— set 与 multiset

【C】—— map 与 set 1 序列式容器和关联式容器2 set 系列的使用2.1 set 和 multiset 参考文档2.2 set 类的介绍2.3 set 的迭代器和构造2.4 set的增删查2.4.1 insert2.4.2 find 与 erase2.4.3 count 2.5 lower_bound 与 upper_bound2.6 multiset 与 set 的差异2.6.1 不再去重2…

`pnpm` 不是内部或外部命令,也不是可运行的程序或批处理文件(问题已解决,2024/12/3

主打一个有用 只需要加一个环境变量 直接安装NodeJS的情况使用NVM安装NodeJS的情况 本篇博客主要针对第二种情况&#xff0c;第一种也可参考做法&#xff0c;当然眨眼睛建议都换成第二种 默认情况下的解决方法&#xff1a;⭐⭐⭐ 先找到node的位置&#xff0c;默认文件夹名字…

JavaScript 键盘控制移动

如果你想通过 JavaScript 实现键盘控制对象&#xff08;比如一个方块&#xff09;的移动&#xff0c;下面是一个简单的示例&#xff0c;展示如何监听键盘事件并根据按下的键来移动一个元素。 HTML 和 CSS&#xff1a; <!DOCTYPE html> <html lang"en">…

【串口助手开发】visual studio 使用C#开发串口助手,生成在其他电脑上可执行文件,可运行的程序

1、改成Release&#xff0c;生成解决方案 串口助手调试成功后&#xff0c;将Debug改为Release&#xff0c;点击生成解决方案 2、运行exe文件 生成解决方案后&#xff0c;在bin文件夹下&#xff0c; Release文件夹下&#xff0c;生成相关文件 复制一整个Release文件夹&#xf…

通过HTML Canvas 在图片上绘制文字

目录 前言 一、HTML Canvas 简介 二、准备工作 三、绘制图片 四、绘制文字 五、完整代码 效果演示&#xff1a; 前言 HTML canvas 为我们提供了无限的创意可能性。今天&#xff0c;我们就来探索一下如何通过 HTML canvas 将图片和文字绘制到图片上&#xff0c;创造出独特…