как решить ошибку при конвертации RGB в серый?(ошибка: (-215) scn == 3 || scn == 4 в функции cv :: cvtColor) - PullRequest
0 голосов
/ 19 октября 2018

У меня есть код, который получает видео из папки и выполняет некоторые вычисления, используя контуры и вычитание фона.После этого я собираюсь сохранить это отредактированное видео в папку.Код показан ниже:

import numpy as np
import cv2
import time

# Capture video from file
cap = cv2.VideoCapture('test_video.mp4')
time.sleep(1)
fgbg = cv2.createBackgroundSubtractorMOG2()
j = 0

fourcc = cv2.VideoWriter_fourcc(*'MPEG')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

while (cap.isOpened()):
    ret, frame = cap.read()

    if ret == True:

        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        fgmask = fgbg.apply(gray)
        _, contours, _ = cv2.findContours(fgmask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

        if contours:
            areas = []
            for contour in contours:
                ar = cv2.contourArea(contour)
                areas.append(ar)

            max_area = max(areas or [0])
            max_area_index = areas.index(max_area)
            cnt = contours[max_area_index]
            M = cv2.moments(cnt)
            x, y, w, h = cv2.boundingRect(cnt)
            cv2.drawContours(fgmask, [cnt], 0, (255,255,255), 3, maxLevel = 0)

            if h < w:
                j += 1

            if j>10:
                cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)

            if h > w:
                j = 0
                cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)

            cv2.imshow('video',frame)
            out.write(frame)

            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()

Это открывает окно и воспроизводит видео, затем создается output.avi , но оно не содержит никакого содержимого.cmd ничего не производит.Я просто не могу сохранить файл надлежащим образом.

Пожалуйста, порекомендуйте решение этой проблемы

1 Ответ

0 голосов
/ 19 октября 2018

Ошибка говорит о том, что frame не имеет 3 или 4 канала.

  1. Можете ли вы проверить, правильно ли инициализирована ваша камера

    if not cap.isOpened():
        print("Camera not initialized")
        return
    
  2. Возвращает вам действительный кадр

    if not ret:
        print("Problem reading frame")
        return
    else:
        # Convert your frame to gray and find contours etc.
    
...