Python-OpenCV学习--外接摄像头实时检测文本框

该博客介绍了一种在Windows7系统下,利用Python3.x和OpenCV处理台式机外接摄像头视频流的方法。通过Sobel边缘检测、二值化、膨胀腐蚀等图像处理技术,识别和突出文本区域。最终,通过查找和筛选轮廓来定位文本框,并绘制出轮廓以展示识别结果。

 

一、Windows7 系统下 Python 3.x版本  , 台式机外接摄像头 使用分水岭算法 腐蚀 膨胀等,识别文本的区域。

import numpy as np
import cv2
from matplotlib import pyplot as plt
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FPS, 15)
while True:

    ret, frame = cap.read()

    # 转化成灰度图
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

# 利用Sobel边缘检测生成二值图
    sobel = cv2.Sobel(gray, cv2.CV_8U, 1, 0, ksize=3)
# 二值化
    ret, binary = cv2.threshold(sobel, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)

# 膨胀、腐蚀
    element1 = cv2.getStructuringElement(cv2.MORPH_RECT, (30, 9))
    element2 = cv2.getStructuringElement(cv2.MORPH_RECT, (24, 6))

# 膨胀一次,让轮廓突出
    dilation = cv2.dilate(binary, element2, iterations=1)

# 腐蚀一次,去掉细节
    erosion = cv2.erode(dilation, element1, iterations=1)

# 再次膨胀,让轮廓明显一些
    dilation2 = cv2.dilate(erosion, element2, iterations=2)

#  查找轮廓和筛选文字区域
    region = []
    contours, hierarchy = cv2.findContours(dilation2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    for i in ran
PP-OCRv3 是 PaddleOCR 项目中推出的高效、轻量化的 OCR(光学字符识别)模型系列中的一个版本,主要用于文本检测和识别。其中 `ch_PP-OCRv3` 中的 "ch" 表示中文场景(Chinese),而 `PP-OCRv3` 指的是该系列的第三代模型架构。 我们这里重点讲解 **ch_PP-OCRv3 的检测模型原理**,即它是如何从图像中定位出文字区域的。 --- ### 🔍 ch_PP-OCRv3 检测模型原理 PP-OCRv3 的文本检测模块基于改进的 **DB(Differentiable Binarization)算法**,全称为 **DBNet++** 或增强版 DBNet。它由百度 PaddlePaddle 团队在 PP-OCR 系列中进一步优化而来,具有高精度和高速度的特点。 #### 📌 核心思想:可微分二值化(Differentiable Binarization) 传统的文本检测方法在后处理阶段需要使用阈值对概率图进行二值化(如OTSU或固定阈值),这会导致训练与推理不一致。DB 方法引入了 **可微分二值化操作**,使得整个网络可以端到端地训练,同时保持高召回率和鲁棒性。 --- ### 🧱 模型结构概览(Detection Head - DBNet++) 1. **Backbone**: 使用轻量级主干网络,如 **MobileNetV3 / ResNet-18 / ResNet-50** 等。 - 在 ch_PP-OCRv3 中,默认使用的是 **ResNet-18 + FPN + RSE** 结构(RSE: Receptive Field Enhancement)来增强感受野。 2. **Neck(特征融合模块)**: 采用 **FPN(Feature Pyramid Network)或 RSE-FPN** 来融合多尺度特征,提升小文本和长文本的检测能力。 3. **Head(检测头)**: 输出两个图: - **Probability Map(概率图)**: 表示每个像素属于文本区域的概率(0~1之间)。 - **Threshold Map(阈值图)**: 动态决定每个位置的二值化阈值。 - 最终二值图通过如下公式生成: $$ \text{BinaryMap} = \begin{cases} 1, & \text{if } P(x) > T(x) \\ 0, & \text{otherwise} \end{cases} $$ 其中 $P(x)$ 是概率图输出,$T(x)$ 是学习到的阈值图。 4. **Loss 函数设计**: - 总损失 = L1 Loss(对阈值图)+ Dice Loss(对最终二值图)+ BCE Loss(对概率图) - 这种组合提升了边界清晰度和小文本的检出率。 --- ### ✅ ch_PP-OCRv3 检测模型的关键优化点 | 优化项 | 描述 | |--------|------| | **RSE 模块** | 增强主干网络的感受野,特别适合长文本、弯曲文本 | | **Binarizer 改进** | 引入更稳定的可微二值化策略 | | **数据增强策略** | 包括随机旋转、透视变换、颜色扰动等,提高泛化能力 | | **Anchor-Free 设计** | 直接预测像素级别的文本/非文本标签,无需预设 anchor | | **轻量化部署友好** | 支持 ONNX、TensorRT、Paddle Lite 转换,适用于移动端 | --- ### 🧪 示例代码(使用 PaddleOCR 加载 ch_PP-OCRv3 检测模型) ```python from paddleocr import PaddleOCR # 初始化 PaddleOCR 检测器(使用 ch_PP-OCRv3 模型) ocr = PaddleOCR(use_angle_cls=True, lang="ch", det=True, rec=False) # 图像路径 img_path = 'your_image.jpg' # 执行文本检测 result = ocr.ocr(img_path, det=True, rec=False) # 输出检测框坐标 for line in result: print("Text box:", line) ``` > 注意:PaddleOCR 默认会自动下载并加载 `ch_PP-OCRv3_det` 检测模型权重文件(通常为 `.pdparams` 格式)。 --- ### 💡 后处理流程(DB 后处理) 检测头输出 `prob_map` 和 `thresh_map` 后,经过以下步骤提取文本框: 1. 计算 `binary_map = prob_map > thresh_map` 2. 使用 OpenCV 的 `findContours` 提取连通域 3. 对轮廓进行四边形拟合或最小外接矩形 4. 进行 NMS(非极大值抑制)去除重叠框 --- ### ⚙️ 配置文件示例(简化版 YAML) ```yaml Architecture: model_type: det algorithm: DB++ Transform: None Backbone: name: MobileNetV3 scale: 0.375 model_name: small extra_block_channels: [64, 96, 128] Neck: name: RSEFPN out_channels: 96 Head: name: DBHead k: 50 binary_thresh: 0.3 thresh_thresh: 0.2 ``` --- ### ✅ 优势总结 - 高准确率:尤其擅长中文复杂场景下的文本检测(倾斜、模糊、低分辨率) - 快速推理:轻量模型可在边缘设备运行 - 易于部署:支持多种格式导出(ONNX/Paddle Lite/TensorRT) - 开源免费:PaddleOCR 提供完整训练代码与预训练模型 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值