版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2011-11-26 21:40
|
显示全部楼层
[OpenCV] 利用opencv捕获usb摄像头并写入视频文件. p. w w" p) K2 ^9 u; B1 A
) x* j; _) r( V: J. A$ I9 ?! Z% ~& d+ m- m6 @2 u
0 g. S j4 M; M对于搞视频监控的朋友来说,视频文件的写入,几乎是必须的一个步骤。这里,我给出一个视频文件写入的例子。首先是利用opencv进行USB相机的视频捕获,然后,将视频帧写入到视频文件当中。在进行视频文件的写入之前,有两点需要提醒:
8 c, f% x# m' R* _; V% G, X+ ~+ ` P
(1)opencv只是一个图像处理的工具库,并不是视频处理的工具库!也就是说,它所处理的对象,应该是一张一张的图片,而opencv本身虽然有一些API函数可以进行USB相机的读取,但也仅仅是调用了windows 底层的vfw模块来实现,所以,如果你是windows vista,windows7之类的操作系统,很可能微软已经抛弃了vfw模块。而这个时候,再利用opencv的相机视频捕获函数,就无法获取视频帧了。5 `7 q0 k: N% L" D' A
2 G! Q2 |/ o! R9 i, N: P
(2)视频文件(.mpeg,.mp4,.rmvb,.avi等格式)的读写,需要专门的视频编解码器。很显然,不同格式的视频文件,采用的视频编码技术是不相同的(值得提醒的是,.avi格式的视频文件,尽管后缀是相同的,但内部采用的视频编码算法仍可能不相同,具体可以参考这里http://blog.csdn.net/carson2005/article/details/6314089),所以,进行视频文件读写之前,你需要按照相应的视频编解码器。而暴风,kmplayer之类的视频播放器,其内部就已经包含了常用的视频格式文件的编解码器。所以,你可以直接利用他们进行视频文件的播放。
: g, E% V- ~" S. \" }* P: ~* t" D! M7 \5 S1 Y. L" K
OK,了解了上面两点,你就知道,在利用opencv进行视频文件写入之前,必须要下载相应的视频编解码器。常用的有divx,xvid,ffmpeg等,笔者在这里采用xvid(这里有个简单介绍:http://blog.csdn.net/carson2005/article/details/6553867)。! Z4 C2 t i8 X7 j% T. _4 J/ A
( E, ~6 z6 b' N8 }+ T0 H下面给出参考代码:# k9 J" ` E( g" u5 A
, k$ _: d: B& b" b2 e#include "stdafx.h"
5 @# ]0 d/ y$ a; z% Z4 j4 R& v#include "cv.h"
1 [7 j& @ a1 a2 N& R#include "highgui.h"
8 H d. s& n4 H* o3 _' ?#include "iostream"' v: e5 \- ?; C$ f$ A7 x
using namespace std;
6 T0 v5 n2 K! _) S5 J! k
1 d7 R- p% b6 w6 ?2 @2 q0 N/ M; a* b7 i! R3 P7 o
2 A' I: Y. [4 H8 G9 j, Wint _tmain(int argc, _TCHAR* argv[])0 @: J }! N# Q5 v" o+ E
{( q0 O1 T. g7 s7 f$ W4 F
CvCapture *cap = cvCreateCameraCapture(0);//初始化相机捕获的指针" p) J1 R) m, \* j
if (!cap)8 r9 I; N0 D) Y' T
{4 z8 ^$ K. f9 _9 R
cout<<"create camera capture error..."<<endl;
8 b. m2 J9 E, a, O7 x8 n0 d8 C system("pause");1 I8 y! h$ I; a' u/ Q* N: L, f
exit(-1);
; [' f- \5 ^1 V# j0 ?7 C}4 \% M+ P2 w1 k/ _; F( \
& w" x/ v1 |4 ]0 w! @9 ~- FIplImage *tempImg = cvQueryFrame(cap); \ L6 \$ g B! b
double fps = 20;
# i; H0 N ~/ W" i7 ACvSize size = cvSize(
$ F6 c9 R4 ^# W& J7 T, j# I9 n8 i (int)cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH),0 u& b0 T$ m3 v# P: N& C8 Q$ T
(int)cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT)- v2 r% d( z% m8 L& Z5 o' F5 ]: V. R
);
1 D5 }5 d/ }+ ^: N/ t- G' zCvVideoWriter *writer = cvCreateVideoWriter("c:/test.avi", CV_FOURCC('X','V','I','D'), fps, size);
: h% S w9 r- B$ y6 K c* i. m2 k5 n% Y% Q& w, {
IplImage *img = cvCreateImage(size, 8, 3);& Z* U0 U/ {' K |* [& u
while((tempImg=cvQueryFrame(cap)) != NULL)
) h0 M7 l; [+ e* s/ [- L{
h+ H( x5 V3 r, p( u, X cvCopy(tempImg, img);
+ H5 Y6 T2 h _2 v8 S/ ]# E if (img->origin == IPL_ORIGIN_TL)( _( R4 e5 S" x% I- L5 [+ o# U$ O
{2 j, b- z# e7 u2 A- W- J
cvFlip(img, img);
- m) t1 E, U3 |& d" v; V }
. ~9 ]- v5 C3 d4 n, {) `& H* f7 X cvWriteFrame(writer, img);* P' J5 W: v# O* \" X% y
}3 _# ?( v1 r% k' d
8 i( @& L! p4 b; P9 j' AcvReleaseImage(&img);
/ b- g+ H9 s: N% |4 P7 u: DcvReleaseCapture(&cap);
1 t1 w7 z4 p1 S S5 ]6 EcvReleaseVideoWriter(&writer);
c/ U# [- G y9 M8 X0 o5 P! S9 `( W5 }0 {3 X) L2 M5 u
system("pause");+ B" J B* O' X# _2 U% Y
return 0;
I+ }' H) P5 n) P4 y} |
|