根据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
不知啥情况!等待后续解答