cv2.VIDEOWRITER_PROP_RAW_VIDEO(*'X264')
时间: 2024-09-20 15:05:29 浏览: 34
在 OpenCV 中,`cv2.VideoWriter_PROP_*` 是一系列常量,它们对应于 `VideoWriter` 类的一些属性设置。其中,`cv2.VIDEOWRITER_PROP_RAW_VIDEO` 是一个特殊的属性,用于指示视频数据将以原始格式(raw video)保存,而不是经过编码压缩的。在括号里的 `'X264'` 并非直接作为这个属性值,而是通常会被用作一个示例,说明你想指定的编码格式为 H.264(也称为 X264),这是一种高效的视频压缩标准。
如果你想使用 H.264 格式保存原始视频数据(未编码),你应该这么设置:
```python
fourcc = cv2.VideoWriter_fourcc('X', '2', '6', '4')
out = cv2.VideoWriter('output.mp4', fourcc, frame_rate, frame_size)
```
这里 `frame_rate` 是帧率,`frame_size` 是每一帧的尺寸。然而,如果你只是想保存未经处理的数据,实际上不应该使用 `'X264'`,因为它是一个编码选项,对于原始视频来说并不合适。原始视频通常是 BGR 数据或者灰度数据等。
相关问题
import cv2 cap = cv2.VideoCapture(0) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = cap.get(cv2.CAP_PROP_FPS) fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V') out = None if not cap: print("打开摄像头失败") while True: success, frame = cap.read() if success: cv2.imshow("frame", frame) out = cv2.VideoWriter('./video/save.mp4', fourcc, fps, (width, height)) out.write(frame) key = cv2.waitKey(0) if key == ord('q'): break cv2.destroyAllWindows() out.release()这段代码有错吗 为什么只能显示一帧视频
根据你提供的代码,有几个问题可能导致能显示一帧视频:
1. `out = cv2.VideoWriter('./video/save.mp4', fourcc, fps, (, height))` 这一行代码应该放在循环外部,否则每一帧都会创建一个新的`VideoWriter`对象,这可能导致只保存最后一帧。
2. `out.write(frame)` 这一行代码应该在`if success`条件的内部,以确保只有在成功读取到帧时才进行写入操作。
3. `key = cv2.waitKey(0)` 这一行代码应该放在帧显示之后,以确保能够正常响应键盘输入。
下面是修改后的代码:
```python
import cv2
cap = cv2.VideoCapture(0)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V')
out = cv2.VideoWriter('./video/save.mp4', fourcc, fps, (width, height))
if not cap:
print("打开摄像头失败")
while True:
success, frame = cap.read()
if success:
cv2.imshow("frame", frame)
out.write(frame)
key = cv2.waitKey(1)
if key == ord('q'):
break
cv2.destroyAllWindows()
out.release()
```
修改后的代码应该能够正常显示并保存视频。如果还有其他问题,请随时提问。
请解释以下代码 import cv2 import numpy as np import tempfile import os kernel1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (8, 8))#定义运算核大小 mog = cv2.createBackgroundSubtractorMOG2() # 创建混合高斯模型来用于背景建模 def motionDetection(inputPath): print(inputPath) cap = cv2.VideoCapture(inputPath)#从inputPath读入视频 fps = cap.get(cv2.CAP_PROP_FPS) #获取视频的帧率 size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))#获取视频的大小 output_viedo_frame = cv2.VideoWriter()#初始化视频写入 output_viedo_fmask = cv2.VideoWriter()#初始化视频写入 outputPath=tempfile.mkdtemp()#创建输出视频的临时文件夹的路径 fourcc = cv2.VideoWriter_fourcc('a','v','c','1')#视频编码:h264,只有h264格式的mp4文件才能在浏览器直接播放 video_save_path_frame = os.path.join(outputPath,"frame1.mp4")#创建输出视频路径 video_save_path_fmask = os.path.join(outputPath,"fmask1.mp4")#创建输出视频路径 output_viedo_frame.open(video_save_path_frame , fourcc, fps, size, True) output_viedo_fmask.open(video_save_path_fmask , fourcc, fps, size, True)
这段代码导入了cv2、numpy和tempfile三个模块,并定义了一个椭圆形的运算核大小kernel1和一个混合高斯模型mog,用于背景建模。接着定义了一个名为motionDetection的函数,该函数需要传入一个视频路径作为参数。
在函数内部,首先打印出传入的视频路径。然后通过cv2.VideoCapture()函数读入该视频文件,获取视频的帧率和大小,并初始化两个输出视频的实例对象output_viedo_frame和output_viedo_fmask。
接着,创建一个临时文件夹的路径用于存放输出视频,并将输出视频的路径保存在video_save_path_frame和video_save_path_fmask变量中。此处使用了tempfile模块中的mkdtemp()函数来创建临时文件夹的路径。
最后,使用cv2.VideoWriter()函数打开两个输出视频文件,分别将其编码为h264格式的mp4文件,并将帧率和视频大小传入。其中第五个参数True表示输出的视频是彩色的,而不是灰度图像。
阅读全文