Ran*_*tir 4 opencv video-capture codec emgucv kinect
我想将来自设备的未压缩帧存储为视频,但我需要知道如何选择“全帧(未压缩)”作为 VideoWriter(在 emgu aka openCV 中)的编解码器。
当我像这样传递 -1 时,我可以从下拉菜单中选择它
VideoWriter myVideoWriter = new VideoWriter ("myVieoColor.avi", -1 , 15, videoSize, true);
Run Code Online (Sandbox Code Playgroud)
但我想自动选择全帧(未压缩)编解码器。例如,我知道我可以通过以下方式选择 Lagarith Lossless Video Codec
VideoWriter myVideoWriter = new VideoWriter ("myVieoColor.avi", Emgu.CV.VideoWriter.Fourcc('L','A','G','S') , 15, videoSize, true);
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚我需要使用哪个fourcc。
也许有人可以帮助我
如果我们打入调试器时该编解码器选择对话框打开,我们可以看到它的结果此调用到AVISaveOptions(...)。因此,找出您选择的内容的一种方法是在第 799 行设置断点并检查fourcc.
但是,还有更简单的方法:
cv::VideoCapture.CAP_PROP_FOURCC从cv::VideoCapture实例中获取。抱歉,我不使用 C#/EmguCV,因此我无法为您提供确切的示例,但以下内容应该很容易移植。
#include <opencv2/opencv.hpp>
#include <iostream>
int main()
{
{
cv::VideoWriter outputVideo;
outputVideo.open("foo.avi", -1, 25.0, cv::Size(640, 480), true);
cv::Mat frame(480, 640, CV_8UC3);
outputVideo.write(frame);
}
cv::VideoCapture inputVideo("foo.avi");
int fourcc = static_cast<int>(inputVideo.get(CV_CAP_PROP_FOURCC));
char FOURCC_STR[] = {
(char)(fourcc & 0XFF)
, (char)((fourcc & 0XFF00) >> 8)
, (char)((fourcc & 0XFF0000) >> 16)
, (char)((fourcc & 0XFF000000) >> 24)
, 0
};
std::cout << "FOURCC is '" << FOURCC_STR << "'\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
控制台输出:
FOURCC is 'DIB '
Run Code Online (Sandbox Code Playgroud)
import cv2
import numpy as np
import struct
outputVideo = cv2.VideoWriter()
outputVideo.open("foo.avi", -1, 25, (640,480), True)
frame = np.zeros((480,640,3), dtype=np.uint8)
outputVideo.write(frame)
outputVideo.release()
inputVideo = cv2.VideoCapture("foo.avi")
fourcc = int(inputVideo.get(cv2.cv.CV_CAP_PROP_FOURCC))
print "FOURCC is '%s'" % struct.pack("<I", fourcc)
Run Code Online (Sandbox Code Playgroud)
控制台输出:
FOURCC is 'DIB '
Run Code Online (Sandbox Code Playgroud)