【问题标题】:Python OpenCV reads video in low qualityPython OpenCV 以低质量读取视频
【发布时间】:2020-06-05 12:40:11
【问题描述】:

我正在尝试编写一个程序来为我剪辑游戏剪辑。为了达到我想要的效果,我需要在帧中间检测一个红色的“X”(表示杀戮),这是一个 12px * 12px 的区域,所以我需要完整的质量。在调试时,我意识到 OpenCV 读取的帧质量似乎比我在视频播放器中看到的要低。

这是一个例子:

This is the "X" I've cut from a video player

This is the "X" that OpenCV read in

两者都来自同一个框架。

这是我用来调试的代码:

import cv2
import numpy as np

vid = cv2.VideoCapture(path)

success, frame = vid.read()
while success:
    cv2.imshow("Frame", frame)
    # Pause video
    if cv2.waitKey(1) & 0xFF == ord('s'):
        cv2.waitKey(0)
    # Quit video
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

    success, frame = vid.read()

cv2.destroyAllWindows()

我还检查了宽度和高度,它们似乎与原始视频相同。我正在使用 OpenCV 4.2.0 版。什么可能导致此问题?

感谢任何帮助。

【问题讨论】:

  • 你能分享视频吗?
  • link 这是我正在测试的视频。
  • 无法访问!
  • link 对不起!试试这个。
  • 你确定两个框架是一样的吗?您是否尝试使用 ffmpeg 提取帧?

标签: python opencv video opencv-python


【解决方案1】:

如果您尝试从文件中读取帧并想要更改其分辨率,您可能需要使用here 中描述的调整大小方法。这需要在循环内完成,在你读入框架之后。可能是这样的:

resize(ret, Size(width, height), 0, 0, INTER_CUBIC); 

示例:

b = cv2.resize(frame,(1280,720),fx=0,fy=0, interpolation = cv2.INTER_CUBIC)

我希望这会有所帮助。

【讨论】:

  • 感谢您的回答,但这不是我要找的。我不想调整图片的大小,我想以完整的质量阅读它。顺便说一句,我尝试了您的建议,看起来一样。另外我的帧大小是全高清的,中间的 12px * 12px 区域是我关心的。
  • 你试过 cap.set(3, 1920);cap.set(4, 1080) 这个吗?我知道这也会调整窗口大小
  • 是的。没有任何改变。
【解决方案2】:

我想通了。我唯一要做的就是将图片转换为 jpeg(出于某种原因)。我用这个函数在内存中转换它:

def convertToJpeg(img):
    result, encoded = cv2.imencode('.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 100])
    return cv2.imdecode(encoded, 1)

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 2017-10-31
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2020-02-12
    • 1970-01-01
    • 2016-11-15
    • 2014-11-17
    相关资源
    最近更新 更多