版主
主题
帖子
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2011-11-26 21:40
|
显示全部楼层
[OpenCV] 利用opencv捕获usb摄像头并写入视频文件/ a+ O7 f9 R% ~2 K& m8 N
' C: G( y1 m/ K
# A u0 B& Z- A8 C
+ L0 Z. N" S8 u0 X1 H& W6 k' [6 a" O" J对于搞视频监控的朋友来说,视频文件的写入,几乎是必须的一个步骤。这里,我给出一个视频文件写入的例子。首先是利用opencv进行USB相机的视频捕获,然后,将视频帧写入到视频文件当中。在进行视频文件的写入之前,有两点需要提醒:8 p$ Q4 _- q/ H$ f3 Y
/ ]/ d2 H5 P* c d& g% R(1)opencv只是一个图像处理的工具库,并不是视频处理的工具库!也就是说,它所处理的对象,应该是一张一张的图片,而opencv本身虽然有一些API函数可以进行USB相机的读取,但也仅仅是调用了windows 底层的vfw模块来实现,所以,如果你是windows vista,windows7之类的操作系统,很可能微软已经抛弃了vfw模块。而这个时候,再利用opencv的相机视频捕获函数,就无法获取视频帧了。5 b7 j5 D9 L; K% f2 c
& E! z" t' o, N( I
(2)视频文件(.mpeg,.mp4,.rmvb,.avi等格式)的读写,需要专门的视频编解码器。很显然,不同格式的视频文件,采用的视频编码技术是不相同的(值得提醒的是,.avi格式的视频文件,尽管后缀是相同的,但内部采用的视频编码算法仍可能不相同,具体可以参考这里http://blog.csdn.net/carson2005/article/details/6314089),所以,进行视频文件读写之前,你需要按照相应的视频编解码器。而暴风,kmplayer之类的视频播放器,其内部就已经包含了常用的视频格式文件的编解码器。所以,你可以直接利用他们进行视频文件的播放。' l) p. D! `1 p9 j! [. y9 v
4 F3 c/ H; |* U( i+ m$ A* u5 X1 f; P, g
OK,了解了上面两点,你就知道,在利用opencv进行视频文件写入之前,必须要下载相应的视频编解码器。常用的有divx,xvid,ffmpeg等,笔者在这里采用xvid(这里有个简单介绍:http://blog.csdn.net/carson2005/article/details/6553867)。
3 W7 R* n" P! m n2 ^. \) `! \, r/ [
8 o+ B5 S! `7 E" G下面给出参考代码:
5 X! L; O% } I; g7 @/ Z/ g4 Y1 K+ v
#include "stdafx.h"
- l' d4 @( d# P#include "cv.h"
- @* v2 y! L6 F) k8 y* T#include "highgui.h". F' p. Q4 p: v* d( j, F6 |6 _" L
#include "iostream"' G h6 r; T: c o% K b' ^
using namespace std;) k* n1 |5 `* N( F6 h
2 [6 K0 J ~& J. q& u6 O. y$ t/ i% B3 M
, ~3 t3 i9 m( f! e$ D6 C" ^int _tmain(int argc, _TCHAR* argv[])) D9 G+ |8 X Z8 l
{
# q" p" T& e {# F$ G$ }CvCapture *cap = cvCreateCameraCapture(0);//初始化相机捕获的指针
! U; t7 ]' `9 ^, vif (!cap)
& x- A( t9 d, q; M{
6 g5 q- J+ @# g cout<<"create camera capture error..."<<endl;) ^* } {+ F$ A m: a1 {( f _2 R
system("pause");; _+ Q/ {4 G: L, G
exit(-1); g: U9 W* e' C( b& K# V7 @* L
}
& r; {8 G* i" L$ c, |8 T; @& [) m
IplImage *tempImg = cvQueryFrame(cap);
$ ?7 d8 ~$ D3 W* L. J" p W# A* O7 ?+ Sdouble fps = 20;
' y$ n3 P( c1 d# dCvSize size = cvSize(! W7 I* e7 e) t% M# H8 B
(int)cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH),% ]1 y5 Q3 h$ U1 @$ ~4 v; v& {
(int)cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT)9 r7 o9 y7 T5 m8 z' L+ V8 Q
);
9 ^2 Z) b9 G5 d# x- I/ YCvVideoWriter *writer = cvCreateVideoWriter("c:/test.avi", CV_FOURCC('X','V','I','D'), fps, size);
% k" L. r# a5 l* G. x( S% E" {. Z. z/ p. U# E, d6 q
IplImage *img = cvCreateImage(size, 8, 3);
. {. Y- R( @+ |2 U2 l8 z$ Dwhile((tempImg=cvQueryFrame(cap)) != NULL)
- d' e- x: ?% T9 t{% A1 o6 g+ K+ ?" z g8 `
cvCopy(tempImg, img);* k0 \+ @3 o% S1 F8 V- R. L
if (img->origin == IPL_ORIGIN_TL)3 j X+ z! [) R t3 Y% T
{
8 v) _' n# A* X4 I6 p, Z9 d2 y cvFlip(img, img);
; o2 W1 v @* q4 q& h6 J1 r* z& W }
$ S, B- c# N( D; }0 ^ cvWriteFrame(writer, img);" [% C9 z' I4 x2 c0 h7 f
}' p3 c( C+ }' R* [
" p( h7 T* U1 i# S6 @9 i- ?2 A+ _cvReleaseImage(&img);# Q+ ]0 Y$ I, P% d/ r( z l: ]1 A
cvReleaseCapture(&cap);9 T8 N$ V6 Z$ @
cvReleaseVideoWriter(&writer);/ w' i2 I. l2 G* l' S
; ~( x+ G9 J6 T; ]/ E6 H* F! h
system("pause");
8 \% @6 |! s1 y7 y# r* W! P |" Dreturn 0;
# u0 r- q3 s& c0 c1 u3 }+ F0 o! x} |
|