【问题标题】:Can't show video output from .avi file in Opencv (python)无法在 Opencv(python)中显示来自 .avi 文件的视频输出
【发布时间】:2017-11-21 00:44:42
【问题描述】:

我在运行代码时看不到任何输出视频窗口。 Python代码:

import cv2
import numpy as np

#cap = cv2.VideoCapture(0)
cap = cv2.VideoCapture('C:\Users\khan1\Desktop\pythonproject\test_1.avi')
print cap
while (cap.isOpened()):
    _, frame = cap.read()
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    lower_green = np.array([65, 60, 60])
    upper_green = np.array([80, 255, 255])
    mask = cv2.inRange(hsv, lower_green, upper_green)
    res = cv2.bitwise_and(frame, frame, mask=mask)

    cv2.imshow('frame', frame)
    cv2.imshow('mask', mask)
    cv2.imshow('res', res)

    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break

cv2.destroyAllWindows()
cap.release()

当我运行它时,我得到Process finished with exit code 0,但它没有显示任何视频。如果我将 cap = cv2.VideoCapture(0) 用于网络摄像头,则此代码可以正常显示 3 个不同的视频窗口。同样print cap 显示<VideoCapture 034523B0>。我做错了什么?

【问题讨论】:

  • 在视频路径中添加双斜杠
  • 在路径中具体添加双斜杠?
  • 将路径更改为 C:\\Users\\khan1\\... 或者将视频复制到项目文件夹并简单地传递视频名称
  • 做到了。结果还是一样。 Process finished with exit code 0 并且看不到任何窗口。 cv2.imshow 没有显示任何窗口。

标签: python-2.7 opencv video


【解决方案1】:

让我们回顾一下提供的代码,因为这个输出是预期的。

此行正在激活您的主网络摄像头。如果您的机器中只插入了一个网络摄像头,那么这应该没问题。

cap = cv2.VideoCapture(0)

接下来的循环只是捕获网络摄像头的帧,直到您按下 Escape 键。您将获得三个窗口,因为您正在运行 imshow 函数 3 次:

cv2.imshow('frame', frame)
cv2.imshow('mask', mask)
cv2.imshow('res', res)

frame 变量通过网络摄像头存储正常帧,无需修改。 mask 变量正在运行基于提供的值范围的颜色阈值,在本例中是介于 lower_greenupper_green 之间的范围。 res 变量将在正常帧的顶部显示掩码,因此是 bitwise_and 运算符。

请注意,opencv 的默认颜色格式是 BGR(Blue, Green, Red),您将其转换为 HSV 值,这就是您可能会得到两个黑屏的原因。

更改颜色阈值中的值,直到获得更好的结果,或尝试使用此代码来掩盖任何不是绿色的东西。

import cv2
import numpy as np

cap = cv2.VideoCapture(0)
#cap = cv2.VideoCapture('C:\Users\khan1\Desktop\pythonproject\test_1.avi')
print cap
while (cap.isOpened()):
    _, frame = cap.read()
    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    lower_green = np.array([0, 60, 0])
    upper_green = np.array([200, 255, 200])
    mask = cv2.inRange(rgb, lower_green, upper_green)
    res = cv2.bitwise_and(frame, frame, mask=mask)

    cv2.imshow('frame', frame)
    cv2.imshow('mask', mask)
    cv2.imshow('res', res)

    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break

cv2.destroyAllWindows()
cap.release()

您会注意到,在提供的代码中,我将其转换为 RGB 格式而不是 HSV。

【讨论】:

  • 感谢您为我解释这段代码。但我的问题是为什么我不能读取存储在笔记本电脑上的视频文件(test_1.avi)?实际上我没有看到任何屏幕。它适用于网络摄像头,但无法从上述路径读取视频文件。 BGR2RGB 的建议也很有帮助。
  • 我该如何解决?是否有任何已知的链接可以解决这个问题?
【解决方案2】:

对于我的 32 位 Windows 10 笔记本电脑,我将 opencv_ffmpeg320.dllC:\OpenCV-3.2.0\opencv\build\bin 复制到 C:\Python27 并解决了问题。 OpenCV 2.4 VideoCapture not working on Windows 是我关注的链接。

【讨论】:

    猜你喜欢
    • 2016-08-07
    • 2011-03-20
    • 2017-11-08
    • 1970-01-01
    • 2012-01-14
    相关资源
    最近更新 更多