opencv&ocr识别手机摄像头拍摄的指定区域笔墨,笔墨符合规则就语音报警 ...

打印 上一主题 下一主题

主题 1034|帖子 1034|积分 3102


  • 安装python,pycharm,自行安装。
  • Python下安装OpenCv
    2.1 打开cmd,先安装opencv-python
  1. pip install opencv-python --user -i https://pypi.tuna.tsinghua.edu.cn/simple
复制代码
2.2 再安装opencv-contrib-python
  1. 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文件,执行代码。有窗口输出该路径的图片就阐明乐成了。
  1. import cv2 as cv
  2. # 这段代码是测试opencv是否正常安装。运行下面这段代码出现图片就是成功的
  3. src = cv.imread("C:\\Users\Administrator\Desktop\\city1.jpg")
  4. cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
  5. cv.imshow("input image",src)
  6. cv.waitKey(0)
  7. cv.destroyAllWindows()
  8. print("hi python")
复制代码

  • 下载Tesseract OCR,去官网 https://github.com/UB-Mannheim/tesseract/wiki
    下载exe。安装完成后,需要设置Tesseract-OCR的系统环境。详细看这篇文章
    https://blog.csdn.net/qq_38463737/article/details/109679007
  • 下载Tesseract OCR的语言包,中文语言包和英文语言包。
    去官网 https://github.com/tesseract-ocr/tessdata 下载eng.traineddata和chi_sim.traineddata

    然后把那两个文件放到**/Tesseract-OCR/tessdata

  • pycharm 的python包 安装pytesseract

  • 在项目文件.venv/Lib/site-packages/pytesseract/pytesseract.py 文件中修改变量tesseract_cmd,路径自行修改。 这是为了办理BUG:”tesseract is not installed or it‘s not in your PATH“

  • 安装gTTS 谷歌语音播报,pillow,pyttsx3 离线语音播报。

  • 在手机上下载“IP 摄像头”,并安装。这里我在应用宝里下载了 IP 摄像头。利用该软件,要电脑毗连手机热门,同处在局域网内。

    10,全部py代码如下
  1. # 本代码参考了https://blog.csdn.net/weixin_35752233/article/details/142606296  , https://blog.csdn.net/m0_58892312/article/details/120923578 和 AI
  2. # 人脸模型库文件“ haarcascade_frontalface_default.xml ”,帮助摄像头获取的画面去对比
  3. # 1. 第二句代码中的admin为我的IP摄像头用户名, admin为我的IP摄像头密码,这个可以在手机APP的设置里查看和修改,代码中的要使用自己的用户名、密码。
  4. # 2. @后面的地址是局域网IP地址,这个在打开IP摄像头服务器之后的界面就能看到,也需要修改为自己的地址。
  5. # 3.代码的其他部分无需修改。
  6. import time
  7. import cv2 as cv
  8. import pytesseract
  9. import numpy as np
  10. import pyttsx3
  11. from gtts import gTTS
  12. # 图像的裁剪和缩放是图像预处理的两个基本操作。裁剪主要是根据需要对图像的特定区域进行选取,剔除无效或干扰信息。缩放则是为了满足特定的分辨率或图像尺寸需求,对图像的大小进行调整。
  13. # 裁剪图片
  14. def crop_image(image, x, y, width, height):
  15.     return image[y:y + height, x:x + width]
  16. # 缩放图片
  17. def resize_image(image, width, height):
  18.     return cv.resize(image, (width, height))
  19. # 灰度化.        图像的灰度化和二值化是将图像从彩色转换到灰度图像和黑白图像的过程,这些转换对于提高OCR的准确性和效率至关重要。
  20. def to_grayscale(image):
  21.     return cv.cvtColor(image, cv.COLOR_BGR2GRAY)
  22. # 二值化.
  23. def to_binary(image, threshold=127, maxval=255):
  24.     return cv.threshold(image, threshold, maxval, cv.THRESH_BINARY)[1]
  25. # 噪声去除是图像预处理中非常重要的一步。它通常通过滤波技术实现,可以减少图像中的随机噪声,提高图像质量,有助于后续的文字检测和识别。
  26. def remove_noise(image, kernel_size=3):
  27.     return cv.medianBlur(image, kernel_size)
  28. # 文本行检测                     和字符分割是预处理的高级步骤,它们是为了从图像中准确地分离出单独的字符或文本行,这对于OCR识别至关重要。
  29. def detect_text_lines(image):
  30.     # 使用Canny边缘检测算法
  31.     edged = cv.Canny(image, 100, 200)
  32.     # 找到轮廓
  33.     contours, _ = cv.findContours(edged, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
  34.     return contours
  35. # 字符分割
  36. def segment_characters(image, contours):
  37.     characters = []
  38.     for contour in contours:
  39.         x, y, w, h = cv.boundingRect(contour)
  40.         roi_image = image[y:y + h, x:x + w]
  41.         characters.append(roi_image)
  42.     return characters
  43. # 识别并截取红色区域
  44. def extract_red_region(image):
  45.     # 转换为HSV颜色空间
  46.     hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
  47.     # 定义红色的范围
  48.     lower_red = np.array([0, 120, 70])
  49.     upper_red = np.array([10, 255, 255])
  50.     mask1 = cv.inRange(hsv, lower_red, upper_red)
  51.     lower_red = np.array([170, 120, 70])
  52.     upper_red = np.array([180, 255, 255])
  53.     mask2 = cv.inRange(hsv, lower_red, upper_red)
  54.     # 合并两个掩码
  55.     mask = mask1 + mask2
  56.     # 形态学操作
  57.     kernel = np.ones((5, 5), np.uint8)
  58.     mask = cv.morphologyEx(mask, cv.MORPH_CLOSE, kernel)
  59.     mask = cv.morphologyEx(mask, cv.MORPH_OPEN, kernel)
  60.     return mask
  61. # 文字保存为临时mp3文件
  62. def text_to_speech(text, lang='en'):
  63.     # 创建gTTS对象
  64.     tts = gTTS(text=text, lang=lang)
  65.     # 保存为临时文件
  66.     temp_file = "temp_audio.mp3"
  67.     tts.save(temp_file)
  68.     return temp_file
  69. # 读取视频信息。 # @前为账号密码,@后为ip地址
  70. cap = cv.VideoCapture("http://admin:admin@192.168.169.143:8081/video")
  71. # cap = cv.VideoCapture(0)
  72. while cap.isOpened():
  73.     # 读取一帧图片
  74.     f, image = cap.read()
  75.     # 保存当前帧为图片文件
  76.     cv.imwrite('captured_image.jpg', image)
  77.     print("图片已保存为 captured_image.jpg")
  78.     time.sleep(0.5)
  79.     # 项目相对路径下captured_image.jpg,自行修改文件路径
  80.     picture = cv.imread("D:\\download_software\\python_project\\camera_test\\captured_image.jpg")
  81.     # 提取红色区域 -> 红色底纹白颜色文字
  82.     red_mask = extract_red_region(picture)
  83.     # 查找轮廓
  84.     contours, _ = cv.findContours(red_mask, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
  85.     for contour in contours:
  86.         x, y, w, h = cv.boundingRect(contour)
  87.         roi = picture[y:y + h, x:x + w]
  88.         # ps:没有必要灰度处理和二值化处理,因为红色区域的图像已经很清楚了
  89.         # # 转换为灰度图像
  90.         # gray_picture = cv.cvtColor(roi, cv.COLOR_BGR2GRAY)
  91.         # # 二值化处理
  92.         # _, binary_picture = cv.threshold(gray_picture, 200, 255, cv.THRESH_BINARY_INV)
  93.         # 使用Tesseract OCR识别文字
  94.         text = pytesseract.image_to_string(roi, config='--psm 6',lang="eng")
  95.         print("OCR识别结果:" + text)
  96.         cv.imshow("Red Region", roi)
  97.         # 如果文本包含MAU或者AHU,播放mp3语音进行报警
  98.         if "MAU" in text or "AHU" in text:
  99.             # 创建语音引擎
  100.             engine = pyttsx3.init()
  101.             # 进行语音播报 指定要播报的文本
  102.             engine.say(text)
  103.             # 阻止 没播报完程序就退出
  104.             engine.runAndWait()
  105.     # 使用OpenCV的自定义函数进行图像预处理
  106.     # # 设定裁剪区域的坐标和尺寸
  107.     # x, y, width, height = 100, 100, 200, 200
  108.     # cropped_image = crop_image(image, x, y, width, height)
  109.     #
  110.     # # 设定缩放尺寸
  111.     # new_width, new_height = 300, 300
  112.     # resized_image = resize_image(cropped_image, new_width, new_height)
  113.     # 读取图片并转换为灰度图
  114.     # gray_picture = cv.cvtColor(picture, cv.COLOR_BGR2GRAY)
  115.     # 读取图片并进行二值化
  116.     # _, binary_picture = cv.threshold(gray_picture, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)
  117.     # 读取图片并去除噪声
  118.     # noise_free_picture = remove_noise(binary_picture)
  119.     # 使用Tesseract进行OCR处理     chi_sim | eng
  120.     # text = pytesseract.image_to_string(noise_free_picture,lang="eng")
  121.     # 打印OCR结果
  122.     # print("OCR识别结果:" + text)
  123.     # cv.imshow("Video Stream", picture)
  124.     #退出视频识别
  125.     if cv.waitKey(1) & 0xFF == ord('q'):
  126.         break
  127. cap.release()
  128. cv.destroyAllWindows()
复制代码

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊雷无声

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表