D435 pyrealsense 如何在帧传输中实时获取摄像头的曝光值?get_frame_metadata(rs.frame_metadata_value.actual_exposure) 失败了

根据Intel Realsense D435 测试摄像头在不同曝光值下的帧生成时间(防止曝光时间过长导致fps下降)auto_exposure_priority(没成功),使用获取传感器sensor然后获取实时自动曝光曝光值的方法失败了,于是尝试寻找其他办法,在github上又询问了官方人员,热心网友radfordi给出了一个方案:

long long get_exposure_time(const rs2::frame &f) {
    if (f.supports_frame_metadata(RS2_FRAME_METADATA_ACTUAL_EXPOSURE))
        return f.get_frame_metadata(RS2_FRAME_METADATA_ACTUAL_EXPOSURE);
    else
        return 0; // unknown
}

引用自:How to get the current exposure value of the camera auto exposure mode with code?
#5596

该方案通过获取帧的元数据来获取实际曝光值,

代码不是python的,尝试转成python

def get_exposure_time(color_frame):
    if color_frame.supports_frame_metadata(rs.frame_metadata_value.actual_exposure):
        return color_frame.get_frame_metadata(rs.frame_metadata_value.actual_exposure)
    else:
        return 0

完整代码:

# -*- coding: utf-8 -*-
"""
@File    : 200110_测试摄像头实时获取曝光值.py
@Time    : 2020/1/10 0:57
@Author  : Dontla
@Email   : [email protected]
@Software: PyCharm
"""

import time
import numpy as np
import pyrealsense2 as rs
import cv2

ctx = rs.context()

for dev in ctx.query_devices():
    # 先将设备的序列号放进一个变量里,免得在下面for循环里访问设备的信息过多(虽然不知道它会不会每次都重新访问)
    dev_serial = dev.get_info(rs.camera_info.serial_number)
    # 匹配序列号,重置我们需重置的特定摄像头(注意两个for循环顺序,哪个在外哪个在内很重要,不然会导致刚重置的摄像头又被访问导致报错)
    if '838212073161' == dev_serial:
        dev.hardware_reset()
        # 像下面这条语句居然不会报错,不是刚刚才重置了dev吗?莫非区别在于没有通过for循环ctx.query_devices()去访问?
        # 是不是刚重置后可以通过ctx.query_devices()去查看有这个设备,但是却没有存储设备地址?如果是这样,
        # 也就能够解释为啥能够通过len(ctx.query_devices())函数获取设备数量,但访问序列号等信息就会报错的原因了
        print('摄像头{}初始化成功'.format(dev.get_info(rs.camera_info.serial_number)))
# 如果只有一个摄像头,要让它睡够5秒(避免出错,保险起见)
time.sleep(5)

pipeline = rs.pipeline(ctx)
cfg = rs.config()
cfg.enable_device('838212073161')
cfg.enable_stream(rs.stream.depth, 640, 360, rs.format.z16, 30)
cfg.enable_stream(rs.stream.color, 640, 360, rs.format.bgr8, 30)
pipeline_profile = pipeline.start(cfg)

sensor = pipeline.get_active_profile().get_device().query_sensors()[1]


def get_exposure_time(color_frame):
    if color_frame.supports_frame_metadata(rs.frame_metadata_value.actual_exposure):
        return color_frame.get_frame_metadata(rs.frame_metadata_value.actual_exposure)
    else:
        return 0


while True:
    frames = pipeline.wait_for_frames()
    color_frame = frames.get_color_frame()
    depth_frame = frames.get_depth_frame()

    print(color_frame.get_frame_metadata(rs.frame_metadata_value.actual_exposure))

    color_image = np.asanyarray(color_frame.get_data())
    cv2.imshow('win', color_image)
    cv2.waitKey(1)
    # cv2.imwrite('{:.3f}.jpg'.format(time.time()), color_image)

运行后直接报错了:

D:\20191031_tensorflow_yolov3\python\python.exe D:/2_pycharm测试项目/200108_测试获取Intel_Realsense_options参数/200110_测试摄像头实时获取曝光值.py
摄像头838212073161初始化成功
Traceback (most recent call last):
  File "D:/2_pycharm测试项目/200108_测试获取Intel_Realsense_options参数/200110_测试摄像头实时获取曝光值.py", line 52, in <module>
    print(color_frame.get_frame_metadata(rs.frame_metadata_value.actual_exposure))
RuntimeError: metadata not available

Process finished with exit code 1

不知啥情况!等待后续解答

发布了747 篇原创文章 · 获赞 28 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/Dontla/article/details/103917544