Python OpenCV/PIL COLOR_BGR2RGB 错误

Python OpenCV / PIL COLOR_BGR2RGB Error

我写了一些 Python 代码,可以从视频中提取帧并将其中的几个帧放入 rows/columns jpeg 格式。在大多数情况下,它的工作原理,除了结束。所以我假设这个错误与数组中的索引超出范围有关。

import cv2, Image, os


name = raw_input('Video File (With Extension): ')
x_res = int(raw_input('Image Width (Pixels): '))
y_res = int(raw_input('Image Height (Pixels): '))
rows = int(raw_input('Number of Rows: '))
columns = int(raw_input('Number of Columns: '))


vidcap = cv2.VideoCapture(name)
_,im = vidcap.read()
frames = int(vidcap.get(cv2.CAP_PROP_FRAME_COUNT))
new_im = Image.new('RGB', (x_res, y_res))
x_cntr = 0
y_cntr = 0


if not os.path.exists('./' + name + ' Output/'):
    os.makedirs('./' + name + ' Output/')


for x in xrange(0,frames,1):
    if x%(rows*columns) == 0:
        new_im.save('./' + name + ' Output/' + str(x) + '.jpg')
        new_im = Image.new('RGB', (x_res,y_res))
        y_cntr = 0
        x_cntr = 0
        print str(round(100*(float(x)/frames), 1)) + "% Complete"
    elif x%rows == 0:
        x_cntr = 0
        y_cntr = y_cntr + y_res/columns
    elif x%1 == 0:
        x_cntr = x_cntr + x_res/rows
    _,cv2_im = vidcap.read()
    cv2_im = cv2.cvtColor(cv2_im,cv2.COLOR_BGR2RGB)
    im = Image.fromarray(cv2_im)
    im = im.resize((x_res/rows + x_res%rows, y_res/columns + y_res%columns), Image.ANTIALIAS)
    new_im.paste(im, (x_cntr, y_cntr))

它returns这是当它要制作最后一张图片时:

Traceback (most recent call last):
  File "C:/Users/Cameron/Downloads/JPG/IMG2.py", line 36, in <module>
    cv2_im = cv2.cvtColor(cv2_im,cv2.COLOR_BGR2RGB)
error: C:\builds\master_PackSlaveAddon-win32-vc12-static\opencv\modules\imgproc\src\color.cpp:7349: error: (-215) scn == 3 || scn == 4 in function cv::cvtColor

此错误表明您的图像 cv2_im 不是 BGR 格式,因此无法转换为 RGB。它必须已经是 RGB 格式或者可能是 GRAY 格式。该错误表示格式不匹配。

使用此代码

cv2_im = cv2.cvtColor(cv2_im, cv2.COLOR_GRAY2RGB)

所以基本上,它试图将一个不存在的帧保存到最后。因此,如果我选择 5 行和 5 列,当有 132 帧时,它不会平均分配 (132 % 25 ≠ 0),它会尝试索引视频范围之外的内容。所以我基本上添加了一个 "if success == True" 然后正常处理,否则 "if success == False" 然后保存它所拥有的并停止。所以这是工作代码。

import cv2, Image, os


name = raw_input('Video File (With Extension): ')
x_res = int(raw_input('Image Width (Pixels): '))
y_res = int(raw_input('Image Height (Pixels): '))
rows = int(raw_input('Number of Rows: '))
columns = int(raw_input('Number of Columns: '))


vidcap = cv2.VideoCapture(name)
success,im = vidcap.read()
frames = int(vidcap.get(cv2.CAP_PROP_FRAME_COUNT))
print frames
new_im = Image.new('RGB', (x_res, y_res))
x_cntr = 0
y_cntr = 0


if not os.path.exists('./' + name + ' Output/'):
    os.makedirs('./' + name + ' Output/')


for x in xrange(0,frames,1):
    if x%(rows*columns) == 0:
        new_im.save('./' + name + ' Output/' + str(x) + '.jpg')
        new_im = Image.new('RGB', (x_res,y_res))
        y_cntr = 0
        x_cntr = 0
        print str(round(100*(float(x)/frames), 1)) + "% Complete"
    elif x%rows == 0:
        x_cntr = 0
        y_cntr = y_cntr + y_res/columns
    elif x%1 == 0:
        x_cntr = x_cntr + x_res/rows
    success,cv2_im = vidcap.read()
    if success == True:
        cv2_im = cv2.cvtColor(cv2_im,cv2.COLOR_BGR2RGB)
        im = Image.fromarray(cv2_im)
        im = im.resize((x_res/rows + x_res%rows, y_res/columns + y_res%columns), Image.ANTIALIAS)
        new_im.paste(im, (x_cntr, y_cntr))
    elif success == False:
        new_im.save('./' + name + ' Output/' + str(x) + '.jpg')