| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- """
- OCR Validator 文件处理工具(Streamlit 特定)
- 保留 Streamlit 特定的文件处理函数,通用函数已迁移到 ocr_utils
- """
- import os
- import cv2
- import numpy as np
- from typing import Optional, Dict
- def load_css_styles(css_path: str = "styles.css") -> str:
- """
- 加载CSS样式文件(Streamlit 特定)
-
- Args:
- css_path: CSS 文件路径
-
- Returns:
- CSS 样式内容
- """
- try:
- with open(css_path, 'r', encoding='utf-8') as f:
- return f.read()
- except Exception:
- # 返回基本样式
- return """
- .main > div { background-color: white !important; color: #333333 !important; }
- .stApp { background-color: white !important; }
- .block-container { background-color: white !important; color: #333333 !important; }
- """
- def detect_image_orientation_by_opencv(image_path: str) -> Dict:
- """
- 使用OpenCV的文本检测来判断图片方向
-
- Args:
- image_path: 图片路径
-
- Returns:
- 包含检测结果的字典
- """
- try:
- # 读取图像
- image = cv2.imread(image_path)
- if image is None:
- raise ValueError("无法读取图像文件")
-
- height, width = image.shape[:2]
- gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
-
- # 使用EAST文本检测器或其他方法
- # 这里使用简单的边缘检测和轮廓分析
- edges = cv2.Canny(gray, 50, 150, apertureSize=3)
-
- # 检测直线
- lines = cv2.HoughLines(edges, 1, np.pi/180, threshold=100)
-
- if lines is None:
- return {
- 'detected_angle': 0.0,
- 'confidence': 0.0,
- 'method': 'opencv_analysis',
- 'message': '未检测到足够的直线特征'
- }
-
- # 分析直线角度
- angles = []
- for rho, theta in lines[:, 0]:
- angle = theta * 180 / np.pi
- # 将角度标准化到0-180度
- if angle > 90:
- angle = angle - 180
- angles.append(angle)
-
- # 统计主要角度
- angle_hist = np.histogram(angles, bins=36, range=(-90, 90))[0]
- dominant_angle_idx = np.argmax(angle_hist)
- dominant_angle = -90 + dominant_angle_idx * 5 # 每个bin 5度
-
- # 将角度映射到标准旋转角度
- if -22.5 <= dominant_angle <= 22.5:
- detected_angle = 0.0
- elif 22.5 < dominant_angle <= 67.5:
- detected_angle = 270.0
- elif 67.5 < dominant_angle <= 90 or -90 <= dominant_angle < -67.5:
- detected_angle = 90.0
- else:
- detected_angle = 180.0
-
- confidence = angle_hist[dominant_angle_idx] / len(lines) if len(lines) > 0 else 0.0
-
- return {
- 'detected_angle': detected_angle,
- 'confidence': min(1.0, confidence),
- 'method': 'opencv_analysis',
- 'line_count': len(lines),
- 'dominant_angle': dominant_angle,
- 'message': f'基于{len(lines)}条直线检测到旋转角度: {detected_angle}°'
- }
-
- except Exception as e:
- return {
- 'detected_angle': 0.0,
- 'confidence': 0.0,
- 'method': 'opencv_analysis',
- 'error': str(e),
- 'message': f'OpenCV检测过程中发生错误: {str(e)}'
- }
|