版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2011-11-26 21:40
|
显示全部楼层
[OpenCV] 利用opencv捕获usb摄像头并写入视频文件: h" n' [% k; Y1 W7 g3 Z& n2 C, q" t
; X. V) s( `% U) c
: L# V' D" k8 T* u9 x4 V5 X5 u( o
对于搞视频监控的朋友来说,视频文件的写入,几乎是必须的一个步骤。这里,我给出一个视频文件写入的例子。首先是利用opencv进行USB相机的视频捕获,然后,将视频帧写入到视频文件当中。在进行视频文件的写入之前,有两点需要提醒:' |7 {5 D5 A9 U
4 \. ]) k7 p; ]" E. e(1)opencv只是一个图像处理的工具库,并不是视频处理的工具库!也就是说,它所处理的对象,应该是一张一张的图片,而opencv本身虽然有一些API函数可以进行USB相机的读取,但也仅仅是调用了windows 底层的vfw模块来实现,所以,如果你是windows vista,windows7之类的操作系统,很可能微软已经抛弃了vfw模块。而这个时候,再利用opencv的相机视频捕获函数,就无法获取视频帧了。9 i& i5 l% ?6 R4 C
- ?6 P/ x$ k1 y' Q( ~& M8 J(2)视频文件(.mpeg,.mp4,.rmvb,.avi等格式)的读写,需要专门的视频编解码器。很显然,不同格式的视频文件,采用的视频编码技术是不相同的(值得提醒的是,.avi格式的视频文件,尽管后缀是相同的,但内部采用的视频编码算法仍可能不相同,具体可以参考这里http://blog.csdn.net/carson2005/article/details/6314089),所以,进行视频文件读写之前,你需要按照相应的视频编解码器。而暴风,kmplayer之类的视频播放器,其内部就已经包含了常用的视频格式文件的编解码器。所以,你可以直接利用他们进行视频文件的播放。; R6 ~( i- e4 K" F; L3 F' `; }# v
$ E( l, \* L4 _& Y# o8 a
OK,了解了上面两点,你就知道,在利用opencv进行视频文件写入之前,必须要下载相应的视频编解码器。常用的有divx,xvid,ffmpeg等,笔者在这里采用xvid(这里有个简单介绍:http://blog.csdn.net/carson2005/article/details/6553867)。
$ b" y: A- ~3 f+ k- G+ }( Y" o
下面给出参考代码:
9 B+ ]" X8 l% I
* i, z( F2 R2 Z" h7 P6 E#include "stdafx.h"( ?( @4 t$ h+ O5 h# {1 C4 p+ K6 g( M
#include "cv.h"& q2 B6 Y+ o3 a! }" L$ f" \; y
#include "highgui.h"
( b! P5 X! @/ @; X- A0 g#include "iostream"& _1 n: S& V( n! H$ o3 ?- I5 G
using namespace std;8 b, t/ X6 n" C7 {" n
( E' y5 u; x. L/ Q* V. I
3 _2 O; B' W- N
: _0 p7 [' O8 P! O. g, kint _tmain(int argc, _TCHAR* argv[])0 O1 w' _; W$ x+ ^
{/ k7 x6 [1 c4 B- c6 v1 ]% o# ?
CvCapture *cap = cvCreateCameraCapture(0);//初始化相机捕获的指针% L6 m) k7 s* M+ X2 B1 r3 w' i
if (!cap)
9 j- T! P: ]/ j7 M: e7 T{# u3 w- Y' T7 q) P2 _: i& W6 d4 A
cout<<"create camera capture error..."<<endl;
9 s% f1 L( e& A" h* b( t system("pause");+ }! p! P3 ?( V+ C; C% }
exit(-1);( P {; N$ p) _8 c
}
2 a; a2 V% l% |4 [/ W! G0 x @! g# m, h, z# k9 m( J+ I
IplImage *tempImg = cvQueryFrame(cap);& t* H3 e6 C& F
double fps = 20;
" H. d/ I+ x& G7 GCvSize size = cvSize(" _) V4 N* `+ R7 ^
(int)cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH),
4 l9 n( J) D8 V0 G0 {5 A (int)cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT)/ f( }) g3 F+ A2 }6 V9 U5 v* P9 f' z, c
);
9 \, W0 Q: v9 Q& _; {2 HCvVideoWriter *writer = cvCreateVideoWriter("c:/test.avi", CV_FOURCC('X','V','I','D'), fps, size);
i4 a/ m6 y5 r6 g9 v- v, P/ k- P5 ~2 H9 ?1 p
IplImage *img = cvCreateImage(size, 8, 3);& d7 g" u/ T* ~7 i
while((tempImg=cvQueryFrame(cap)) != NULL)
% i9 K- W+ o. \# C/ N{
2 T# r8 }% I: G+ [ cvCopy(tempImg, img);! ]8 c& ]9 O7 e2 P
if (img->origin == IPL_ORIGIN_TL)' d, v1 u: F0 {) f A" O, ^
{
( _9 n7 @/ Q& v+ Y cvFlip(img, img);
3 c0 C, d* `2 U; ~/ z% J }
, ^- F5 X+ _! N6 J0 [- R1 n cvWriteFrame(writer, img);
; F% n0 M F: H* x}
* L- Z" ^1 L3 E9 U/ A5 M/ f/ N
( G2 a/ W& y. KcvReleaseImage(&img);
9 K# Z* B/ y+ _. l' W: X- hcvReleaseCapture(&cap);
# D8 u: I1 _+ p2 L2 T& \cvReleaseVideoWriter(&writer);
+ @. b: O1 D1 c
2 H8 E! z" c5 |2 C. ?system("pause");/ c: X4 [& n" J* L) m7 y
return 0;/ n8 ^: n" a9 I6 v0 B+ D
} |
|