視頻摘要 視頻濃縮(一)
視頻摘要又稱視頻濃縮,是對視頻內容的一個簡單概括,以自動或半自動的方式,先通過運動目標分析,提取運動目標,然后對各個目標的運動軌跡進行分析,將不同的目標拼接到一個共同的背景場景中,並將它們以某種方式進行組合。視頻摘要在視頻分析和基於內容的視頻檢索中扮演着重要角色。
視頻錄像存在存儲數據量大,存儲時間長等特點,通過錄像尋找線索,獲取證據傳統的做法是要耗費大量人力、物力以及時間,效率極其低下,以至於錯過最佳破案時機。因此在視頻監控系統中,對原始視頻進行濃縮,可以快速瀏覽,鎖定檢索對象,對於公安加快破案速度,提高大案、要案的破案效率具有重要指導意義。(1)
對於企業應用來說,視頻摘要與壓縮技術可以使企業管理人員在短時間內瀏覽完視頻。在智能手機大行其道的今天,使用視頻摘要技術對監控視頻進行處理,供手機瀏覽,既可以節約管理者的時間,又可以節約大量的流量。(2)


我這里實驗的背景,首先以768那個avi,然后以營區監控來做(opencv3.0自帶視頻 768x576.avi)



void GoBgModeling(
const
char
* videoFilePath,
const
int frame_num_used, Mat
* bgMat, \
const int size1, const int size2, const int sigma1, const int sigma2 ){
//聲明
int frame_no = 0;
Mat frame;
Mat tmp;
VideoCapture pCapture(videoFilePath); //自己選取一段avi視頻
if( !pCapture.isOpened()){
printf( "Unable to open video file for background modeling!\n");
return;
}
printf( "Background Modeling...\n");
//逐幀讀取視頻
Mat matTmp;
while(frame_no < frame_num_used){
pCapture >>frame;
frame.convertTo(frame,CV_32FC3);
frame_no += 1;
if(frame_no == 1){
//初始化
tmp = Mat : :zeros(frame.rows,frame.cols,CV_32FC3);
matTmp = frame.clone();
}
tmp = tmp + frame /frame_num_used;
*bgMat = tmp;
}
bgMat - >convertTo( *bgMat,CV_8UC3);
matTmp.convertTo(matTmp,CV_8UC3);
absdiff(matTmp, *bgMat,matTmp);
printf( "Background Model has been achieved!\n");
}
const int size1, const int size2, const int sigma1, const int sigma2 ){
//聲明
int frame_no = 0;
Mat frame;
Mat tmp;
VideoCapture pCapture(videoFilePath); //自己選取一段avi視頻
if( !pCapture.isOpened()){
printf( "Unable to open video file for background modeling!\n");
return;
}
printf( "Background Modeling...\n");
//逐幀讀取視頻
Mat matTmp;
while(frame_no < frame_num_used){
pCapture >>frame;
frame.convertTo(frame,CV_32FC3);
frame_no += 1;
if(frame_no == 1){
//初始化
tmp = Mat : :zeros(frame.rows,frame.cols,CV_32FC3);
matTmp = frame.clone();
}
tmp = tmp + frame /frame_num_used;
*bgMat = tmp;
}
bgMat - >convertTo( *bgMat,CV_8UC3);
matTmp.convertTo(matTmp,CV_8UC3);
absdiff(matTmp, *bgMat,matTmp);
printf( "Background Model has been achieved!\n");
}



