Я пытаюсь определить контуры красного объекта на изображении, но продолжаю получать ошибку при использовании функции OpenCV cv.findContour

#python #opencv #object-detection

#python #opencv #обнаружение объекта

Вопрос:

Я пытаюсь получить контуры части изображения, но я продолжаю получать ошибку при вызове cv.findContour image . Чтобы найти объект на изображении, я сначала пытаюсь извлечь цвет объекта, который является красным, затем я пытаюсь найти контуры на обнаруженных объектах.

 import cv2 as cv
import numpy as np


def main():

    image_find_goal = "image.jpg"
    kernel = np.ones((5,5),np.uint8)
    #findGoal(image_find_goal)
    img1 = cv.imread(image_find_goal)
    img = cv.resize(img1,(700,700))
    hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)

    #range for red color
    lower_r = np.array([160,100,100])
    upper_r = np.array([179,255,255])
    mask = cv.inRange(hsv,lower_r,upper_r)
    res = cv.bitwise_and(img,img,mask=mask)
    _,thresh = cv.threshold(res,125,255,cv.THRESH_BINARY)
    dilate =  cv.dilate(thresh,None,iterations=1)

    contours, hierarchy = cv.findContours(dilate,cv.RETR_TREE,cv.CHAIN_APPROX_NONE)
    for cnt in contours:
        epsilon = 0.1*cv.arcLength(cnt,True)
        approx = cv.approxPolyDP(cnt,epsilon,True)
        if len(approx) == 4:
            cv.drawContours(img,cnt,-1,(60,255,255),4)

    cv.imshow('OBSTACLES',img)
    cv.waitKey(0)
    cv.destroyWindow(img)
  

Ошибка, которую я получаю, это:

контуры, иерархия = cv.findContours(dilate,cv.RETR_TREE,cv.CHAIN_APPROX_NONE) cv2.ошибка: OpenCV(4.4.0) /tmp/pip-req-build-sw_3pm_8/opencv/modules/imgproc/src/contours.cpp:195: ошибка: (-210: Неподдерживаемый формат или комбинацияиз форматов) [Start]findContours поддерживает только изображения CV_8UC1 в режиме mode != CV_RETR_FLOODFILL в противном случае поддерживает изображения CV_32SC1 только в функции ‘cvStartFindContours_Impl’

Комментарии:

1. Почему вы устанавливаете пороговое значение после того, как использовали cv.inRange() для получения двоичной маски. Разве маска не находит красный цвет, и вам не нужны контуры из маски. Я предлагаю вам использовать cv.imshow после каждого шага, чтобы убедиться, что каждый из них дает то, что ожидается. Вы также можете проверить форму и dtype, чтобы убедиться, что они соответствуют ожиданиям. cv.findContours возвращает разное количество значений в зависимости от вашей версии OpenCV. Убедитесь, что вы используете правильное количество возвращаемых значений.

2. Опубликуйте свое входное изображение, чтобы мы могли видеть, что вы пытаетесь сделать?

3. Ваш структурирующий элемент в расширении — «None». Вы не можете расширяться без надлежащего структурирующего элемента. Я не знаю, есть ли значение по умолчанию, когда вы указываете «Нет», поскольку я всегда использую morphologyEx() с надлежащим структурирующим элементом (ядром)

Ответ №1:

Я думаю, что этот фрагмент решает вашу проблему. Поскольку вас интересуют контуры, я бы применил метод обнаружения краев перед расширением. Этот шаг также исправит ошибку типа CV, которую вы получаете

 import cv2 as cv
import numpy as np

image_find_goal = "image.jpg"
#findGoal(image_find_goal)
img1 = cv.imread(image_find_goal)
img = cv.resize(img1,(700,700))
hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)

#range for red color
lower_r = np.array([160,100,100])
upper_r = np.array([179,255,255])
mask = cv.inRange(hsv,lower_r,upper_r)
res = cv.bitwise_and(img,img,mask=mask)
_,thresh = cv.threshold(res,125,255,cv.THRESH_BINARY)

# check which are the best canny threshold values for your image
imgCanny = cv.Canny(thresh, 180, 180)
dilate = cv.dilate(imgCanny, None, iterations = 1)
# cv.imshow("dilate", dilate)
# cv.waitKey()

contours, hierarchy = cv.findContours(dilate,cv.RETR_TREE,cv.CHAIN_APPROX_NONE)
for cnt in contours:
    epsilon = 0.1*cv.arcLength(cnt,True)
    approx = cv.approxPolyDP(cnt,epsilon,True)
    if len(approx) == 4:
        cv.drawContours(img,cnt,-1,(60,255,255),4)

cv.imshow('OBSTACLES',img)
cv.waitKey(0)
cv.destroyAllWindows()