[zt]OpenCV如何获取视频当前的一帧图像

(OpenCV读取视频、OpenCV提取视频每一帧、每一帧图片合成新的AVI视频)CvCapture 是视频获取结构 被用来作为视频获取函数的一个参数 比如 CvCapture* cap; IplImage* cvQueryFrame( cap ); 从摄像头或者文件中抓取并返回一帧————————————————————————

Opencv读取视频代码

  1. #include "stdafx.h"
  2. #include"highgui.h"
  3. int main(int argc,char* argv[])
  4. {
  5. cvNamedWindow( "avi");
  6. CvCapture* capture = cvCreateFileCapture( "D:\\sample.avi");
  7. IplImage* frame;
  8. while(1)
  9. {
  10. frame = cvQueryFrame(capture);
  11. if(!frame) break ;
  12. cvShowImage( "avi",frame);
  13. char c = cvWaitKey(33);
  14. if(c == 27)
  15. break;
  16. }
  17. cvReleaseCapture(&capture);
  18. cvDestroyWindow( "avi");
  19. return 0;
  20. }

结构体 CvCapture

CvCapture 是一个结构体,用来保存图像捕获所需要的信息。 opencv提供两种方式从外部捕获图像:

一种是从摄像头中,

一种是通过解码视频得到图像。

两种方式都必须从第一帧开始一帧一帧的按顺序获取,因此每获取一帧后都要保存相应的状态和参数。

比如从视频文件中获取,需要保存视频文件的文件名,相应的解码器类型,下一次如果要

获取将需要解码哪一帧等。 这些信息都保存在CvCapture结构中,每获取一帧后,这些信息

都将被更新,获取下一帧需要将新信息传给获取的 api接口

cvCreateFileCapture(char*name)

通过输入要读取的avi文件的路径,然后,该函数返回一个指向 CvCapture结构体的指针。

cvQueryFrame(capture)

输入一个CvCapture 类型的指针,该函数主要功能是将视频文件的下一帧加载到内存。与 cvLoadImage的不同之处是,该函数不重新分配内存空间。

C=cvWaitKey(33)

当前帧被显示后,等待 33毫秒。如果用户触发了一个按键, c会被设置成这个按键的 ASCII码,否则会被设置成 -1。

cvWaitKey(33) 在此处的另外一个作用是,控制帧率。

cvReleaseCapture(&capture)

释放为 CvCapture结构体开辟的内存空间

关闭打开的 AVI文件相关的文件句柄

读取摄像头

只需把 cvCreateFileCapture 改成cvCreateCameraCapture即可。

该函数的输入参数是一个 ID号,只有存在多个摄像头时才起作用。当 ID=-1时,表示

随机选择一个。 HighGUI做了很多工作,使得摄像机图像序列像一个视频文件一样。

常见问题

cvCreateFileCapture返回空的问题

  • ( 1)视频文件路径没写对
  • ( 2)没有安装解码器
  • ( 3)如果使用的是 Opencv2.0或更高版本,那么,能否正确加载 opencv_ffmpeg210.dll
  • ( 4)尽管是 AVI文件,但也可能使用了某种 codec,例如 :MJPEG Decompressor。 需要把它转换 OpenCV支持的 AVI文件 . OpenCV支持的AVI。例如使用狸窝全能视频转换器,在《预置方案》处,选择 AVI-Audio_Video Interleaved(*.avi)。或者使用格式工厂也可以。
  • ( 5)读摄像头数据,需要安装与摄像头相应的驱动程序。

————————————————————

cvQueryFrame

OpenCV中一个函数cvQueryFrame

从摄像头或者文件中抓取并返回一帧

IplImage* cvQueryFrame( CvCapture* capture );

capture

视频获取结构。

函数cvQueryFrame从摄像头或者文件中抓取一帧,然后解压并返回这一帧。 这个函数仅仅是函数cvGrabFrame和 函数cvRetrieveFrame在一起调用的组合。 返回的图像不可以被用户释放或者修改。

