版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2011-11-26 21:40
|
显示全部楼层
[OpenCV] 利用opencv捕获usb摄像头并写入视频文件
- R" n. P& \6 J4 H8 P1 ~9 t+ E8 W6 O0 f0 \8 h/ [0 S
- C* j# G$ V( T+ p7 ]. W0 ?
) }+ d+ h; T2 z; ?对于搞视频监控的朋友来说,视频文件的写入,几乎是必须的一个步骤。这里,我给出一个视频文件写入的例子。首先是利用opencv进行USB相机的视频捕获,然后,将视频帧写入到视频文件当中。在进行视频文件的写入之前,有两点需要提醒:. q% f) @; p- f/ `! s
- b$ C! V/ G9 f. t% Y8 @9 N$ |(1)opencv只是一个图像处理的工具库,并不是视频处理的工具库!也就是说,它所处理的对象,应该是一张一张的图片,而opencv本身虽然有一些API函数可以进行USB相机的读取,但也仅仅是调用了windows 底层的vfw模块来实现,所以,如果你是windows vista,windows7之类的操作系统,很可能微软已经抛弃了vfw模块。而这个时候,再利用opencv的相机视频捕获函数,就无法获取视频帧了。
2 B: z( u6 M, X8 B( P( R7 b, e, F
* D9 ^* x: r% ?7 V. u(2)视频文件(.mpeg,.mp4,.rmvb,.avi等格式)的读写,需要专门的视频编解码器。很显然,不同格式的视频文件,采用的视频编码技术是不相同的(值得提醒的是,.avi格式的视频文件,尽管后缀是相同的,但内部采用的视频编码算法仍可能不相同,具体可以参考这里http://blog.csdn.net/carson2005/article/details/6314089),所以,进行视频文件读写之前,你需要按照相应的视频编解码器。而暴风,kmplayer之类的视频播放器,其内部就已经包含了常用的视频格式文件的编解码器。所以,你可以直接利用他们进行视频文件的播放。, t* |* ~% g0 e$ I: ^8 I
% [/ _7 ]& s" JOK,了解了上面两点,你就知道,在利用opencv进行视频文件写入之前,必须要下载相应的视频编解码器。常用的有divx,xvid,ffmpeg等,笔者在这里采用xvid(这里有个简单介绍:http://blog.csdn.net/carson2005/article/details/6553867)。9 x8 s4 c: @9 G2 f. \
% D& m" | ^. C/ v4 d
下面给出参考代码:
7 T" {9 b8 N$ i9 N* ], g' C A- v- o4 K% r7 j# q% F& E% C
#include "stdafx.h": l/ J7 z% o% u( o5 L) [* `
#include "cv.h"
* v+ W7 F$ |, {/ a#include "highgui.h". H |; x7 A; p; _
#include "iostream"4 i: U# X3 g( w. L8 u
using namespace std;
' R6 R' ] @- a- L; M1 D' a( M% X% e+ t2 }3 C
! s9 k: A8 f: \3 n; Y% i
+ x1 T3 }- L* Q; Rint _tmain(int argc, _TCHAR* argv[])
# M( P3 o j, z0 o* Y7 i{- G3 d; c$ T$ A# p/ W
CvCapture *cap = cvCreateCameraCapture(0);//初始化相机捕获的指针
; q9 Y; @) v$ kif (!cap)
" K8 n/ K; c( [4 q{
- u" m- {8 @* C) o cout<<"create camera capture error..."<<endl;
+ C0 I# z2 l' [" A7 r) d2 J+ y system("pause");
7 g" ^& K3 k/ @ exit(-1);
1 u, L' w. h' J. X8 _6 h}
0 r7 T0 `0 U" c
" E9 h# F$ H- a! f3 J) j+ ^" ]/ U$ J, CIplImage *tempImg = cvQueryFrame(cap);" |0 R5 X* u& r" W8 t$ F1 i
double fps = 20;
$ j' Q1 h0 {( D: ]" X0 H: C5 KCvSize size = cvSize(
% b& r; \9 ]! }6 \ (int)cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH),0 ]3 K* {& g5 [) b! H, y+ I
(int)cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT)
( [' W/ {/ i8 {# f" L );
$ X6 _# m v a1 t7 Y2 _1 jCvVideoWriter *writer = cvCreateVideoWriter("c:/test.avi", CV_FOURCC('X','V','I','D'), fps, size);1 g7 t/ f) E( {6 ^
4 d) _% a x z# B- P9 I6 K2 m
IplImage *img = cvCreateImage(size, 8, 3);
' ]8 z9 B& ~& N: m8 U$ Iwhile((tempImg=cvQueryFrame(cap)) != NULL)
4 V i5 J+ O6 ~" T5 \! D" f( T{! [/ j' B2 E/ U( f5 [" S
cvCopy(tempImg, img);' U& u9 m7 |; u8 F
if (img->origin == IPL_ORIGIN_TL)0 V! `0 F" J+ r) ]! f$ T
{
6 O% u" q* o ]; L6 W3 M3 A cvFlip(img, img);
5 C0 T6 v- \2 r; _/ _6 d( [ }
. ^, U/ Y4 v0 z, h( J, F& m cvWriteFrame(writer, img);
( p" _: z* z/ I- [% c- J}
) E2 a4 ?" f3 I" F K/ L% [/ l1 z' O7 w: J2 i: t
cvReleaseImage(&img);
6 e5 X {8 o5 K5 EcvReleaseCapture(&cap);
) d. ?$ m" Q& h( scvReleaseVideoWriter(&writer);" p$ X5 N, v0 v0 h; x9 \+ C
! u% D) x8 m; e- osystem("pause");; I0 Y" V2 ^( }! z/ w' J, |0 v1 U
return 0;
1 R) M# @' Q4 S) i6 P} |
|