引自免费微信小程序:皆我百晓生
根据您提供的代码和描述,看起来在回放时红外图像的分辨率确实被减半。这可能是因为回放过程中数据缓冲区的大小与实际接收到的数据大小不符导致的问题。通常,这种错误提示意味着在回放时接收到的帧数据量比预期的要大。
为了解决这个问题,您可以尝试更新您的Orbbec SDK到最新版本,因为这可能是由于驱动程序或库中的一个已知bug引起的。如果您已经使用的是最新版本,那么我们可以通过修改回放代码来动态地调整缓冲区大小来解决这个问题。
首先,确保您的get_ir_image()
函数能正确处理不同格式的红外图像。然后,在回放代码中添加一些额外的逻辑来检查红外帧的尺寸,并相应地调整缓冲区大小。下面是修改后的回放代码示例:
import cv2
import numpy as np
def get_ir_image(ir_frame):
# ... 略去其他部分,保持不变 ...
def main():
try:
# 初始化回放
# ...
while True:
frames = playback.read()
if not frames:
continue
# 获取深度帧
depth_frame = frames.get_depth_frame()
if depth_frame is not None:
depth_image = get_depth_image(depth_frame)
cv2.imshow("depth", depth_image)
# 获取彩色帧
color_frame = frames.get_color_frame()
if color_frame is not None:
color_image = frame_to_bgr_image(color_frame)
cv2.imshow("color", color_image)
# 获取红外帧
ir_frame = frames.get_ir_frame()
if ir_frame is not None:
width = ir_frame.get_width()
height = ir_frame.get_height()
# 根据红外帧的尺寸创建一个新的缓冲区
ir_data = np.zeros((height, width), dtype=np.uint8)
# 将原始数据复制到新缓冲区
ir_data[:height, :width] = np.frombuffer(ir_frame.get_data(), dtype=np.uint8).reshape(height, width)
ir_image = get_ir_image(ir_frame)
cv2.imshow("ir", ir_image)
except Exception as e:
print(f"Error: {str(e)}")
finally:
# 清理资源
# ...
if __name__ == "__main__":
main()
这段代码的主要变化在于获取红外帧后,我们先获取其宽度和高度,然后创建一个对应尺寸的新缓冲区。接着,我们将原始的红外数据复制到这个新缓冲区中。这样做的目的是为了避免因缓冲区大小不匹配而产生的错误。
注意,这里假设红外帧的原始数据是以字节(uint8)存储的。如果不是这样,您需要相应地调整缓冲区的类型和大小。此外,如果红外帧的格式为 MJPG,您可能还需要在读取数据后解码它,就像在get_ir_image()
函数中那样。
如果上述方法仍无法解决问题,建议您联系Orbbec的官方支持,因为他们可能能提供更具体的帮助,包括查看日志文件,确认是否存在硬件兼容性问题或其他SDK相关问题。