cvQueryFrame的参数为CvCapture结构的指针。用来将下一帧视频文件载入内存,返回一个对应当前帧的指针。与cvLoadImage不同的是cvLoadIamge为图像分配内存空间,而cvQueryFrame使用已经在cvCapture结构中分配好的内存。这样的话,就没有必要通过cvReleaseImage()对这个返回的图像指针进行释放,当CvCapture结构被释放后,每一帧图像所对应的内存空间即会被释放。

________________________________________________________________________________

opencv提取视频每一帧

    1. // test3.cpp
    2. //
    3. // 该程序实现视频和图片的相互转换.
    4. // Image_to_video()函数将一组图片合成AVI视频文件.
    5. // Video_to_image()函数将AVI视频文件读入,将每一帧存储为jpg文件.
    6. //
    7. ////////////////////////////////////////////////////////////////////////
    8. #include <stdlib.h>
    9. #include <stdio.h>
    10. #include <math.h>
    11. #include <cv.h>
    12. #include <highgui.h>
    13. #define NUM_FRAME 300 //只处理前300帧,根据视频帧数可修改
    14. void Video_to_image(char* filename)
    15. {
    16. printf("------------- video to image ... ----------------n");
    17. //初始化一个视频文件捕捉器
    18. CvCapture* capture = cvCaptureFromAVI(filename);
    19. //获取视频信息
    20. cvQueryFrame(capture);
    21. int frameH    = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);
    22. int frameW    = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);
    23. int fps       = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
    24. int numFrames = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
    25. printf("tvideo height : %dntvideo width : %dntfps : %dntframe numbers : %dn", frameH, frameW, fps, numFrames);
    26. //定义和初始化变量
    27. int i = 0;
    28. IplImage* img = 0;
    29. char image_name[13];
    30. cvNamedWindow( "mainWin", CV_WINDOW_AUTOSIZE );
    31. //读取和显示
    32. while(1)
    33. {
    34. img = cvQueryFrame(capture); //获取一帧图片
    35. cvShowImage( "mainWin", img ); //将其显示
    36. char key = cvWaitKey(20);
    37. sprintf(image_name, "%s%d%s", "image", ++i, ".jpg");//保存的图片名
    38. cvSaveImage( image_name, img);   //保存一帧图片
    39. if(i == NUM_FRAME) break;
    40. }
    41. cvReleaseCapture(&capture);
    42. cvDestroyWindow("mainWin");
    43. }
    44. void Image_to_video()
    45. {
    46. int i = 0;
    47. IplImage* img = 0;
    48. char image_name[13];
    49. printf("------------- image to video ... ----------------n");
    50. //初始化视频编写器,参数根据实际视频文件修改
    51. CvVideoWriter *writer = 0;
    52. int isColor = 1;
    53. int fps     = 30; // or 25
    54. int frameW = 400; // 744 for firewire cameras
    55. int frameH = 240; // 480 for firewire cameras
    56. writer=cvCreateVideoWriter("out.avi",CV_FOURCC(‘X‘,‘V‘,‘I‘,‘D‘),fps,cvSize(frameW,frameH),isColor);
    57. printf("tvideo height : %dntvideo width : %dntfps : %dn", frameH, frameW, fps);
    58. //创建窗口
    59. cvNamedWindow( "mainWin", CV_WINDOW_AUTOSIZE );
    60. while(i<NUM_FRAME)
    61. {
    62. sprintf(image_name, "%s%d%s", "image", ++i, ".jpg");
    63. img = cvLoadImage(image_name);
    64. if(!img)
    65. {
    66. printf("Could not load image file...n");
    67. exit(0);
    68. }
    69. cvShowImage("mainWin", img);
    70. char key = cvWaitKey(20);
    71. cvWriteFrame(writer, img);
    72. }
    73. cvReleaseVideoWriter(&writer);
    74. cvDestroyWindow("mainWin");
    75. }
    76. int main(int argc, char *argv[])
    77. {
    78. char filename[13] = "infile.avi";
    79. Video_to_image(filename); //视频转图片
    80. Image_to_video();    //图片转视频
    81. return 0;
    82. }
