You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Visual Studio中用Python3.8+Pytesseract+OpenCV提取iPhone短信PNG文本问题

在Visual Studio中用Python 3.8结合Pytesseract与OpenCV识别iPhone短信截图的解决方案

一、可行性确认

完全可以在Visual Studio中实现这个需求——VS只是开发环境,只要你的Python 3.8环境正确安装了opencv-python、pytesseract依赖,且本地安装了Tesseract-OCR引擎,就能正常运行识别逻辑。

二、现有脚本无识别结果的核心问题及修复

你的脚本能走完流程但无文本输出,大概率是以下几个环节出了问题:

1. HSV颜色阈值不匹配iPhone短信气泡

你定义的蓝色、灰色HSV范围和实际iPhone短信气泡的颜色不匹配,导致掩码(mask)没能选中气泡区域,后续轮廓检测自然找不到有效区域。

  • 修复:针对你的截图重新校准HSV阈值(可以用OpenCV的取色工具辅助),示例中已调整为更适配iPhone气泡的范围。

2. 未过滤无效小轮廓

原始代码会处理所有检测到的轮廓,包括图像噪点,这些小区域里没有有效文本,只会产生空输出。

  • 修复:添加轮廓面积过滤,只处理面积大于设定阈值的区域,跳过噪点。

3. OCR前图像预处理不足

直接用原始ROI识别,可能因为背景干扰、字体对比度低导致识别失败,输出空文本。

  • 修复:对ROI做灰度转换、自适应二值化、降噪处理,提升OCR识别准确率。

三、修改后的完整代码

import os
import cv2
import pytesseract

print("Starting script...")

# 指定Tesseract可执行文件路径
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

# 目标截图目录
directory_path = r'C:\Users\username\OneDrive\Documents\Convo'

# 遍历目录下所有文件
for filename in os.listdir(directory_path):
    print(f"Checking file: {filename}")
    if filename.endswith('.png'):
        print(f"Processing file: {filename}")
        image_path = os.path.join(directory_path, filename)
        image = cv2.imread(image_path)
        
        # 检查图像是否加载成功
        if image is None:
            print(f"Failed to load image: {filename}")
            continue
        
        # 转换为HSV颜色空间
        hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
        
        # 适配iPhone短信气泡的HSV阈值(可根据实际截图微调)
        lower_blue = (100, 150, 150)
        upper_blue = (120, 255, 255)
        lower_grey = (0, 0, 100)
        upper_grey = (180, 30, 200)
        
        # 创建颜色掩码
        blue_mask = cv2.inRange(hsv, lower_blue, upper_blue)
        grey_mask = cv2.inRange(hsv, lower_grey, upper_grey)
        
        # 最小轮廓面积(过滤噪点,根据截图尺寸调整)
        min_contour_area = 500
        
        # 提取并分类文本
        for mask, texter in [(blue_mask, "You"), (grey_mask, "Other Texter")]:
            contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
            for contour in contours:
                # 跳过小噪点轮廓
                if cv2.contourArea(contour) < min_contour_area:
                    continue
                x, y, w, h = cv2.boundingRect(contour)
                roi = image[y:y+h, x:x+w]
                
                # ROI预处理:提升OCR识别率
                gray_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
                thresh_roi = cv2.adaptiveThreshold(gray_roi, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
                kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2))
                cleaned_roi = cv2.morphologyEx(thresh_roi, cv2.MORPH_OPEN, kernel)
                
                # 执行OCR并去除空白字符
                text = pytesseract.image_to_string(cleaned_roi, lang='eng').strip()
                # 只打印非空文本
                if text:
                    print(f"{texter}: {text}")
        
        print(f"Processed {filename}")

print("Script completed.")

四、额外注意事项

  • 确保安装Tesseract-OCR时勾选了英文语言包(默认包含,若缺失需手动添加)
  • 截图需清晰,避免模糊、过度压缩导致OCR失效
  • 若仍无输出,可以临时添加cv2.imwrite("blue_mask.png", blue_mask)保存掩码图像,检查是否正确选中了短信气泡区域,再微调HSV阈值

内容的提问来源于stack exchange,提问作者PapaGhost

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:51:05