Python OpenCV 以低质量读取视频

Posted

技术标签:

【中文标题】Python OpenCV 以低质量读取视频【英文标题】:Python OpenCV reads video in low quality 【发布时间】: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 提取帧? 【参考方案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)

感谢大家的帮助!

【讨论】:

以上是关于Python OpenCV 以低质量读取视频的主要内容,如果未能解决你的问题,请参考以下文章

UIImagepickercontroller:转换为低质量视频错误

用Python Opencv实现视频快进

如何在 OpenCV python 中读取视频流作为输入?

OpenGL sprite 以低质量绘制

python-opencv-视频的读取与分解

OpenCV入门(C++/Python)- 使用OpenCV读取和编写视频