版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2011-11-26 21:40
|
显示全部楼层
[OpenCV] 利用opencv捕获usb摄像头并写入视频文件: _+ F4 {5 ]/ h& z- @ U4 e9 ]/ y, a
% G! _+ N( f8 B+ A& o# Q ~* t$ e$ q7 |3 V9 g
7 Q7 \% Z+ d/ X
对于搞视频监控的朋友来说,视频文件的写入,几乎是必须的一个步骤。这里,我给出一个视频文件写入的例子。首先是利用opencv进行USB相机的视频捕获,然后,将视频帧写入到视频文件当中。在进行视频文件的写入之前,有两点需要提醒:( p; u+ c# d. a5 ^& b6 R
0 x* {0 r4 q2 m(1)opencv只是一个图像处理的工具库,并不是视频处理的工具库!也就是说,它所处理的对象,应该是一张一张的图片,而opencv本身虽然有一些API函数可以进行USB相机的读取,但也仅仅是调用了windows 底层的vfw模块来实现,所以,如果你是windows vista,windows7之类的操作系统,很可能微软已经抛弃了vfw模块。而这个时候,再利用opencv的相机视频捕获函数,就无法获取视频帧了。# m# C& a+ [; q8 M3 _$ d
% B6 k7 D& g* l2 w(2)视频文件(.mpeg,.mp4,.rmvb,.avi等格式)的读写,需要专门的视频编解码器。很显然,不同格式的视频文件,采用的视频编码技术是不相同的(值得提醒的是,.avi格式的视频文件,尽管后缀是相同的,但内部采用的视频编码算法仍可能不相同,具体可以参考这里http://blog.csdn.net/carson2005/article/details/6314089),所以,进行视频文件读写之前,你需要按照相应的视频编解码器。而暴风,kmplayer之类的视频播放器,其内部就已经包含了常用的视频格式文件的编解码器。所以,你可以直接利用他们进行视频文件的播放。6 r2 j' y+ ]2 q/ Z) K. c$ c5 D* f
. z( w! y! f+ U, n; A6 m/ w/ s
OK,了解了上面两点,你就知道,在利用opencv进行视频文件写入之前,必须要下载相应的视频编解码器。常用的有divx,xvid,ffmpeg等,笔者在这里采用xvid(这里有个简单介绍:http://blog.csdn.net/carson2005/article/details/6553867)。 {0 ~; v. i3 ?! d4 E+ c9 z9 C- H
- F9 {% ]- E+ r9 |& t下面给出参考代码:" ]8 q0 |2 A/ o- W L7 H/ J) ]
3 @; ?- r1 W3 [; n#include "stdafx.h"
L! M3 \4 b0 m/ |# E* B% p#include "cv.h" r6 g- F. q0 C* z# s8 v" e
#include "highgui.h"
# x h7 ]6 y' ~#include "iostream"( e& N1 \# Z( J |+ _( X1 \
using namespace std;( ^) [, {7 r& E$ Y2 E9 ?: r
3 e K1 T" G! [% |. }( B+ C. b6 \7 N2 N% Z# C: D/ A0 R
+ V( w! _0 \4 O$ c/ e
int _tmain(int argc, _TCHAR* argv[])
# u: T/ _/ }, u: K1 I{
7 J1 i/ h. B4 Y1 gCvCapture *cap = cvCreateCameraCapture(0);//初始化相机捕获的指针- {) y7 t; b- m2 @- e
if (!cap)
$ Y" P. g, S: K{# \* e% X# D3 A2 ]9 r0 |
cout<<"create camera capture error..."<<endl;* {# m- D' c, l! x; [
system("pause");( @. p8 l5 y6 }6 w s7 S
exit(-1);! B) G' B/ z1 J, x9 @7 O5 z! q
}
: V3 j% t+ Q& C& t$ K( u& Q
p, Z9 |: V* G) f* EIplImage *tempImg = cvQueryFrame(cap);
1 l5 r; M0 y/ e, H7 t3 Udouble fps = 20;$ L8 c2 |) ?, S2 I% P
CvSize size = cvSize(
8 g; H4 Q5 K% U- _( g3 E: ] (int)cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH),4 c$ B+ f, U; f9 k; L1 r
(int)cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT)8 O' k9 @) ^/ N' m* j- M
);
$ ~) V/ [* n' N6 T: o7 M& YCvVideoWriter *writer = cvCreateVideoWriter("c:/test.avi", CV_FOURCC('X','V','I','D'), fps, size);8 m* K* E) m; N" W, ?8 T
' i$ k, z5 M- | Z* `) ?% {" s$ yIplImage *img = cvCreateImage(size, 8, 3);
% C; k$ K6 h3 B: L' dwhile((tempImg=cvQueryFrame(cap)) != NULL)& ^ |# Z- x1 S* i( ?0 v- _
{
9 I" T% k3 j6 B2 b cvCopy(tempImg, img);: k! q* q# t2 X4 p
if (img->origin == IPL_ORIGIN_TL)& r6 g% B6 H! d5 |7 h F) u4 x
{
5 Z- p+ |. V) T cvFlip(img, img);
; J3 g/ m, E- k! E$ N- o. ~) q }
8 B: b# L" w3 E1 r' t' C8 G cvWriteFrame(writer, img);( A9 Y4 `' X3 C- L7 e5 b
}
) {- E/ C7 l( j+ M
; ]2 R4 C* _9 M# \+ o7 p& j2 ]/ ZcvReleaseImage(&img);
; o! Y2 P/ ~+ h# kcvReleaseCapture(&cap);; G7 }& k& E, F
cvReleaseVideoWriter(&writer);. Y, w4 \0 K) x& O4 p$ X, R
# A8 m- Y" ]" V
system("pause");( e" e9 l7 T" S! j* N( v
return 0;" Y" i n6 k \+ L* i
} |
|