版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2011-11-26 21:40
|
显示全部楼层
[OpenCV] 利用opencv捕获usb摄像头并写入视频文件: Z9 y2 ?- K6 Y& K
" J$ e G! h/ V, m# ?0 ~- d
& u9 Y9 r3 ?9 e" |4 z4 l2 g3 _9 z9 H/ r
对于搞视频监控的朋友来说,视频文件的写入,几乎是必须的一个步骤。这里,我给出一个视频文件写入的例子。首先是利用opencv进行USB相机的视频捕获,然后,将视频帧写入到视频文件当中。在进行视频文件的写入之前,有两点需要提醒:/ r1 O) U* W8 r5 m- J
; ?$ F& q. I8 E: E9 Z- D
(1)opencv只是一个图像处理的工具库,并不是视频处理的工具库!也就是说,它所处理的对象,应该是一张一张的图片,而opencv本身虽然有一些API函数可以进行USB相机的读取,但也仅仅是调用了windows 底层的vfw模块来实现,所以,如果你是windows vista,windows7之类的操作系统,很可能微软已经抛弃了vfw模块。而这个时候,再利用opencv的相机视频捕获函数,就无法获取视频帧了。
0 d" u e1 f/ T r# p, ~& P7 p3 Z+ H7 b4 e/ j
(2)视频文件(.mpeg,.mp4,.rmvb,.avi等格式)的读写,需要专门的视频编解码器。很显然,不同格式的视频文件,采用的视频编码技术是不相同的(值得提醒的是,.avi格式的视频文件,尽管后缀是相同的,但内部采用的视频编码算法仍可能不相同,具体可以参考这里http://blog.csdn.net/carson2005/article/details/6314089),所以,进行视频文件读写之前,你需要按照相应的视频编解码器。而暴风,kmplayer之类的视频播放器,其内部就已经包含了常用的视频格式文件的编解码器。所以,你可以直接利用他们进行视频文件的播放。
5 H6 d U3 g) F5 ]4 [# q" Q1 n0 w/ C$ B( e) {: e2 @! e
OK,了解了上面两点,你就知道,在利用opencv进行视频文件写入之前,必须要下载相应的视频编解码器。常用的有divx,xvid,ffmpeg等,笔者在这里采用xvid(这里有个简单介绍:http://blog.csdn.net/carson2005/article/details/6553867)。
5 C3 i5 t) Z, M/ M* m' K6 H
@4 p1 v- `0 |3 g I+ z下面给出参考代码:
( X# N1 L% W( j) {. L
" d) l) q) O# x- }#include "stdafx.h"
$ X x. {% q3 w- Q, e' ]#include "cv.h"
+ Y3 E1 u H. W4 t#include "highgui.h"" O7 {6 Y5 c0 G) B
#include "iostream"
$ J. I5 I6 j6 F1 h8 Gusing namespace std;3 o2 U! S F0 G# c; ]4 o
9 s4 p. a) j4 e7 I+ {/ l6 K% [( }% h7 }
- V" Z1 g* ^! }; v- qint _tmain(int argc, _TCHAR* argv[])! i O% K( V E$ m
{
2 d4 n, ]! y" d& QCvCapture *cap = cvCreateCameraCapture(0);//初始化相机捕获的指针
' c! s( |# Q) q4 d$ e0 Dif (!cap)
; r; I+ p4 y* h5 \. v. |{: B! P3 N( y2 x
cout<<"create camera capture error..."<<endl;; `3 G9 t# b6 r# Y$ |
system("pause");
6 E8 \; \4 `( P/ V exit(-1);
* F8 Z! c4 e# n/ B}
& ?( S, b, [0 p. X! k% H( A' a1 V5 s$ C# b( S2 {! W. }
IplImage *tempImg = cvQueryFrame(cap);
, j2 P/ j+ T4 a4 r% K0 S, c+ Bdouble fps = 20;0 X7 r9 U: M4 e _7 x$ @
CvSize size = cvSize(
9 a+ b9 F* }3 m5 m. ~4 U+ _8 H (int)cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH),/ X' G3 e+ l& z2 e2 N3 l9 u) H/ ~
(int)cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT)
, j5 ]5 d% G1 c& B );
* a; c5 J3 B3 q+ i% ZCvVideoWriter *writer = cvCreateVideoWriter("c:/test.avi", CV_FOURCC('X','V','I','D'), fps, size);2 W' X; v. e" u" ?1 G- w
( s$ n/ E% M8 q4 u6 a
IplImage *img = cvCreateImage(size, 8, 3);4 E. y) l- A/ s* L
while((tempImg=cvQueryFrame(cap)) != NULL)
* F) Y$ r" X2 i9 W4 y{4 a, K# M! U: W6 g( Q: H
cvCopy(tempImg, img);
+ I( v( X! x+ l9 {* h$ _ if (img->origin == IPL_ORIGIN_TL)6 ` }1 d* Q" E9 h' E0 ~; F
{1 `2 |/ K8 x% _; N2 @
cvFlip(img, img);) i5 t T d0 E6 J7 A
}
; A. n) p6 F& z. u' s6 M' p, \ cvWriteFrame(writer, img);' \+ X; B1 F" V: u- J& @
}' I6 e5 d J& i' e
% c7 y7 r8 k2 w( f) B: [2 g
cvReleaseImage(&img);: {" d+ r; c# p
cvReleaseCapture(&cap);
2 i- E6 T, R s; k* ~8 W8 B7 NcvReleaseVideoWriter(&writer);
" A$ m2 X3 l9 H4 U! X! B- v; y6 Y" [5 M! w$ J* h! x) Y
system("pause");
: e2 K3 Q: o9 B7 f+ Areturn 0;
" K4 _/ i% S' V; Q- a! q} |
|