在 Opencv 的 UYVY 编解码器中录制视频
Posted
技术标签:
【中文标题】在 Opencv 的 UYVY 编解码器中录制视频【英文标题】:Recording Video in UYVY codec in Opencv 【发布时间】:2018-03-18 05:39:25 【问题描述】:我有一台来自 e-con 系统的相机,它支持 UYVU 编解码器视频录制。当我使用他们自己的软件(QTCam)录制视频时,它使用 YUY2 编解码器以 avi 格式录制,视频在 VLC 中完美打开并运行。
现在我尝试通过 Opencv VideoWrtiter() 录制视频。 我使用此命令设置 Camera 属性以读取 UYVY Codec 视频。
camera1.set(CV_CAP_PROP_FOURCC,CV_FOURCC('U','Y','V','Y'));
还使用 VideoWriter 以 AVI 文件格式录制视频。
video1.open("/home/camera1UYVY.avi",CV_FOURCC('Y','U','Y','2'),30,s1,true);
来自摄像头的馈送正在工作,我使用 imshow() 进行了检查。但录制的视频无法在 VLC 中播放,因为它适用于从 QTCam 录制的视频。
即使录制的重新编码的opencv具有相同的编解码器
我的代码在下面
#include <opencv2/core/core.hpp>
#include <opencv2/video/video.hpp>
#include <opencv2/imgcodecs/imgcodecs.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/videoio/videoio.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char **argv)
VideoCapture camera1;
Mat frame1;
camera1.open(0);
camera1.set(CV_CAP_PROP_FOURCC,CV_FOURCC('U','Y','V','Y'));
camera1.set(CV_CAP_PROP_FRAME_WIDTH,1280);
camera1.set(CV_CAP_PROP_FRAME_HEIGHT,720);
cout << "FPS:" << camera1.get(CV_CAP_PROP_FPS) << endl;
camera1.set(CV_CAP_PROP_FPS,30);
cout << "FPS:" << camera1.get(CV_CAP_PROP_FPS) << endl;
cout << "Camera -1 Codec: " << (int)camera1.get(CV_CAP_PROP_FOURCC) << endl;
VideoWriter video1;
cout << camera1.get(CV_CAP_PROP_FRAME_WIDTH) << endl;
cout << camera1.get(CV_CAP_PROP_FRAME_HEIGHT) << endl;
Size s1 = Size((int)camera1.get(CV_CAP_PROP_FRAME_WIDTH),(int)camera1.get(CV_CAP_PROP_FRAME_HEIGHT));
video1.open("/home/camera1UYVY.avi",CV_FOURCC('Y','U','Y','2'),30,s1,true);
while(!camera1.isOpened())
cout << "Camera not opened" << endl;
continue;
while(1)
if(!video1.isOpened())
cout << "Error opening video" << endl;
camera1.read(frame1);
imshow("Display1",frame1);
video1.write(frame1);
cout << frame1.data << endl;
if(waitKey(1) == 27)
break;
video1.release();
camera1.release();
return 0;
请告诉我哪里出错了。我想从相机录制未压缩的视频并将其保存为视频文件(在 VLC 或任何其他视频播放器中打开)
【问题讨论】:
不确定我是否理解这一点 - 但我不是视频专家。您似乎正在读取UYVY
数据并写入完全相同的未修改数据并突然声称它是YUY2
...?
实际上,我正在使用 UYVY 和 YUV2 编解码器读取 UYVY 数据并写入 Avi 文件。两者都给出了相同的结果。它不能在任何媒体播放器上播放。
我将首先检查 CAP_PROP_FORMAT
和 CAP_PROP_CONVERT_RGB
的设置。
您能否在while(1)
中创建您的Mat frame1
,并将imshow
移动到write
之后,看看是否有帮助?
【参考方案1】:
OpenCV 似乎在将 yuv422p 格式写入 avi 时出现问题。试试这个:
video1.open("/home/camera1UYVY.avi",CV_FOURCC('I', 'Y', 'U', 'V'),30,s1,true);
这是一种 yuv420p 像素格式,这意味着您在垂直 U 和 V 平面上会损失一些精度,但它仍然是未压缩的视频。
【讨论】:
以上是关于在 Opencv 的 UYVY 编解码器中录制视频的主要内容,如果未能解决你的问题,请参考以下文章