#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
код преобразования цвета withBGR2HSV
, который должен завершиться ошибкой, поскольку у вас одноканальное изображение, а не трехканальное изображение. Итак, что вы пытаетесь сделать с преобразованием в цветовое пространство HSV, если маска одноканальная?2. я знаю, что BGR2HSV неверен. Я хочу реализовать эрозию и расширение на выходе уменьшения фона MOG2. Итак, как мне это сделать?
3. Просто примените
erode
,dilate
, или что-то подобноеmorphologyEx
прямо на вашемfgmask
. Я все еще не понимаю, почему вы пытаетесь сделать какую-то сегментацию красным цветом (?) наfgmask
.4. эта сегментация красным цветом была неправильной, я понял это позже, но сейчас я применил fgmask для erode, dilate и morphologyEx, и шума немного. ссылка это видео, на котором я тестирую.
5. Кроме того, сразу после изучения я использовал значимость и k-средние, а затем применил MOG2. Но шум все еще сохраняется, и движение элемента неясно.