Intel RealSense深度相机项目应用——生产消费模型

近期因为项目需要,使用了intel的深度相机,此处重点记录一下如何使用Python语言完成生产消费者模型来调用相机图像,此处使用的相机型号为SR305(该相机使用的是intel实感SDK2.0,据intel介绍是通用于多数型号的)因为是第一次使用,如有理解不到位或者错误的情况,还请大家批评指正!

"""
生产消费模型(基于线程)
"""
import pyrealsense2 as rs
import cv2
from threading import Thread
from collections import deque
import numpy as np
import time


def producer(cap, q):
    while True:
        print('producer execuation')
        if cap.isOpened():
            start = time.time()
            ret, img = cap.read()
            q.append(img)
            end = time.time()
            print("生产图片的时间为", (end - start))


def consumer(q):
    while True:
        if len(q) == 0:
            pass
        else:
            img = q.pop()
            print('consumer execuation')

            cv2.imshow('img_multi_process', img)
            cv2.waitKey(1)


if __name__ == '__main__':
    
    pipeline = rs.pipeline()  # 构建一个抽象设备的管道
    config = rs.config()  # 使用非默认配置文件创建配置以配置管道
    config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)
    config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
    profile = pipeline.start(config)  # 表示构建的管道使用上述配置开始流传输

    # 获取深度比例
    depth_sensor = profile.get_device().first_depth_sensor()
    depth_scale = depth_sensor.get_depth_scale()

    align_to = rs.stream.color  # 深度对齐彩色,彩色图不变,深度图变化
    # align_to = rs.stream.depth  # 彩色图对齐深度图,深度图不变,彩色图变化
    align = rs.align(align_to)  # rs.align允许我们执行深度帧与其他帧的对齐

    frames = pipeline.wait_for_frames()  # 等待所有配置的流生成一个帧
    aligned_frames = align.process(frames)  # 将深度框与颜色框对齐,aligned_frames是对齐后的帧集合

    aligned_depth_frame = aligned_frames.get_depth_frame()  # 从对齐后的帧集合中调取深度帧
    color_frame = frames.get_color_frame()  # 从帧集合中调取彩色帧

    color_image = np.asanyarray(color_frame.get_data())  # 从彩色帧中取图像
    depth_image = np.asanyarray(aligned_depth_frame.get_data())  # 从深度帧中取图像

    # 获取相机颜色帧内参
    color_profile = color_frame.get_profile()
    cvsprofile = rs.video_stream_profile(color_profile)
    color_intrin = cvsprofile.get_intrinsics()
    color_intrin_part = [color_intrin.ppx, color_intrin.ppy, color_intrin.fx, color_intrin.fy]  # [ppx, ppy, fx, fy]fx与fy代表焦距,
    # ppx,ppy 相机内参矩阵主坐标  目标点实际位置换算到像素图上后的x、y方向的误差补偿(或偏置)

    camera = cv2.VideoCapture(0)

    frame_deque = deque(maxlen=10)
    cap = cv2.VideoCapture(0)
    p1 = Thread(target=producer, args=(cap, frame_deque))
    p2 = Thread(target=consumer, args=(frame_deque,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
"""
生产消费模型(基于进程)
"""
from threading import Thread
from multiprocessing import Queue, Process
import cv2
import numpy as np
import time
import pyrealsense2 as rs

def producer(q):
    pipeline = rs.pipeline()  # 构建一个抽象设备的管道
    config = rs.config()  # 使用非默认配置文件创建配置以配置管道
    config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)
    config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
    profile = pipeline.start(config)  # 表示构建的管道使用上述配置开始流传输

    # 获取深度比例
    depth_sensor = profile.get_device().first_depth_sensor()
    depth_scale = depth_sensor.get_depth_scale()

    align_to = rs.stream.color  # 深度对齐彩色,彩色图不变,深度图变化
    # align_to = rs.stream.depth  # 彩色图对齐深度图,深度图不变,彩色图变化
    align = rs.align(align_to)  # rs.align允许我们执行深度帧与其他帧的对齐

    frames = pipeline.wait_for_frames()  # 等待所有配置的流生成一个帧
    aligned_frames = align.process(frames)  # 将深度框与颜色框对齐,aligned_frames是对齐后的帧集合

    aligned_depth_frame = aligned_frames.get_depth_frame()  # 从对齐后的帧集合中调取深度帧
    color_frame = frames.get_color_frame()  # 从帧集合中调取彩色帧

    color_image = np.asanyarray(color_frame.get_data())  # 从彩色帧中取图像
    depth_image = np.asanyarray(aligned_depth_frame.get_data())  # 从深度帧中取图像

    # 获取相机颜色帧内参
    color_profile = color_frame.get_profile()
    cvsprofile = rs.video_stream_profile(color_profile)
    color_intrin = cvsprofile.get_intrinsics()
    color_intrin_part = [color_intrin.ppx, color_intrin.ppy, color_intrin.fx,
                         color_intrin.fy]  # [ppx, ppy, fx, fy]fx与fy代表焦距,
    # ppx,ppy 相机内参矩阵主坐标  目标点实际位置换算到像素图上后的x、y方向的误差补偿(或偏置)
    
    camera = cv2.VideoCapture(0)

    while True:
        print("producer execuation")
        res, frame = camera.read()
        q.put(frame)

def consumer(q):  
    while True:
        print("consumer execuation")
        img = q.get()
        
        if img is None:
            print("there is no image!")
        cv2.imshow("consumer", img)
        cv2.waitKey(1)


if __name__ == '__main__':
    
    q = Queue(maxsize=100)
    p1 = Process(target=producer, args=(q, ))
    p2 = Process(target=consumer, args=(q, ))
    p1.start()
    p2.start()
    p1.join()
    p2.join()