pythonproject/processQr.py

149 lines
5.8 KiB
Python
Raw Normal View History

2024-08-07 09:46:47 +08:00
import random
import cv2
import numpy as np
import os
from tqdm import tqdm
import shutil
def correct_qr_code_images(input_folder, output_folder, margin=5):
# 确保输出文件夹存在
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 读取输入文件夹中的所有图片
images = [os.path.join(input_folder, f) for f in os.listdir(input_folder) if f.endswith(('.png', '.jpg', '.jpeg'))]
total_images = len(images)
# 确保WeChatQRCode类和模型文件正确加载
weChatQr = cv2.wechat_qrcode.WeChatQRCode(
"wechat_qrcode/detect.prototxt",
"wechat_qrcode/detect.caffemodel",
"wechat_qrcode/sr.prototxt",
"wechat_qrcode/sr.caffemodel"
)
# 使用tqdm显示进度条
for i, img_path in enumerate(tqdm(images, desc="Processing images", total=total_images)):
img = cv2.imread(img_path)
# 灰度转换
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kernel = np.ones((1, 3), np.uint8)
dilated_img = cv2.dilate(img, kernel, iterations=1)
# 使用OTSU阈值算法将灰度图转换为二值图
_, binary_image = cv2.threshold(gray_img, 0, 255, cv2.THRESH_OTSU)
# 黑白颜色反转
# binary_img_inv = cv2.bitwise_not(binary_image)
# 显示反转后的二值图像
# cv2.imshow('Inverted Binary Image', dilated_img)
# 等待按键后关闭窗口
# cv2.waitKey(0)
# cv2.destroyAllWindows()
res, points = weChatQr.detectAndDecode(dilated_img)
if len(res) > 0:
point = points[0]
width = max(np.linalg.norm(point[0] - point[1]), np.linalg.norm(point[2] - point[3]))
height = max(np.linalg.norm(point[1] - point[2]), np.linalg.norm(point[3] - point[0]))
# 计算带有边距的新的points_dst
points_dst = np.array([[margin, margin],
[width - margin, margin],
[width - margin, height - margin],
[margin, height - margin]], dtype=np.float32)
# 生成变换矩阵
matrix = cv2.getPerspectiveTransform(point, points_dst)
# 应用透视变换,纠正图像
corrected_image = cv2.warpPerspective(img, matrix, (int(width), int(height)))
# 保存裁剪后的二维码图像
output_path = os.path.join(output_folder, f"cropped_qr_code_{i + 1:05d}.jpg")
cv2.imwrite(output_path, corrected_image)
else:
print(f"No QR code found in {img_path}.")
def migrate_images(source_folder, target_folder):
# 确保目标文件夹存在
if not os.path.exists(target_folder):
os.makedirs(target_folder)
# 初始化图片计数器
image_counter = 0
# 存储所有图片路径的列表
image_paths = []
# 遍历源文件夹及其所有子文件夹
for root, dirs, files in os.walk(source_folder):
for dir in dirs:
# 检查是否是名为'output'的文件夹
if dir == 'output':
# 拼接完整的output文件夹路径
output_path = os.path.join(root, dir)
# 遍历output文件夹中的所有文件
for file in os.listdir(output_path):
# 检查是否是图片文件
if file.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif', '.tiff')):
# 将图片路径添加到列表中
image_paths.append(os.path.join(output_path, file))
# 使用tqdm显示进度条
for i, image_path in enumerate(tqdm(image_paths, desc="Migrating images", unit="image")):
# 从路径中提取文件名和扩展名
file_name = os.path.basename(image_path)
# 构建目标文件的完整路径使用i作为编号
target_file = os.path.join(target_folder, f"image_{i + 1:04d}{os.path.splitext(file_name)[1]}")
# 复制图片到目标文件夹
shutil.copy2(image_path, target_file)
image_counter += 1
print(f"Total images migrated: {image_counter}")
def split_dataset(dataset_dir, output_dir, train_ratio=0.8):
for label in ['real', 'fake']:
label_dir = os.path.join(dataset_dir, label)
images = os.listdir(label_dir)
random.shuffle(images)
train_size = int(len(images) * train_ratio)
train_images = images[:train_size]
val_images = images[train_size:]
train_output_dir = os.path.join(output_dir, 'train', label)
val_output_dir = os.path.join(output_dir, 'val', label)
os.makedirs(train_output_dir, exist_ok=True)
os.makedirs(val_output_dir, exist_ok=True)
for image in train_images:
shutil.copy(os.path.join(label_dir, image), os.path.join(train_output_dir, image))
for image in val_images:
shutil.copy(os.path.join(label_dir, image), os.path.join(val_output_dir, image))
# 使用示例
input_folder = '/Users/jasonwong/Downloads/二维码测试1/手机验证码' # 替换为你的输入文件夹路径
output_folder = '/Users/jasonwong/Downloads/二维码测试1/手机验证码/output' # 替换为你的输出文件夹路径
correct_qr_code_images(input_folder, output_folder)
# source_folder = '/Users/jasonwong/Downloads/二维码测试1/仿品' # 替换为你的源文件夹路径
# target_folder = '/Users/jasonwong/Downloads/二维码测试1/dataset/fake' # 替换为你的目标文件夹路径
# migrate_images(source_folder, target_folder)
# # 使用脚本拆分数据集
# dataset_dir = '/Users/jasonwong/Downloads/二维码测试1/dataset' # 原始数据集路径
# output_dir = '/Users/jasonwong/Downloads/二维码测试1/data' # 拆分后的数据集路径
# split_dataset(dataset_dir, output_dir)