当前位置: 首页 > 知识库问答 >
问题:

获取错误“在函数cvStartFindContours中FindContours仅支持8uC1和32sC1图像”

商迪
2023-03-14

我尝试使用图像处理技术,如直方图反投影和形态学滤波,但每当我试图在处理后的图像上找到轮廓时,它总是给我一个错误:

line 66, in <module>
    contours, hierarchy = cv2.findContours(thresh.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
error: /build/buildd/opencv-2.4.8+dfsg1/modules/imgproc/src/contours.cpp:196: error: (-210) [Start]FindContours support only 8uC1 and 32sC1 images in function cvStartFindContours

我试图找到多种方法将我处理过的图像转换成8uC1或32sC1,但都失败了。有人能告诉我如何将图像转换为8uC1或32sC1类型,以便在图像中找到轮廓吗?

代码:

import cv2
import numpy as np
from pyimagesearch import imutils
from PIL import Image

def invert_img(img):
    img = (255-img)
    return img

roi = cv2.imread('images/surgeon_2.jpg')

hsv = cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)

target = cv2.imread('images/surgeon_2.jpg')

hsvt = cv2.cvtColor(target,cv2.COLOR_BGR2HSV)

img_height = target.shape[0]
img_width = target.shape[1]

# calculating object histogram
roihist = cv2.calcHist([hsv],[0, 1], None, [180, 256], [0, 180, 0, 256] )

# normalize histogram and apply backprojection
cv2.normalize(roihist,roihist,0,255,cv2.NORM_MINMAX)
dst = cv2.calcBackProject([hsvt],[0,1],roihist,[0,180,0,256],1)

# Now convolute with circular disc
disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
cv2.filter2D(dst,-1,disc,dst)

# threshold and binary AND
ret,thresh = cv2.threshold(dst,50,255,0)
thresh = cv2.merge((thresh,thresh,thresh))
res = cv2.bitwise_and(target,thresh)

# Showing before morph
thresh_c = thresh.copy()
img_c = np.vstack((target,thresh_c,res))
img_c = imutils.resize(img_c, height = 700)
cv2.imshow('Before morph', thresh_c)


# Implementing morphological erosion & dilation
kernel = np.ones((9,9),np.uint8)
thresh = cv2.erode(thresh, kernel, iterations = 1)
thresh = cv2.dilate(thresh, kernel, iterations=1)


# Invert the image
thresh = invert_img(thresh)


res = np.vstack((target,thresh,res))
#cv2.imwrite('res.jpg',res)
res = imutils.resize(res, height = 700)
cv2.imshow('After morph', res)
cv2.waitKey(0)


# Code to draw the contours
contours, hierarchy = cv2.findContours(thresh.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cnts = sorted(contours, key = cv2.contourArea, reverse = True)[:5]
cv2.drawContours(thresh.copy(), cnts, -1,(0,255,0),2)
cv2.imshow('All contours', thresh)
cv2.waitKey(0)

共有1个答案

苏高旻
2023-03-14
###findContours function works on GRAYSCALE (monochrome) image.
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5, 5), 0)
thresh = gray 
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,  
cv2.CHAIN_APPROX_SIMPLE)
 类似资料:
  • 试图在二进制图像上运行findContour” thorws错误: 有什么想法吗?谢啦

  • 我在火灾探测方面有问题我的代码是: 当我运行这个程序时,看到这个错误 请帮帮我。tnx

  • 我试图对我的图像进行预处理,以便最终从预处理后的图像中找到轮廓。 它给了我一个错误说明:OpenCV错误:cvStartFindContours中不支持的格式或格式组合([Start]FindContours在模式下仅支持CV_8UC1图像!=CV_RETR_FLOODFILL,否则仅支持CV_32SC1图像) 我用的是opencv3.0

  • 我已经将我的图像文件转换为灰度,然后对其进行模糊处理并使用canny,结果是uint8,但我仍然得到了错误。请帮忙!

  • 北京优锘科技有限公司 地址:北京市朝阳区酒仙桥路10号恒通国际商务园B23A 联系电话:400-666-9832 业务咨询:info@uino.com 售后服务:thingjs@uino.com

  • 更多教程 Cocos 引擎官方微信公众号 Cocos 引擎官方微信公众号,第一时间为您送上引擎动态、精品教程、达人专访等干货。 哔哩哔哩 — Cocos 官方 不定期直播、以及官方教程等持续更新中。 演示和范例项目 注意,所有 GitHub 上的演示和范例项目都会跟随版本进行更新,默认分支对应目前最新的 Cocos Creator 版本,老版本的项目会以 v0.7 这样的分支名区分,分支名会和相同