Python 将RGB通道和单通道的cv2帧堆叠在一起

Python 将RGB通道和单通道的cv2帧堆叠在一起,python,opencv,numpy,Python,Opencv,Numpy,我想做的是使它,使我可以堆叠在一起的4个视频饲料,RGB,B,G,R频道在一个四帧饲料。这是我的代码,我得到一个错误“所有的输入数组必须有相同的维数。我想知道是否有办法解决这个问题?如果你在RGB所在的位置插入灰色,你可以看到我想要的整体结果,而不是RGB帧应该在灰色帧所在的位置 import numpy as np import cv2 cap = cv2.VideoCapture(0) ret, frame = cap.read() while(True): ret, frame

我想做的是使它,使我可以堆叠在一起的4个视频饲料,RGB,B,G,R频道在一个四帧饲料。这是我的代码,我得到一个错误“所有的输入数组必须有相同的维数。我想知道是否有办法解决这个问题?如果你在RGB所在的位置插入灰色,你可以看到我想要的整体结果,而不是RGB帧应该在灰色帧所在的位置

import numpy as np
import cv2

cap = cv2.VideoCapture(0)
ret, frame = cap.read()

while(True):
    ret, frame = cap.read()
    # Resizing down the image to fit in the screen.
    b,g,r = cv2.split(frame)
    RGB = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
    GRAY = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # creating another frame.
    channels = cv2.split(frame)
    frame_merge = cv2.merge(channels)

    # horizintally concatenating the two frames.
    final_frame = cv2.hconcat((frame, frame_merge))
    final_frame2 = cv2.hconcat((frame, frame_merge))
    final = cv2.vconcat((final_frame, final_frame2))

    frame1 = np.hstack((RGB,b))
    frame2 = np.hstack((g,r))
    final = np.vstack((frame1,frame2))
    cv2.imshow('frame', final)

    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()
以下是我的解决方案:

import numpy as np
import cv2

cap = cv2.VideoCapture(0)
ret, frame = cap.read()

red = np.zeros(frame.shape, 'uint8')
green = np.zeros(frame.shape, 'uint8')
blue = np.zeros(frame.shape, 'uint8')

while(True):
    ret, frame = cap.read()
    b, g, r = cv2.split(frame)

    red[..., 0], red[..., 1], red[..., 2] = r, r, r
    green[..., 0], green[..., 1], green[..., 2] = g, g, g
    blue[..., 0], blue[..., 1], blue[..., 2] = b, b, b

    final = cv2.vconcat((
        cv2.hconcat((frame, blue)),
        cv2.hconcat((green, red))
    ))

    cv2.imshow('frame', final)

    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()
以下是我的解决方案:

import numpy as np
import cv2

cap = cv2.VideoCapture(0)
ret, frame = cap.read()

red = np.zeros(frame.shape, 'uint8')
green = np.zeros(frame.shape, 'uint8')
blue = np.zeros(frame.shape, 'uint8')

while(True):
    ret, frame = cap.read()
    b, g, r = cv2.split(frame)

    red[..., 0], red[..., 1], red[..., 2] = r, r, r
    green[..., 0], green[..., 1], green[..., 2] = g, g, g
    blue[..., 0], blue[..., 1], blue[..., 2] = b, b, b

    final = cv2.vconcat((
        cv2.hconcat((frame, blue)),
        cv2.hconcat((green, red))
    ))

    cv2.imshow('frame', final)

    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()

如果在添加GRAY=cv2.cvtColor(frame,cv2.COLOR\u BGR2GRAY)后,使用我上面的代码并将RGB替换为灰色你可以看到我想要的结果。如果你拿着一个红色物体在相机前面,你可以看到红色通道突出红色,其他颜色也是如此。主要是我希望它不是第一个灰色的框架,而是常规的彩色框架。@MichaelHenderson不确定我是否理解正确,这意味着我的解决方案不是w在编辑之前你想达到什么目的?@MichaelHenderson我添加了一个新的解决方案,请告诉我这是否是你想要的,否则请再解释一下。如果你在添加GRAY=cv2.cvtColor(frame,cv2.COLOR\u BGR2GRAY)后使用我上面的代码并用灰色替换RGB你可以看到我想要的结果。如果你拿着一个红色物体在相机前面,你可以看到红色通道突出红色,其他颜色也是如此。主要是我希望它不是第一个灰色的框架,而是常规的彩色框架。@MichaelHenderson不确定我是否理解正确,这意味着我的解决方案不是w在编辑之前你想达到什么目的?@MichaelHenderson我添加了一个新的解决方案,如果这是你想要的,请告诉我,否则请再解释一点。