dearpygui库的使用
作为一名CV调包侠,高大上的人工智算法当然要好好包装下,做一手好demo也就成了必备技能。
实际使用时经常需要将摄像头输入的图片,检测结果的bounding box,以及各项指标动态的绘制在GUI界面上,
通过各种动态图表,曲线甚至炫酷的3d动画让我们的demo高大上。
今天这些需求都能在一个强大的Python库中实现:dearpygui.
dearpygui介绍
先上几个由dearpygui创建的效果图:
甚至可以用来做二维游戏
- hello world
下面这个包含了button, textlabel, trackbar的界面
可以用下面寥寥几行代码实现:
import dearpygui.dearpygui as dpg
def save_callback():
print("Save Clicked")
with dpg.window(label="Example Window"):
dpg.add_text("Hello world")
dpg.add_button(label="Save", callback=save_callback)
dpg.add_input_text(label="string")
dpg.add_slider_float(label="float")
dpg.setup_viewport()
dpg.start_dearpygui()
更多demo代码:
https://github.com/Pcothren/DearPyGui-Examples
OpenCV+dearpygui读取&显示视频demo
如何把OpenCV读取的图片用dearpygui显示呢?网上没有找到啥相关资料,所以自己做了个:
https://github.com/lyyiangang/dearpygui_demo.git
import cv2
import numpy as np
import dearpygui.dearpygui as dpg
def to_rgb(bgr_img):
return bgr_img[..., [2, 1, 0]]
def normalize(img):
return img.astype(np.float32) / 255
def run():
video_file = 'data/1607125853136.mp4'
cap = cv2.VideoCapture(video_file)
assert cap.isOpened(), f'can not open video file {video_file}'
_, first_frame = cap.read()
h, w = first_frame.shape[:2]
raw_data = np.zeros((h,w,3), np.float32)
with dpg.texture_registry():
texture_id = dpg.add_raw_texture(w, h, raw_data, format=dpg.mvFormat_Float_rgb)
with dpg.window(label="Main"):
dpg.add_image(texture_id)
# equal to dpg.start_dearpygui()
if not dpg.is_viewport_created():
dpg.setup_viewport()
while(dpg.is_dearpygui_running()):
print('loop----------')
ret, bgr_img = cap.read()
if not ret:
break
# 需要转换为rgb格式,并归一化到[0, 1]
norm_rgb_img = normalize(to_rgb(bgr_img))
raw_data[...] = norm_rgb_img[...]
dpg.render_dearpygui_frame()
dpg.cleanup_dearpygui()
if __name__ == '__main__':
run()
对于上面的代码需要注意几点:
- dearpygui使用的图片是rgb格式,并且要归一化到[0, 1],为浮点类型数据。
- 官方demo用的都是dpg.start_dearpygui()启动主循环,但是对于这个例子来说,需要在每帧render时读取视频里一帧新图片,所以这里使用下列代码实现:
if not dpg.is_viewport_created():
dpg.setup_viewport()
while(dpg.is_dearpygui_running()):
print('loop----------')
ret, bgr_img = cap.read()
if not ret:
break
# 需要转换为rgb格式,并归一化到[0, 1]
norm_rgb_img = normalize(to_rgb(bgr_img))
raw_data[...] = norm_rgb_img[...]
dpg.render_dearpygui_frame()
dpg.cleanup_dearpygui()
结果如下:
接下来就可以抄抄demo中代码,在视频上动态的绘制帧率,曲线动画什么的了