【问题标题】:How do I get a video feed to shrink to fit a window using OpenCV Beta 3.0.0 and Python 2.7.5?如何使用 OpenCV Beta 3.0.0 和 Python 2.7.5 缩小视频源以适应窗口?
【发布时间】:2015-02-23 00:45:16
【问题描述】:

我正在做一个项目,我需要在一个屏幕上并排显示 3 个网络摄像头源。我有并排的提要,但视频没有完全显示在窗口上。如何使视频自动适应窗口?谢谢!

代码如下:

import cv2

window_x = 340
window_y = 340

capture1 = cv2.VideoCapture(0)
capture2 = cv2.VideoCapture(1)
capture3 = cv2.VideoCapture(3)

while True:
    cv2.namedWindow("frame1")
    cv2.namedWindow("frame2")
    cv2.namedWindow("frame3")

    cv2.moveWindow("frame1",0,0)
    cv2.moveWindow("frame2",window_x,0)
    cv2.moveWindow("frame3",window_x * 2,0)

    cv2.resizeWindow("frame1",window_x,window_y)
    cv2.resizeWindow("frame2",window_x,window_y)
    cv2.resizeWindow("frame3",window_x,window_y)

    ret, frame1 = capture1.read()
    ret, frame2 = capture2.read()
    ret, frame3 = capture3.read()

    cv2.imshow("frame1",frame1)
    cv2.imshow("frame2",frame2)
    cv2.imshow("frame3",frame3)

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

capture1.release()
capture2.release()
capture3.release()

cv2.destroyAllWindows()

【问题讨论】:

    标签: python python-2.7 opencv webcam opencv3.0


    【解决方案1】:

    在 Oencv 中,将三幅图像放入一个大窗口的一种方法是使用 ROI 将每个图像复制到大窗口中的专用位置。下面是一个使用示例:

    import cv2
    import numpy as np
    
    window_x = 340
    window_y = 340
    
    cv2.namedWindow("Big picture")
    
    capture1 = cv2.VideoCapture(0)
    capture2 = cv2.VideoCapture(1)
    capture3 = cv2.VideoCapture(3)
    
    while True:
    
        ret, frame1 = capture1.read()
        ret, frame2 = capture2.read()
        ret, frame3 = capture3.read()
    
        #Create the big Mat to put all three frames into it
        big_frame = m = np.zeros((window_y, window_x*3, 3), dtype=np.uint8)
    
        # Resize the frames to fit in the big picture
        frame1 = cv2.resize(frame1, (window_y, window_x)) 
        frame2 = cv2.resize(frame2, (window_y, window_x))
        frame3 = cv2.resize(frame3, (window_y, window_x))
        rows,cols,channels = frame1.shape
    
        #Add the first frame to the big picture
        roi = big_frame[0:cols, 0:rows]
        dst = cv2.add(roi,frame1)
        big_frame[0:cols, 0:rows] = dst
    
        #Add second frame to the big picture
        roi = big_frame[0:cols, rows:rows*2]
        dst = cv2.add(roi,frame2)
        big_frame[0:cols, rows:rows*2] = dst
    
        #Add third frame to the big picture
        roi = big_frame[0:cols, rows*2:rows*3]
        dst = cv2.add(roi,frame3)
        big_frame[0:cols, rows*2:rows*3] = dst
    
        cv2.imshow("Big picture", big_frame)
    
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    capture1.release()
    capture2.release()
    capture3.release()
    
    cv2.destroyAllWindows()
    

    【讨论】:

    • 谢谢!效果很好!这实际上是我完成后所希望的结果(一切都在一个窗口中)!这可能是一个非常愚蠢的问题,但是您能解释一下将框架添加到大图的代码中发生了什么吗?谢谢!
    • 第一行是定义大图中的Region of Interest(即小图要放在哪里);第二行是把小图和大图中的目标区域结合起来;第三行是将组合结果分配给大图的目标区域。这是 OpenCV 图像处理中的explanation of ROI
    • 谢谢!我会在几分钟内查看链接!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    相关资源
    最近更新 更多