0

我正在尝试使用 OpenCV 制作一个 python 程序,该程序打开网络摄像头并实时拍摄几张具有不同曝光度的图像(40ms、95ms、150ms)并最终对它们进行平均。我尝试创建一个循环,在该循环中更改曝光时间,更新渲染(帧)并将其保存在列表中,但问题是显示保持静态并且渲染几乎没有变化(合并图像后给出图像其曝光时间几乎是 40)

我以为设置曝光时间后,帧更新需要一些时间,所以我添加了time.sleep暂停执行3秒的方法,但它是徒劳的。

这是我的代码

import numpy as np
import cv2
import os
import time

capture = cv2.VideoCapture(0, cv2.CAP_V4L2)

while True:
    (grabbed, frame) = capture.read()

    if not grabbed:
        break

    # Resize frame
    width = 1500
    height = 1000
    dim = (width, height)
    frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)
    
    cv2.imshow('RGB', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

    if cv2.waitKey(1) == ord('h') or cv2.waitKey(1) == ord('H'):
        #repertory = input("Enter the name of the directory: ")
        if not os.path.exists(repertory):
            os.mkdir(repertory)
        exposure = [40,95,150]
        ims = []
        for i in exposure:
            capture.set(cv2.CAP_PROP_EXPOSURE, i) # Setting Exposure
            (grabbed, frame) = capture.read() # Updating frame
            if grabbed:
                cv2.imshow('RGB', frame) #Display
                ims.append(frame)


        # Convert to numpy
        ims = np.array([np.array(im) for im in ims])
        # average et conversion en uint8
        imave = np.average(ims, axis=0)
        imave = imave.astype(np.uint8)

        # image HDR
        cv2.imwrite(repertory + '/' + repertory + '_HDR8.jpg', imave)


capture.release()
cv2.destroyAllWindows()

是否有最佳解决方案可以实时自动拍摄具有不同曝光时间的照片?

4

0 回答 0