时间: 2024-10-10 22:24:09

[zt]OpenCV如何获取视频当前的一帧图像的相关文章

对视频处理成一系列帧图像

说明:将视频cars3.avi变成一些类的帧图像,并保存为jpg格式的. obj=mmreader('cars3.avi');vidFrames=read(obj);numFrames=get(obj,'numberOfFrames');for k=1:numFrames     path='F:\cars3\cars3_frame';     ext='.jpg';     strtemp=sprintf('%s%d%s',path,k,ext);     vidFrames=read(obj

iOS获取视频中的指定帧的两种方法

方法一 :AVFoundation 1 #import <AVFoundation/AVFoundation.h> 2 3 - (UIImage *)thumbnailImageForVideo:(NSURL *)videoURL atTime:(NSTimeInterval)time { 4 AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil]; 5 NSParameterAssert(asset)

opencv打开摄像头获取视频程序

// // main.cpp // opencv3 // // Created by PKU on 14-9-16. // Copyright (c) 2014年 PKU. All rights reserved. // #include <opencv2/opencv.hpp> using namespace cv; using namespace std; int main() { CvCapture* capture=cvCaptureFromCAM(-1); CvVideoWriter

[OpenCV]2 读写视频

除了读入图片之外,读写视频也足够简单易学,下面来看看如何读写视频吧. 播放硬盘中的视频: #include "highgui.h" int main(int argc,char** argv) { cvNamedWindow("Test2",CV_WINDOW_AUTOSIZE); CvCapture* capture=cvCreateFileCapture(argv[1]); IplImage* frame; while(1) { frame=cvQueryFra

OpenCV采集的视频流转化成H264格式裸码流

本文通过OpenCV库采集摄像头视频,随后通过libx264库把帧转化成264格式的码流. 头文件: #ifndef _X264_ENCODER_H #define _X264_ENCODER_H #include <stdint.h> #include "x264.h" #include "opencv/cv.h" #include "opencv/highgui.h" struct x264_encoder{ x264_param

OpenCV 播放mkv视频

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/33371013 一.一个简单的OpenCV程序,用于播放硬盘中的视频文件 #include "opencv\highgui.h" int main() { cvNamedWindow("生活大爆炸.mkv",CV_WINDOW_AUTOSIZE); CvCapture* capture = cvCreateFileCapture("生活大

Android -- 获取视频第一帧缩略图

干货 从API 8开始,新增了一个类: android.media.ThumbnailUtils这个类提供了3个静态方法一个用来获取视频第一帧得到的Bitmap,2个对图片进行缩略处理. public static Bitmap createVideoThumbnail (String filePath, int kind) 第一个参数是视频文件的路径,第二个参数是指定图片的大小,有两种选择Thumbnails.MINI_KIND与Thumbnails.MICRO_KIND. 第一种文档上说大小

C#:获取视频某一帧的缩略图

读取方式:使用ffmpeg读取,所以需要先下载ffmpeg.网上资源有很多. 原理是通过ffmpeg执行一条命令获取视频某一帧的缩略图. 首先,需要获取视频的帧高度和帧宽度,这样获取的缩略图才不会变形. 获取视频的帧高度和帧宽度可以http://www.zhoumy.cn/?p=35通过查看. 获取到视频的帧高度和帧宽度后,还需要获取缩略图的高度和宽度,这是按比例缩放的. 比如你存放缩略图的区域的最大宽度和最大高度是100,缩略图的高度也应缩放到对应大小. 接下来通过执行一条命令就可以获取到视频

Java获取视频的大小、时长

前端上传视频之后,根据上传的视频文件获取视频的大小和时长 1.获取视频时长 private String ReadVideoTime(File source) { Encoder encoder = new Encoder(); String length = ""; try { MultimediaInfo m = encoder.getInfo(source); long ls = m.getDuration()/1000; int hour = (int) (ls/3600);