Opencv读取视频一闪而过情况分析
在参加一个软件比赛需要用opencv对视频的处理,也碰到了一些问题。
最常见的就是视频一闪而过了,在网上查了好久都没解决,
最后重装在配置环境变量时发现的。
现在我来终结一下估计是比较全的了。
先说明我用的是vs2012+opencv(2.4.8),c++编程;
关于配置就不说了网上很多
代码如下:
#include"highgui.h"
#include"cv.h" //声明一个CvCapture类型指针 用于接收cvCreateFileCapture的返回值
CvCapture* g_capture = NULL;
//记录滚动条的当前位置
int g_slider_pos = 0 ;
//对视频帧进行计数的变量
int frame_count = 0; //滚动条的回调函数 参数int pos 是指当前滚动条所在位置
void on_changed(int pos)
{
//设置g_capture的属性 使得 从位置pos开始播放视频
cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos);
//在拉动滚动条后 保持变量frame_count与滚动条的位置是同步的
frame_count = pos ;
} int main(int argc,char* argv[])
{
//创建一个窗口
cvNamedWindow( "show");
//打开有一个视频文件
g_capture=cvCreateFileCapture("D:\\car.mp4");
//获取视频的总帧数
int frames=(int )cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT); if(frames>0)
{
//在窗口show上创建名字为Position的滚动条
cvCreateTrackbar( "Position","show" ,&g_slider_pos,frames,on_changed);
} //图像指针变量
IplImage* frame; while(1)
{
//从g_capture获取一帧图像 填充到相应的内存缓冲区
frame=cvQueryFrame(g_capture);
//如果到视频结尾 则退出循环
if(!frame) break ;
//显示图像
cvShowImage( "show",frame);
//接收用户按键
char c = cvWaitKey(33);
//如果接收到 按键'Esc' 则退出循环
if(c==27)
break;
//滚动条 随着视频的播放 进行移动
cvSetTrackbarPos( "Position","show" ,frame_count);
frame_count++;
}
//释放资源
cvReleaseCapture(&g_capture);
cvDestroyWindow( "show");
return 0;
}
1.网上很多说是avi格式问题,尽管是AVI文件, 需要把它转换OpenCV支持的AVI文件.
(这是copy网上的)
OpenCV支持的AVI如下:
Container
FourCC
Name
Description
AVI
'DIB '
RGB(A)
Uncompressed RGB, 24 or 32 bit
AVI
'I420'
RAW I420
Uncompressed YUV, 4:2:0 chroma subsampled
AVI
'IYUV'
RAW I420
identical to I420
转换格式解决方法:
解决方法1:下载mencoder.exe, 在window命令行下使用: mencoder in.avi -ovc raw -vf format=i420 -o out.avi
解决方法2:下载VitualDub, 我使用1.9.4版本a. File->Open Video File;b. Video->Filters->Add->Convert format;
选择4:2:0 Planar YCbCr (YV12)或者 32-Bit RGB。c. Save as AVI. 保存完毕。”
还有网上说opencv只支持avi格式至少我现在用的2.4.8还能支持MP4格式了,还跑得不错。
2.最后就是在配置环境变量时path路径一定要看清楚是否写对,

否则同样的代码和视频文件在别人电脑上跑得好好的就你的有问题,可能就是这个问题了。
好了这是我写的第一篇博客,写的不好多多见谅!!!
Opencv读取视频一闪而过情况分析的更多相关文章
- opencv 读取视频内容写入图片帧
现在主要把自己平时用到的opencv功能记录到博客,一方面方便自己有时间来回顾,另一方便提供给大家一个参考. opencv 读取视频内容,把视频帧每一帧写成图片,存入电脑中.这个步骤是许多数据处理的基 ...
- 【计算机视觉】OpenCV读取视频获取时间戳等信息(PS:经测试并不是时间戳,与FFMPEG时间戳不一样)
OpenCV中通过VideoCaptrue类对视频进行读取操作以及调用摄像头,下面是该类的API. 1.VideoCapture类的构造函数: C++: VideoCapture::VideoCapt ...
- Opencv读取视频
CvCapture 是一个结构体,用来保存图像捕获所需要的信息. opencv提供两种方式从外部捕获图像 一种是从摄像头中, 一种是通过解码视频得到图像. 两种方式都必须从第一帧开始一帧一帧的按顺序获 ...
- C/C++ OpenCV读取视频与调用摄像头
原文:http://blog.csdn.net/qq78442761/article/details/54173104 OpenCV通过VideoCapture类,来对视频进行读取,调用摄像头 读取视 ...
- python+opencv读取视频,调用摄像头
引用 import cv2 import numpy 创建摄像头对象 cap = cv2.VideoCapture("videoTest/test1.mp4") #参数为视频文件目 ...
- OpenCV 读取视频 多种方式
OpenCV中常见的视频方式是while循环读取,可是,当遇到嵌套循环呢 1.常见的while循环 ,没有嵌套循环 cv::VideoCapture capture("d:/test/dem ...
- Linux OpenCV读取视频失败,cvCreateFileCapture失败的解决
背景: 近期想在嵌入式平台上开发QT+Opencv,无料PC机上编写的OpenCV程序老是打不开视频. 開始提示:OpenCV Error: Bad argument (Array should be ...
- C++ 调用 opencv 读取视频文件列表并处理
//g++ trans_video.cpp -o trans_video `pkg-config opencv --libs --cflags` -L/usr/lib/x86_64-linux-gnu ...
- OpenCV3读取视频或摄像头
我们可以利用OpenCV读取视频文件或者摄像头的数据,将其保存为图像,以用于后期处理.下面的实例代码展示了简单的读取和显示操作: // This is a demo introduces you to ...
随机推荐
- [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.1.1
Given any $k$-tupel of linearly independent vectors $X$ as above, there exists a $k$-tuple $Y$ biort ...
- cefSharp 设置运行时系统语言
在使用用CefSharp使用过程中,系统用了很多第三方控件.这些控件很多能够根据浏览器设置的语言来进行控件展示对应语言. 在cefSharp可以设置系统语言,代码如下: CefSharp.Settin ...
- Spark常见错误汇总
1. Spark Driver cannot bind on port0, SparkContext initialized failed 如果是通过spark-submit等命令行提交的任务,在sp ...
- Weka 自动优化参数
import weka.core.*; import weka.classifiers.*; import weka.classifiers.meta.*; import weka.classifie ...
- E297: Write error in swap file解决方法
vi打开配置文件后显示E297: Write error in swap file,检查磁盘发现磁盘满了.使用du –max-depth=1 | sort –n –r 查找大文件所在位置并删除.
- openStack 使用public key登陆
- HTTP 缓存控制总结
引言 通过网络获取内容既缓慢,成本又高:大的响应需要在客户端和服务器之间进行多次往返通信,这拖延了浏览器可以使用和处理内容的时间,同时也增加了访问者的数据成本.因此,缓存和重用以前获取的资源的能力成为 ...
- 不只是打车软件,中国车主们赋予了Uber更多意义
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- IP头部校验(转)
一:原理 当发送IP包时,需要计算IP报头的校验和: 1.把校验和字段置为0: 2.对IP头部中的每16bit进行二进制求和: 3.如果和的高16bit不为0,则将和的高16bit和低16bit反复相 ...
- jdbc内容
Jdbc:java数据库连接技术 主要执行操作:连接数据库,执行sql语句,处理结果 Class.forName("com.mysql.jdbc.Driver"); 执行jdbc驱 ...