将RGB转换为灰色时如何解决错误? (错误:(-215)scn == 3 || scn == 4在函数cv :: cvtColor中)

时间:2018-10-19 01:36:42

标签: python cv2 opencv-python

我有一个代码,可以从文件夹中获取视频,并使用轮廓和背景减法进行一些计算。之后,我将把编辑过的视频保存到文件夹中。代码如下所示:

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 :(得分:0)

错误告诉您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.