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

OpenCV FindContours报错:需转灰度图但未解决,请求技术支持

解决OpenCV findContours的格式不支持错误

问题根源

你遇到的报错明确说明findContours仅支持单通道(CV_8UC1)图像(当模式不是CV_RETR_FLOODFILL时),你的代码里虽然已经将median_binary转成了灰度图gray,但实际传入findContours的还是三通道的median_binary,这就是错误的核心原因。

修正方案

最小改动解决问题

只需要把findContours的输入参数换成你已经生成的单通道灰度图gray即可:

# 原代码
contours, hierarchy = cv2.findContours(median_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 修改后
contours, hierarchy = cv2.findContours(gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

优化处理流程(可选)

你的代码从skinRegionYCrCb开始可以简化,因为skinRegionYCrCb本身就是单通道掩码,不需要转成三通道的skinYCrCb再处理,能减少计算量同时天然满足findContours的输入要求:

import cv2
import numpy as np

img = cv2.imread("s.jpg")

while True:
    ycrbc = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
    
    minYCrCb = np.array([0,140,90],np.uint8)
    maxYCrCb = np.array([230,170,120],np.uint8)
    imgeYCrCb = cv2.cvtColor(img,cv2.COLOR_BGR2YCR_CB)
    skinRegionYCrCb = cv2.inRange(imgeYCrCb,minYCrCb,maxYCrCb)
    
    # 直接对单通道掩码做模糊,无需生成三通道图像
    median_ycrcb = cv2.medianBlur(skinRegionYCrCb, 3)
    
    # 阈值处理后直接得到单通道二值图
    _, esik = cv2.threshold(median_ycrcb, 20, 255, cv2.THRESH_BINARY)
    median_binary = cv2.medianBlur(esik, 7)
    
    # 无需额外转灰度,median_binary已是单通道
    contours, hierarchy = cv2.findContours(median_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

    areas = [cv2.contourArea(c) for c in contours]
    max_index = np.argmax(areas)
    x,y,w,h = cv2.boundingRect(contours[max_index])

    print(x, y, x+w, y+h)
    
    cv2.imshow("ycrbc",ycrbc)
    cv2.imshow("skin mask",median_ycrcb)
    cv2.imshow("binary goruntu", esik)
    cv2.imshow("median_binary", median_binary)
    
    if cv2.waitKey(5) & 0xFF == ord("q"):
        break

cv2.destroyAllWindows()

说明

  • 第一种方案是最小改动,替换参数即可快速解决错误;
  • 第二种方案优化了图像处理流程,避免不必要的三通道计算,运行效率更高。

内容的提问来源于stack exchange,提问作者Eren Yanic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 14:45:24