树莓派环境下Python实现二维码图片多行列排版对齐技术问询
实现任意行列的二维码图片拼接方案
我在Raspberry Pi 4 Model B 32位系统(Linux 5.15.61-v8)的Python3虚拟环境中,用摄像头(包括罗技USB摄像头)完成了二维码图片的捕获和桌面保存,目前已经实现了1×2格式的图片拼接,现在需要知道怎么实现3×3、5×10等多行列的图片排版对齐,用来对比二维码打印是否合格。
现有捕获图片代码
import cv2 import time cap = cv2.VideoCapture(0) # 摄像头设备(这里用的是罗技USB摄像头) ret,frame = cap.read() # 读取单帧画面 # 设置捕获时长:4分钟 time_end = time.time() + 60*4 while time.time() < time_end: while(True): cv2.imshow('img1',frame) # 显示捕获的画面 if cv2.waitKey(60) & 0xFF == ord('y'): # 按'y'键保存图片 # 自定义保存路径 cv2.imwrite('/home/sam/Desktop/pic.png',frame) cv2.destroyAllWindows() break cap.release() break
现有1×2拼接代码
from PIL import Image # 读取两张图片 image1 = Image.open('/home/joy/Desktop/pic.png') image1.show() image2 = Image.open('/home/joy/Desktop/pic_02.png') image2.show() # 统一图片尺寸 image1 = image1.resize((426, 240)) image2 = image2.resize((426, 240)) image1_size = image1.size # 创建空白拼接图:宽度为2倍单图宽,高度为单图高,背景浅灰 new_image = Image.new('RGB',(2*image1_size[0], image1_size[1]), (250,250,250)) new_image.paste(image1,(0,0)) new_image.paste(image2,(image1_size[0],0)) new_image.save("/home/joy/Desktop/pic_final.png","PNG") new_image.show()
通用多行列图片拼接实现
要实现任意行列(比如3×3、5×10)的排版对齐,核心是统一所有图片尺寸,然后根据行列数计算拼接大图的尺寸,再按行列顺序将图片粘贴到对应位置。
步骤说明
- 先将所有需要拼接的图片 resize 成相同的尺寸(保证对齐)
- 根据指定的行数
rows和列数cols,计算拼接后大图的宽(单图宽×cols)和高(单图高×rows) - 创建空白背景图,背景色可自定义
- 遍历每张图片,计算它在大图中的坐标:
x = (列索引) × 单图宽,y = (行索引) × 单图高,然后粘贴到对应位置
通用拼接代码
from PIL import Image import os def grid_image_collage(image_paths, rows, cols, img_size=(426, 240), bg_color=(250,250,250)): """ 生成任意行列的图片拼接图 :param image_paths: 所有待拼接图片的路径列表 :param rows: 拼接的行数 :param cols: 拼接的列数 :param img_size: 统一后的单图尺寸 (宽, 高) :param bg_color: 背景色 RGB 元组 """ # 检查图片数量是否匹配行列数,不足则用空白填充 total_imgs = rows * cols if len(image_paths) < total_imgs: image_paths += [None]*(total_imgs - len(image_paths)) # 统一所有图片尺寸 images = [] for path in image_paths: if path: img = Image.open(path).resize(img_size) images.append(img) else: # 空白图片填充 blank_img = Image.new('RGB', img_size, bg_color) images.append(blank_img) # 计算拼接大图的尺寸 collage_width = img_size[0] * cols collage_height = img_size[1] * rows # 创建空白大图 collage = Image.new('RGB', (collage_width, collage_height), bg_color) # 遍历粘贴每张图片 for i in range(rows): for j in range(cols): img_idx = i * cols + j x = j * img_size[0] y = i * img_size[1] collage.paste(images[img_idx], (x, y)) return collage # ------------------- 示例用法 ------------------- # 示例1:3×3拼接(假设你有9张图片在桌面,命名为pic_01.png到pic_09.png) img_paths_3x3 = [f'/home/joy/Desktop/pic_{str(i).zfill(2)}.png' for i in range(1,10)] collage_3x3 = grid_image_collage(img_paths_3x3, rows=3, cols=3) collage_3x3.save('/home/joy/Desktop/collage_3x3.png', 'PNG') collage_3x3.show() # 示例2:5×10拼接(假设你有50张图片,不足则自动补空白) img_paths_5x10 = [f'/home/joy/Desktop/pic_{str(i).zfill(2)}.png' for i in range(1,51)] collage_5x10 = grid_image_collage(img_paths_5x10, rows=5, cols=10) collage_5x10.save('/home/joy/Desktop/collage_5x10.png', 'PNG') collage_5x10.show()
优化后的批量捕获图片代码
原捕获代码只能捕获1张图片,如果你需要批量捕获多张二维码图片,可以用下面的代码:按'y'保存当前帧,按'q'退出捕获
import cv2 import time cap = cv2.VideoCapture(0) # 设置捕获的图片编号起始值 img_count = 1 # 捕获时长:4分钟 time_end = time.time() + 60*4 while time.time() < time_end: ret, frame = cap.read() if not ret: break cv2.imshow('Capture', frame) key = cv2.waitKey(60) & 0xFF if key == ord('y'): # 按'y'保存图片,自动编号 save_path = f'/home/joy/Desktop/pic_{str(img_count).zfill(2)}.png' cv2.imwrite(save_path, frame) print(f"已保存图片:{save_path}") img_count += 1 elif key == ord('q'): # 按'q'提前退出 print("提前退出捕获") break cap.release() cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者j ton
相关产品推荐
相关产品推荐

