Проблема, возникшая во время морфологического преобразования уменьшения фона MOG2

#python #opencv

#python #opencv

Вопрос:

Я пытаюсь уменьшить фоновый шум, и я выбираю уменьшение фона MOG2 и дальнейшее применение морфологического преобразования для получения наилучшего результата. Но я получил эту ошибку при выполнении этого кода.

Код:

 import cv2
import numpy as np


cap=cv2.VideoCapture(0)

fgbg=cv2.createBackgroundSubtractorMOG2()

while(cap.isOpened()):
    _,frame=cap.read()
    fgmask=fgbg.apply(frame)
    hsv=cv2.cvtColor(fgmask,cv2.COLOR_BGR2HSV)
    
    lower_red=np.array([50,50,50])
    upper_red=np.array([180,255,255])
   
    mask=cv2.inRange(hsv,lower_red,upper_red)
    res=cv2.bitwise_and(fgmask,fgmask,mask=mask)

    #for morphological transformation
    kernel=np.ones((5,5),np.uint8)
    erosion=cv2.erode(mask,kernel,iterations=1)
    dilation=cv2.dilate(mask,kernel,iterations=1)
    k = cv2.waitKey(1) amp; 0xff
    if k == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
  

Ошибка:

 hsv=cv2.cvtColor(fgmask,cv2.COLOR_BGR2HSV)
cv2.error: OpenCV(4.4.0) c:usersappveyorappdatalocaltemp1pip-req-build-q0nmoxxvopencvmodulesimgprocsrccolor.simd_helpers.hpp:92: error: (-2:Unspecified error) in function '__cdecl cv::impl::`anonymous-namespace'::CvtHelper<struct cv::impl::`anonymous namespace'::Set<3,4,-1>,struct cv::impl::A0xd2b27d1f::Set<3,-1,-1>,struct cv::impl::A0xd2b27d1f::Set<0,5,-1>,2>::CvtHelper(const class cv::_InputArray amp;,const class cv::_OutputArray amp;,int)'
> Invalid number of channels in input image:
>     'VScn::contains(scn)'
> where
>     'scn' is 1
  

После того, как я получил эту ошибку, я понял, что может возникнуть проблема с записью cv2.COLOR_BGR2HSV в cvtColor, но я не знаю, как это решить, или проблема может быть в чем-то другом.
Я также чувствую проблему (глупую ошибку) при написании res=cv2.bitwise_and(fgmask,fgmask,mask=mask) , но я не знаю, как это решить, поскольку я новичок в морфологическом преобразовании.

Пожалуйста, укажите на мою ошибку. Заранее спасибо

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

1.Из документации cv2.BackgroundSubtractorMOG2.apply() : fgmask вывод маски переднего плана в виде 8-битного двоичного изображения.Вы используете fgmask в качестве входных данных cvtColor код преобразования цвета with BGR2HSV , который должен завершиться ошибкой, поскольку у вас одноканальное изображение, а не трехканальное изображение. Итак, что вы пытаетесь сделать с преобразованием в цветовое пространство HSV, если маска одноканальная?

2. я знаю, что BGR2HSV неверен. Я хочу реализовать эрозию и расширение на выходе уменьшения фона MOG2. Итак, как мне это сделать?

3. Просто примените erode , dilate , или что-то подобное morphologyEx прямо на вашем fgmask . Я все еще не понимаю, почему вы пытаетесь сделать какую-то сегментацию красным цветом (?) на fgmask .

4. эта сегментация красным цветом была неправильной, я понял это позже, но сейчас я применил fgmask для erode, dilate и morphologyEx, и шума немного. ссылка это видео, на котором я тестирую.

5. Кроме того, сразу после изучения я использовал значимость и k-средние, а затем применил MOG2. Но шум все еще сохраняется, и движение элемента неясно.