在循环中调用OpenCV绘制圆形函数时颜色不生效,所有圆形仅显示同一种颜色
问题根因
循环绘制的圆形全部显示同色,是两处参数不匹配叠加导致的:
- 初始化画布
mat = np.zeros((500,500,3))时未指定数据类型,NumPy默认生成float64类型数组。OpenCV绘图函数处理浮点型输入图像时,默认按照0~1的取值范围解析像素值与传入的颜色参数;你生成的随机颜色是0~255的整数,所有大于1的数值都会被OpenCV直接截断为1,相当于所有圆形的颜色参数被强制固定,完全不会随循环随机变化。 - 即使修正图像数据类型,OpenCV默认按BGR通道顺序存储图像色彩,matplotlib的
imshow默认按RGB顺序解析图像,直接展示会出现红蓝通道互换的色彩偏差。
修复方法
- 初始化画布时显式指定OpenCV兼容的
uint8数据类型,匹配0~255的常规色彩取值范围 - 图像绘制完成后,转换色彩通道顺序再交给matplotlib展示
修正后的可运行代码:
from numpy import random import matplotlib.pyplot as plt import numpy as np import cv2 # 显式指定uint8类型,匹配OpenCV的色彩取值范围 mat = np.zeros((500,500,3), dtype=np.uint8) def color(): return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) for _ in range(10): x_coord = random.choice(500) y_coord = random.choice(500) color_person = color() cv2.circle(mat, (x_coord, y_coord), 10, color=color_person, thickness=20) # 将BGR顺序转换为matplotlib兼容的RGB顺序再展示 plt.imshow(cv2.cvtColor(mat, cv2.COLOR_BGR2RGB)) plt.show()
补充说明
如果确实需要保留浮点型画布的绘制逻辑,只需要将生成的随机颜色值除以255,把取值范围缩放到0~1即可匹配OpenCV的浮点图像解析规则。不过OpenCV官方推荐的常规图像存储格式为uint8类型,更适配后续的图像处理、存储流程。
内容的提问来源于stack exchange,提问作者Elmahy
相关产品推荐
相关产品推荐

