0

我正在尝试使用 PiCamera 创建一个 ROI(感兴趣区域)功能。为了了解“缩放”方法的工作原理,我尝试从一系列 ROI 图像中创建完整图像。这是我的代码:

from picamera.camera import PiCamera
from picamera.array import PiRGBArray
import time
import cv2

FULL_H = 1920
FULL_W = 2560

n_rows = 3
n_cols = 4

cam = PiCamera(0)
cam.framerate = 32
cam.awb_mode = 'fluorescent'
cam.shutter_speed = 3200
cam.resolution = FULL_W, FULL_H
cam.sensor_mode = 2
frame = PiRGBArray(cam)

# Take full resolution picture
cam.capture(frame, format="bgr", use_video_port=False)
cv2.imwrite("full_img.png", frame.array)

# Set the resolution to ROI resolution and zoom to first section
cam.resolution = int(1 / n_cols * FULL_W), int(1 / n_rows * FULL_H)
cam.zoom = (0.0, 0.0, 1 / n_cols, 1 / n_rows)
frame = PiRGBArray(cam)

# Camera init time
time.sleep(2)

# Loop over rows and columns and take ROI images
rows = []
for i in range(n_rows):
    row = []
    for j in range(n_cols):
        print("Zooming to: {}".format((j / n_cols, i / n_rows, 1 / n_cols, 1 / n_rows)))
        cam.zoom = (j / n_cols, i / n_rows, 1 / n_cols, 1 / n_rows)  # zoom into correct part
        time.sleep(0.1)  # Give camera time to zoom
        frame.truncate(0)
        cam.capture(frame, format="bgr", use_video_port=True)  # Take ROI picture
        row.append(frame.array)
    rows.append(row)

# Concatinate the columns into rows and then rows into full image
full_rows = []
for row in rows:
    full_rows.append(cv2.hconcat(row))
full_img = cv2.vconcat(full_rows)
cv2.imwrite("full_img_from_rois.png", full_img)  # Write the assembled image to file

cam.close()

这是输出:

Zooming to: (0.0, 0.0, 0.25, 0.3333333333333333)
Zooming to: (0.25, 0.0, 0.25, 0.3333333333333333)
Zooming to: (0.5, 0.0, 0.25, 0.3333333333333333)
Zooming to: (0.75, 0.0, 0.25, 0.3333333333333333)
Zooming to: (0.0, 0.3333333333333333, 0.25, 0.3333333333333333)
Zooming to: (0.25, 0.3333333333333333, 0.25, 0.3333333333333333)
Zooming to: (0.5, 0.3333333333333333, 0.25, 0.3333333333333333)
Zooming to: (0.75, 0.3333333333333333, 0.25, 0.3333333333333333)
Zooming to: (0.0, 0.6666666666666666, 0.25, 0.3333333333333333)
Zooming to: (0.25, 0.6666666666666666, 0.25, 0.3333333333333333)
Zooming to: (0.5, 0.6666666666666666, 0.25, 0.3333333333333333)
Zooming to: (0.75, 0.6666666666666666, 0.25, 0.3333333333333333)

我将整个图像分成 12 个正方形部分(3 行,4 列),从而产生 12 个 640x640 图像。然后我连接这些图像并尝试重新创建完整的 2560x1920 图像。

这些是我得到的图片(图片太大,无法直接上传,抱歉):

完整图片 - https://imgur.com/QXIMGXJ

组装的图像 - https://imgur.com/EtURnML

希望您能看到组装后的图像似乎被“压扁”了,也没有覆盖传感器的全部范围(两边都缺少一些数字)。有些部分的白平衡似乎也有问题,这可能是解决方案的线索,但我不知道为什么会这样。

为什么缩放功能会这样?它可以以某种方式修复吗?为什么白平衡在图像的下部表现得很奇怪?

如果这是“缩放”方法不可避免的行为,有没有办法让完整图像以与组装图像相同的方式显示(可能是裁剪和压扁)这很重要,因为我想使用 ROI 图像与完整图像的各个部分进行比较,我希望它们相同

4

0 回答 0