使用gradio和opencv实现摄像头的读取

发布时间 2023-08-07 17:04:48作者: bldong

测试程序的界面如下:

其程序在多线程实现摄像机读取的基础上直接进行调用和读取。

代码中实现前后摄像头的读取。

class IntelliGuideTab:
    def __init__(self) -> None:
        self.camera_info = {"height": 480, "width": 640}
        self.create_ui()

        self.camera1_process = None
        self.camera0_process = None
        self.camera0 = None
        self.camera1 = None
        self.create_camera()

    def create_camera(self):
        self.camera0 = CameraBroadcaster(self.camera_info,0)
        self.camera0_process = Process(target=self.camera0.run)
        self.camera0_process.start()

        self.camera1 = CameraBroadcaster(self.camera_info, 1)
        self.camera1_process = Process(target=self.camera1.run)
        self.camera1_process.start()


    def inference(self):
        while True:
            #图像从共享内存中获取
            frame0 = np.ndarray((self.camera0.height, self.camera0.width, 3), dtype=np.uint8,
                                buffer=self.camera0.frame.buf)
            frame1 = np.ndarray((self.camera1.height, self.camera1.width, 3), dtype=np.uint8,
                                buffer=self.camera1.frame.buf)

            #必须转换,否则显示图像有问题,主要是opencv读取是BGR,显示是RGB
            frame0 = cv2.cvtColor(frame0, cv2.COLOR_BGR2RGB)
            frame1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2RGB)

            #此处必须是while循环,然后不停地返回图像
            yield frame0,frame1


    def stop(self):
        #此处stop不起作用个,不知道为啥
        print("start stop read camera")
        self.camera0.stop_sign.value = True
        self.camera0_process.join()

        self.camera0.stop_sign.value = True
        self.camera1_process.join()
        print("finish stop read camera")


    def create_ui(self):
        #按照格局进行图像控件的读取
        with gr.Column():
            with gr.Row():
                front_ouput = gr.Image(
                    label='前置',
                    source='upload',
                    width=self.camera_info["width"],
                    height=self.camera_info["height"],
                    interactive=False
                )

                back_input = gr.Image(
                    label='后置',
                    source='upload',
                    width=self.camera_info["width"],
                    height=self.camera_info["height"],
                    interactive=False
                )

        with gr.Row():
            start_btn = gr.Button("Start")
            #关键点在这,inference是处理函数,返回值是两个图像,然后绑定在gr.Image中
            start_btn.click(self.inference, outputs=[front_ouput, back_input])

            stop_btn = gr.Button("Stop")
            stop_btn.click(self.stop)





if __name__ == "__main__":
    title = 'Web Demo'

    DESCRIPTION = '''its corresponding grounding mask'''

    with gr.Blocks(analytics_enabled=False, title=title) as demo:
        gr.Markdown(DESCRIPTION)
        with gr.Tabs():
            with gr.TabItem('IntelliGuide'):
                IntelliGuideTab()
    demo.queue().launch()

本来在程序中将图像放入到queue中,然后主线程获取,发现主线程获取较慢,导致显示延缓,queue的size不停地变大