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 以低质量读取视频的主要内容,如果未能解决你的问题,请参考以下文章