openCV读取一段视频, 显示帧数是0 , 这是为什么呢?
时间: 2023-02-28 10:43:45 浏览: 247
如果读取视频后显示帧数为0,那么可能是因为以下几个原因:
1. 视频文件不存在或没有权限读取,请检查视频文件的路径和权限。
2. 视频格式不支持,请检查视频的格式是否被OpenCV支持。
3. 编码问题,视频可能被破坏或损坏,请尝试用其他工具打开该视频,如果可以正常播放,那么这个问题可能是由于OpenCV不支持该视频的编码方式。
如果以上都没有问题,那么可以考虑重新安装OpenCV或者升级到最新版本,或者尝试把视频转换成其他格式。
相关问题
用opencv读取一段视频并二值化过滤后显示出来,C++
可以使用OpenCV库中的VideoCapture来读取视频,然后使用二值化函数threshold来进行过滤,最后使用imshow函数显示处理后的视频帧。
以下是示例代码:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
// 打开视频文件
VideoCapture cap("test.mp4");
if (!cap.isOpened())
{
std::cerr << "Error opening video file." << std::endl;
return -1;
}
// 创建窗口
namedWindow("Video", WINDOW_NORMAL);
// 读取视频帧并处理
Mat frame, gray;
while (cap.read(frame))
{
// 转换为灰度图像
cvtColor(frame, gray, COLOR_BGR2GRAY);
// 二值化处理
threshold(gray, gray, 128, 255, THRESH_BINARY);
// 显示处理后的视频帧
imshow("Video", gray);
// 等待按键
if (waitKey(20) == 27) // ESC键
break;
}
// 释放资源
cap.release();
destroyAllWindows();
return 0;
}
```
在代码中,使用VideoCapture打开视频文件并检查是否成功打开。接着创建一个窗口用于显示视频,使用while循环读取视频帧并进行处理,最后使用imshow显示处理后的视频帧。在等待按键的过程中,如果按下了ESC键,就退出循环。最后释放资源并关闭窗口。
用c++编写一段程序,利用opencv读取一段视频,并实时显示这段视频的帧率
好的,以下是一个简单的示例程序,可以读取视频并实时显示帧率:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
// 打开视频文件
VideoCapture cap("test.mp4");
if (!cap.isOpened())
{
cerr << "Error opening video file." << endl;
return -1;
}
// 获取帧率
double fps = cap.get(CAP_PROP_FPS);
if (fps <= 0)
{
cerr << "Error getting frame rate." << endl;
return -1;
}
// 创建窗口
namedWindow("Video", WINDOW_NORMAL);
// 循环读取视频帧
Mat frame;
double t_start = 0;
double t_end = 0;
while (true)
{
// 读取一帧
cap >> frame;
if (frame.empty())
{
// 视频播放完毕
break;
}
// 显示当前帧
imshow("Video", frame);
// 计算帧率
t_end = getTickCount();
double t_delta = (t_end - t_start) / getTickFrequency();
double fps_cur = 1.0 / t_delta;
t_start = t_end;
// 打印帧率
cout << "FPS: " << fps_cur << endl;
// 等待按键
if (waitKey(1) == 'q')
{
break;
}
}
// 释放资源
cap.release();
destroyAllWindows();
return 0;
}
```
在上述代码中,我们首先打开视频文件,然后获取视频的帧率。接着,我们创建一个窗口,循环读取视频帧,并实时显示帧率。最后,我们释放资源并关闭窗口。
需要注意的是,我们通过计算两次 `getTickCount()` 的时间差,来估算每秒钟可以读取多少帧。这种方式可以在很大程度上保证帧率的准确性,但是由于计算量较大,可能会影响程序的性能。如果您需要更高的性能,可以考虑使用其他方式来计算帧率。