gpt4 book ai didi

c++ - 使用 openCV 读取视频

转载 作者:可可西里 更新时间:2023-11-01 18:29:34 29 4
gpt4 key购买 nike

我有一个视频 engine2.avi,我想用 openCV 阅读和展示它。这是我的代码:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;

int main(int argc, char** argv)
{
string filename = "D:\\BMDvideos\\engine2.avi";
VideoCapture capture(filename);
Mat frame;

if( !capture.isOpened() )
throw "Error when reading steam_avi";

namedWindow("w", 1);
for( ; ; )
{
capture >> frame;
//if(!frame)
// break;
imshow("w", frame);
waitKey(20); // waits to display frame
}
waitKey(0);
}

如果我的文件具有编解码器 YUV 4:2:2 (UYVY)(我使用 Direct-Show 录制视频),则此代码不起作用,但当我使用视频时,此代码有效捕获了 openCV !!

有人知道这是如何工作的吗?

更新:

在阅读了一些链接后,建议捕获异常将解决问题,我修改了我的代码。它没有帮助,但这是修改后的代码:

cv::VideoCapture cap("d:\\BMDvideos\\engine2.avi");
cv::Mat frame;

try
{
cap >> frame;
}
catch(cv::Exception ex)
{
std::cout << ex.what() << std::endl;
}
catch(...)
{
std::cout << "Unknown exception" << std::endl;
}

程序在 cap>>frame 中崩溃。我读过类似的问题,但他们使用 YUV (4:2:0) 的帧,而我的视频使用 UYVY (4:2:2)。如何将其转换为 RGB 颜色模型?

更新 2:

在karlphillip的建议下,我使用了OpenCV2.4.3,但是使用下面的代码还是报同样的错误:

#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;

int main(){
cv::Mat frame;
cv::VideoCapture cap("d:\\BMDvideos\\B\\Aufnahme.avi");
if(!cap.isOpened())
{
cout << "Error can't find the file"<<endl;
}

while(1){
if(!cap.read(frame))
imshow("",frame);

cv::waitKey(33);
}
return 0;
}

最佳答案

这里有几个链接可能对您有帮助:

编辑:

我必须先澄清一些事情:OpenCV 能够从视频文件中读取 YUV 帧,因为它是由底层库 (FFmpeg/GStreamer) 来完成这项工作的。 OpenCV 还支持在特定类型 YUV and RGB 之间进行转换通过 cvCvtColor()CV_YCrCb2RGBCV_RGBYCrCb

再次检查您的问题后,我注意到您没有具体说明发生的错误类型。你可以 do a better jobdealingpossible failure通过将消息打印到屏幕而不是 throw 来从捕获界面。

我测试了您共享的视频文件,使用以下代码在窗口中播放它没有问题:

#include <cv.h>
#include <highgui.h>

#include <iostream>

int main(int argc, char* argv[])
{
cv::VideoCapture cap(argv[1]);
if (!cap.isOpened())
{
std::cout << "!!! Failed to open file: " << argv[1] << std::endl;
return -1;
}

cv::Mat frame;
for(;;)
{

if (!cap.read(frame))
break;

cv::imshow("window", frame);

char key = cvWaitKey(10);
if (key == 27) // ESC
break;
}

return 0;
}

如果由于某种原因,捕获界面无法打开文件,它将立即退出应用程序,而不是进一步在 cap.read(frame) 处崩溃。

关于c++ - 使用 openCV 读取视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14833553/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com