Я пытаюсь преформировать методы обработки изображений, такие как обратное проектирование гистограммы и морфологическая фильтрация, но всякий раз, когда я пытаюсь найти контур на обработанном изображении, он продолжает давать мне ошибка:Получение ошибки «FindContours поддерживает только изображения 8uC1 и 32sC1 в функции cvStartFindContours»
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)
Вы делаете 'thresh' 3 канала изображения в здесь:' молотить = cv2.merge ((молотить, молотить, молотить)) '. Используйте значение 'thresh' перед этим, и вы будете в порядке – Miki