如何为OpenCV绘制的多边形设置虚线或点线样式?
如何用OpenCV绘制虚线/点线多边形
当然可以实现!不过OpenCV的cv2.polylines函数本身并没有直接提供设置虚线/点线的参数,我们可以通过两种简单的方式来达成需求:
方法1:手动分段绘制虚线(兼容所有OpenCV版本)
这种方法的核心思路是把多边形的每条边拆成「绘制段」和「空白段」交替的小线段,只绘制那些「绘制段」,最终形成虚线效果。
直接上代码示例:
import cv2 import numpy as np # 初始化空白mask图像 mask = np.zeros((500, 500, 3), dtype=np.uint8) # 示例多边形顶点 pts = np.array([[100, 100], [300, 100], [300, 300], [100, 300]], np.int32) ignore_mask_color = (255, 0, 0) # 蓝色 # 定义虚线参数:每画5像素,跳过3像素 dash_length = 5 gap_length = 3 # 遍历多边形的每条边(闭合多边形,最后一点连回起点) for i in range(len(pts)): start = pts[i] end = pts[(i+1)%len(pts)] # 计算边的向量和总长度 dx = end[0] - start[0] dy = end[1] - start[1] length = np.sqrt(dx**2 + dy**2) if length == 0: continue # 计算单位方向向量 unit_x = dx / length unit_y = dy / length # 分段绘制虚线 current_pos = np.array(start, dtype=np.float32) draw_flag = True # 标记当前是否要绘制线段 remaining_length = length while remaining_length > 0: # 确定当前段的长度(绘制段用dash_length,空白段用gap_length) segment_len = dash_length if draw_flag else gap_length if segment_len > remaining_length: segment_len = remaining_length # 计算当前段的终点 next_pos = current_pos + segment_len * np.array([unit_x, unit_y]) next_pos_int = next_pos.astype(np.int32) # 如果是绘制段,就画这条小线段 if draw_flag: cv2.line(mask, tuple(current_pos.astype(np.int32)), tuple(next_pos_int), ignore_mask_color, 2) # 更新位置和剩余长度,切换绘制标记 current_pos = next_pos remaining_length -= segment_len draw_flag = not draw_flag cv2.imshow('Dashed Polygon', mask) cv2.waitKey(0) cv2.destroyAllWindows()
方法2:利用OpenCV 4.5+的线Dash模式(更简洁)
如果你使用的是OpenCV 4.5.0及以上版本,可以用cv2.setLineDashPattern设置全局线样式,之后直接调用cv2.polylines就能画出虚线,记得绘制完成后恢复默认实线样式:
import cv2 import numpy as np mask = np.zeros((500, 500, 3), dtype=np.uint8) pts = np.array([[100, 100], [300, 100], [300, 300], [100, 300]], np.int32) ignore_mask_color = (255, 0, 0) # 设置dash模式:列表第一个值是绘制长度,第二个是空白长度 cv2.setLineDashPattern([5, 3]) # 绘制闭合多边形 cv2.polylines(mask, [pts], True, ignore_mask_color, thickness=2) # 恢复默认实线样式 cv2.setLineDashPattern([]) cv2.imshow('Dashed Polygon', mask) cv2.waitKey(0) cv2.destroyAllWindows()
注意:cv2.setLineDashPattern是全局设置,如果你之后还要绘制实线,一定要记得把dash模式重置为空列表。
内容的提问来源于stack exchange,提问作者prosenjit
相关产品推荐
相关产品推荐