/**
*背景建模
*/
void bgModeling( const char * videoFilePath, const int frame_num_used, IplImage * * bgImg, \
const int size1, const int size2, const int sigma1, const int sigma2){
//聲明
IplImage * frame = NULL;
CvMat * frameMat = NULL;
CvMat * bgMat = NULL;
CvCapture * pCapture = NULL;
IplImage * framtmp = NULL;
CvMat * mattmp = NULL;
int frame_no = 0;
pCapture = cvCaptureFromFile(videoFilePath); //自己選取一段avi視頻
if( !pCapture){
printf( "Unable to open video file for background modeling!\n");
return;
}
if( *bgImg != NULL){ //非空需先清空*bgImg指向的內存
cvReleaseImage(bgImg);
}
printf( "Background Modeling...\n");
//逐幀讀取視頻
while(frame_no < frame_num_used){
frame = cvQueryFrame(pCapture);
frame_no += 1;
if(frame_no == 1){
//初始化
framtmp = cvCreateImage(cvSize(frame - >width, frame - >height), frame - >depth, frame - >nChannels);
cvCopy(frame,framtmp);
*bgImg = cvCreateImage(cvSize(frame - >width, frame - >height), frame - >depth, frame - >nChannels);
cvCopy(frame, *bgImg);
frameMat = cvCreateMat(frame - >height, frame - >width, CV_32FC3);
bgMat = cvCreateMat(( *bgImg) - >height, ( *bgImg) - >width, CV_32FC3);
cvConvert(frame, frameMat);
cvConvert( *bgImg, bgMat);
continue;
}
//視頻幀IplImage轉CvMat
cvConvert(frame, frameMat);
//高斯濾波先,以平滑圖像
cvSmooth(frame, frame, CV_GAUSSIAN, size1, size2, sigma1, sigma2);
//滑動平均更新背景(求平均)
cvRunningAvg(frameMat, bgMat, ( double) 1 /frame_num_used);
}
cvConvert(bgMat, *bgImg);
printf( "Background Model has been achieved!\n");
//釋放內存
cvReleaseCapture( &pCapture);
cvReleaseMat( &frameMat);
cvReleaseMat( &bgMat);
}
*背景建模
*/
void bgModeling( const char * videoFilePath, const int frame_num_used, IplImage * * bgImg, \
const int size1, const int size2, const int sigma1, const int sigma2){
//聲明
IplImage * frame = NULL;
CvMat * frameMat = NULL;
CvMat * bgMat = NULL;
CvCapture * pCapture = NULL;
IplImage * framtmp = NULL;
CvMat * mattmp = NULL;
int frame_no = 0;
pCapture = cvCaptureFromFile(videoFilePath); //自己選取一段avi視頻
if( !pCapture){
printf( "Unable to open video file for background modeling!\n");
return;
}
if( *bgImg != NULL){ //非空需先清空*bgImg指向的內存
cvReleaseImage(bgImg);
}
printf( "Background Modeling...\n");
//逐幀讀取視頻
while(frame_no < frame_num_used){
frame = cvQueryFrame(pCapture);
frame_no += 1;
if(frame_no == 1){
//初始化
framtmp = cvCreateImage(cvSize(frame - >width, frame - >height), frame - >depth, frame - >nChannels);
cvCopy(frame,framtmp);
*bgImg = cvCreateImage(cvSize(frame - >width, frame - >height), frame - >depth, frame - >nChannels);
cvCopy(frame, *bgImg);
frameMat = cvCreateMat(frame - >height, frame - >width, CV_32FC3);
bgMat = cvCreateMat(( *bgImg) - >height, ( *bgImg) - >width, CV_32FC3);
cvConvert(frame, frameMat);
cvConvert( *bgImg, bgMat);
continue;
}
//視頻幀IplImage轉CvMat
cvConvert(frame, frameMat);
//高斯濾波先,以平滑圖像
cvSmooth(frame, frame, CV_GAUSSIAN, size1, size2, sigma1, sigma2);
//滑動平均更新背景(求平均)
cvRunningAvg(frameMat, bgMat, ( double) 1 /frame_num_used);
}
cvConvert(bgMat, *bgImg);
printf( "Background Model has been achieved!\n");
//釋放內存
cvReleaseCapture( &pCapture);
cvReleaseMat( &frameMat);
cvReleaseMat( &bgMat);
}

{
Mat bgMat;
// GoBgModeling("1.avi",100,&bgMat);
cv : :VideoCapture capture;
capture.open( "1.avi");
if ( !capture.isOpened())
{
std : :cout << "read video failure" <<std : :endl;
return - 1;
}
cv : :BackgroundSubtractorMOG2 mog;
cv : :Mat foreground;
cv : :Mat background;
cv : :Mat frame;
long frameNo = 0;
while (capture.read(frame))
{
++frameNo;
std : :cout <<frameNo <<std : :endl;
// 運動前景檢測,並更新背景
mog(frame, foreground, 0. 001);
// 腐蝕
cv : :erode(foreground, foreground, cv : :Mat());
// 膨脹
cv : :dilate(foreground, foreground, cv : :Mat());
mog.getBackgroundImage(background); // 返回當前背景圖像
cv : :imshow( "video", foreground);
cv : :imshow( "background", background);
if (cv : :waitKey( 25) > 0)
{
break;
}
}
return 0;
}
Mat bgMat;
// GoBgModeling("1.avi",100,&bgMat);
cv : :VideoCapture capture;
capture.open( "1.avi");
if ( !capture.isOpened())
{
std : :cout << "read video failure" <<std : :endl;
return - 1;
}
cv : :BackgroundSubtractorMOG2 mog;
cv : :Mat foreground;
cv : :Mat background;
cv : :Mat frame;
long frameNo = 0;
while (capture.read(frame))
{
++frameNo;
std : :cout <<frameNo <<std : :endl;
// 運動前景檢測,並更新背景
mog(frame, foreground, 0. 001);
// 腐蝕
cv : :erode(foreground, foreground, cv : :Mat());
// 膨脹
cv : :dilate(foreground, foreground, cv : :Mat());
mog.getBackgroundImage(background); // 返回當前背景圖像
cv : :imshow( "video", foreground);
cv : :imshow( "background", background);
if (cv : :waitKey( 25) > 0)
{
break;
}
}
return 0;
}