D435 pyrealsense 如何实时获取摄像头的曝光值?get_frame_metadata(rs.frame_metadata_value.actual_exposure)成功了(更新UWP)
文章目錄
- 200123
根據 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);elsereturn 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 : sxana@qq.com @Software: PyCharm """import time import numpy as np import pyrealsense2 as rs import cv2ctx = 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 0while 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 availableProcess finished with exit code 1不知啥情況!等待后續解答
200123
今天github的官方客服人員終于回復我了,他們建議我在獲取值之前先檢測一下是否支持,,
我重新將代碼跑了一遍,這回可以獲取了,見鬼!
近乎同樣的代碼,為啥上次不行,這次又好了??
代碼:
# -*- coding: utf-8 -*- """ @File : 200110_測試攝像頭實時獲取曝光值.py @Time : 2020/1/10 0:57 @Author : Dontla @Email : sxana@qq.com @Software: PyCharm """import time import numpy as np import pyrealsense2 as rs import cv2ctx = 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 0while 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)
用上次的代碼跑,也是成功的,見鬼!!
也許是更新了Intel Realsense SDK或UWP導致的??(有眾多數據支持更新UWP能獲取元數據)
從不能獲取元數據,到現在可以獲得了??
參考文章1:How to get the current exposure value of the camera auto exposure mode with code? #5596
參考文章2:Hint that metadata support requires OS level settings/changes #5669
參考文章3:Enable metadata with a single click on Windows #5678
總結
以上是生活随笔為你收集整理的D435 pyrealsense 如何实时获取摄像头的曝光值?get_frame_metadata(rs.frame_metadata_value.actual_exposure)成功了(更新UWP)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQ 小车避障 Intel Realse
- 下一篇: python opencv Intel