You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:02:18