歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

利用OpenCV捕獲USB攝像頭並寫入視頻文件

對於搞視頻監控的朋友來說,視頻文件的寫入,幾乎是必須的一個步驟。這裡,我給出一個視頻文件寫入的例子。首先是利用opencv進行USB相機的視頻捕獲,然後,將視頻幀寫入到視頻文件當中。在進行視頻文件的寫入之前,有兩點需要提醒:

(1)opencv只是一個圖像處理的工具庫,並不是視頻處理的工具庫!也就是說,它所處理的對象,應該是一張一張的圖片,而opencv本身雖然有一些API函數可以進行USB相機的讀取,但也僅僅是調用了windows 底層的vfw模塊來實現,所以,如果你是windows vista,windows7之類的操作系統,很可能微軟已經拋棄了vfw模塊。而這個時候,再利用opencv的相機視頻捕獲函數,就無法獲取視頻幀了。

(2)視頻文件(.mpeg,.mp4,.rmvb,.avi等格式)的讀寫,需要專門的視頻編解碼器。很顯然,不同格式的視頻文件,采用的視頻編碼技術是不相同的(值得提醒的是,.avi格式的視頻文件,盡管後綴是相同的,但內部采用的視頻編碼算法仍可能不相同,具體可以參考這裡 http://www.linuxidc.com/Linux/2012-11/74148p2.htm ),所以,進行視頻文件讀寫之前,你需要按照相應的視頻編解碼器。而暴風,kmplayer之類的視頻播放器,其內部就已經包含了常用的視頻格式文件的編解碼器。所以,你可以直接利用他們進行視頻文件的播放。

 OK,了解了上面兩點,你就知道,在利用opencv進行視頻文件寫入之前,必須要下載相應的視頻編解碼器。常用的有divx,xvid,ffmpeg等,筆者在這裡采用xvid(這裡有個簡單介紹:http://www.linuxidc.com/Linux/2012-11/74148p3.htm )。

下面給出參考代碼:

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "iostream"
using namespace std;

 

int _tmain(int argc, _TCHAR* argv[])
{
 CvCapture *cap = cvCreateCameraCapture(0);//初始化相機捕獲的指針
 if (!cap)
 {
  cout<<"create camera capture error..."<<endl;
  system("pause");
  exit(-1);
 }

 IplImage *tempImg = cvQueryFrame(cap);
 double fps = 20;
 CvSize size = cvSize(
  (int)cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH),
  (int)cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT)
  );
 CvVideoWriter *writer = cvCreateVideoWriter("c:/test.avi", CV_FOURCC('X','V','I','D'), fps, size);

 IplImage *img = cvCreateImage(size, 8, 3);
 while((tempImg=cvQueryFrame(cap)) != NULL)
 {
  cvCopy(tempImg, img);
  if (img->origin == IPL_ORIGIN_TL)
  {
  cvFlip(img, img);
  }
  cvWriteFrame(writer, img);
 }
 
 cvReleaseImage(&img);
 cvReleaseCapture(&cap);
 cvReleaseVideoWriter(&writer);

 system("pause");
 return 0;
}

Copyright © Linux教程網 All Rights Reserved