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
相关产品推荐
相关产品推荐

