解决opencv中文路径问题
见cv_imread函数和cv_imwrite函数
import cv2
import os
import matplotlib.pyplot as plt
from paddleocr import PaddleOCR, draw_ocr
import numpy as np
import urllib.parse # Add this import statement
from txt_get import ImageTextExtractor
# 初始化OCR,OCR会自动下载PP-OCRv3检测器、识别器和角度分类器
ocr = PaddleOCR(use_angle_cls=True)
# 指定输出路径和字体路径
# out_path = './output_images' #这里不用out_path了,直接在detect_and_save_people里用output_dir
font = './doc/fonts/simfang.ttf'
font = r'C:\Windows\Fonts\simfang.ttf' # 修改为绝对路径,并且确定字体存在
def cv_imread(file_path):
# 使用 np.fromfile 读取文件字节流
file_bytes = np.fromfile(file_path, dtype=np.uint8)
# 使用 cv2.imdecode 解码图像
img = cv2.imdecode(file_bytes, cv2.IMREAD_COLOR)
return img
def cv_imwrite(file_path, img):
"""
使用 cv2.imencode 和 Python 内置的文件写入支持中文文件名保存图像
"""
ext = os.path.splitext(file_path)[1]
result, encoded_img = cv2.imencode(ext, img)
if result:
with open(file_path, 'wb') as f:
f.write(encoded_img.tobytes())
else:
raise Exception("图像编码失败")
def detect_and_save_people(image_path, output_dir):
"""
检测图像中的文本,如果包含"xxx"关键词,则保存图像到指定路径。
"""
try:
extractor = ImageTextExtractor()
extracted_text = extractor.extract_text(image_path)
if extracted_text:
print(f"从图像中提取到的文本:{extracted_text}")
if "xxx" in extracted_text:
print(f"检测到“xxx”关键词,保存图片: {image_path}")
# 创建输出目录 (如果不存在)
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 构建输出文件名
filename = os.path.basename(image_path)
output_path = os.path.join(output_dir, filename) # Use original filename without URL encoding
# 复制图片
cv2_img = cv_imread(image_path)
cv_imwrite(output_path, cv2_img) # Use cv_imwrite instead of cv2.imwrite
else:
print(f"未检测到“xxx”关键词: {image_path}")
else:
print(f"未检测到文本: {image_path}")
except Exception as e:
print(f"处理图像 {image_path} 时发生错误: {e}")
def process_directory(root_dir, output_dir):
"""
递归处理指定目录下的所有图像,检测图像中是否包含"xxx"关键词,如果包含则保存图像到指定路径。
"""
for dirpath, dirnames, filenames in os.walk(root_dir):
for filename in filenames:
if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')): # 检查文件是否是图像
image_path = os.path.join(dirpath, filename)
detect_and_save_people(image_path, output_dir)
if __name__ == '__main__':
# 使用示例
root_dir = 'xxx' # 替换为你的根目录
output_dir = 'xxx' # 替换为你想要保存图像的目录
process_directory(root_dir, output_dir)