zoukankan      html  css  js  c++  java
  • 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路径一定要看清楚是否写对,

    否则同样的代码和视频文件在别人电脑上跑得好好的就你的有问题,可能就是这个问题了。

    好了这是我写的第一篇博客,写的不好多多见谅!!!

  • 相关阅读:
    React页面插入script
    Node Sass does not yet support your current environment解决办法
    ReactNative项目结构目录详解
    Android Studio模拟器磁盘空间不足(Not enough disk space to run AVD)
    React Native在window下的环境搭建(二):创建新项目
    React Native在window下的环境搭建(一)
    转:解决AndroidStudio连不上Android设备真机的问题
    ios中设置input为readonly后,解决弹起软键盘的问题
    转: rem与px的转换
    Python中模块之collections系列
  • 原文地址:https://www.cnblogs.com/BasilLee/p/3660593.html
Copyright © 2011-2022 走看看