如何将OpenCV读取的轮廓传入Matplotlib进行显示?
解决OpenCV轮廓在Matplotlib中显示的错误
错误原因
OpenCV的cv2.findContours()返回的contours是轮廓点的列表,每个轮廓是形状为(N, 1, 2)的numpy数组(N是该轮廓的点数量);而Matplotlib的plt.contour()需要的是二维数值数组(比如灰度图、高度图这类网格数据),两者数据格式完全不匹配,因此抛出形状不兼容的错误。
正确实现方式
要在Matplotlib中显示OpenCV检测到的轮廓,需要遍历每个轮廓,提取坐标后用plt.plot()绘制,或者先显示原图再叠加轮廓:
方法1:单独绘制轮廓
import cv2 import matplotlib.pyplot as plt img = cv2.imread('sample.jpeg') # 转灰度并二值化 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) _, bin_img = cv2.threshold(gray, 180, 255, cv2.THRESH_BINARY_INV) # 检测轮廓(传入具体参数,避免变量未定义报错) contours, hierarchy = cv2.findContours(bin_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 创建画布并绘制所有轮廓 plt.figure(figsize=(8, 8)) for cnt in contours: # 将轮廓点形状从(N,1,2)转为(N,2),提取x、y坐标 x = cnt[:, 0, 0] y = cnt[:, 0, 1] plt.plot(x, y, color='red', linewidth=2) # 翻转y轴,匹配OpenCV坐标系统(可选,根据显示效果调整) plt.gca().invert_yaxis() plt.axis('off') plt.show()
方法2:在原图上叠加轮廓显示
如果需要在原图背景上查看轮廓,先把OpenCV的BGR格式转为RGB(适配Matplotlib的颜色通道顺序),再叠加绘制:
import cv2 import matplotlib.pyplot as plt img = cv2.imread('sample.jpeg') # BGR转RGB,适配Matplotlib显示 img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) _, bin_img = cv2.threshold(gray, 180, 255, cv2.THRESH_BINARY_INV) contours, hierarchy = cv2.findContours(bin_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) plt.figure(figsize=(8, 8)) plt.imshow(img_rgb) # 遍历绘制所有轮廓 for cnt in contours: x = cnt[:, 0, 0] y = cnt[:, 0, 1] plt.plot(x, y, color='red', linewidth=2) plt.axis('off') plt.show()
补充说明
cv2.findContours()的mode和method参数必须传入具体枚举值(比如cv2.RETR_EXTERNAL、cv2.CHAIN_APPROX_SIMPLE),不能直接使用未定义的变量mode和method。- OpenCV的坐标系统y轴向下,Matplotlib默认y轴向上,若轮廓位置显示异常,可通过
plt.gca().invert_yaxis()翻转y轴。
内容的提问来源于stack exchange,提问作者Terminus
相关产品推荐
相关产品推荐

