OpenCV处理大尺寸图像时绘制轮廓刷新帧是否有更优实现方法?
性能优化核心方案
- 优先做显示分辨率适配
4000×4000的原始图像远大于常规显示器的可显示分辨率,无需每次重绘都操作全尺寸原始图像。初始化阶段就把原始图像缩放到实际显示的分辨率,维护这份小尺寸基准图作为重绘的底图,所有绘制操作都在小尺寸图上完成,仅在最终需要输出ROI到OpenCV做计算时,把显示层的坐标乘以缩放比例映射回原始大图即可,该优化可以直接把重绘的计算量降低一个数量级。 - 局部脏区域更新
如果确实需要操作全尺寸图像,无需每次重绘都复制整张底图。记录上一次绘制的轮廓、调节控件的坐标范围,重绘时仅把该区域的底图内容拷贝覆盖掉上一次的绘制痕迹,再在新的位置绘制新的控件即可,不需要改动全图其他区域的像素。 - 分层绘制简化逻辑
无需使用复杂的bitwise掩码操作,改用「固定底图+透明遮罩层」的两层结构即可:- 底图为固定的显示尺寸基准图,全程不需要修改
- 遮罩层为和显示尺寸一致的带透明通道的空白图层
- 每次重绘只需清空遮罩层(填充全透明,开销远低于复制彩色全图),在遮罩层上绘制轮廓和调节控件,最后把两层叠加即可得到最终显示的图像
优化后重绘代码示例
# 初始化阶段(仅执行一次) import numpy as np import cv2 # 提前计算显示尺寸,比如限制最大边长为1080像素 max_display_side = 1080 h, w = self.raw_image.shape[:2] self.scale_ratio = max(h, w) / max_display_side display_h, display_w = int(h / self.scale_ratio), int(w / self.scale_ratio) # 生成固定的显示尺寸底图,全程不修改 self.base_display = cv2.resize(self.raw_image, (display_w, display_h)) # 生成透明遮罩层 self.mask = np.zeros((display_h, display_w, 4), dtype=np.uint8) # 重绘逻辑 def redraw(self): # 清空遮罩层,开销极低 self.mask.fill(0) # 所有绘制操作都在小尺寸遮罩层完成 self.plot(self.mask, color=(0, 0, 255, 255), thickness=self.line_thickness) # 叠加两层得到显示图像 self.image = cv2.addWeighted(self.base_display, 1, self.mask[...,:3], 1, 0) self.updateimg = True
功能参考示意图

内容的提问来源于stack exchange,提问作者Jordan Larson
相关产品推荐
相关产品推荐

