闲得无聊写的一篇用OPENCV来实现对视频的截图



#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
#include<time.h>
  
IplImage *image1 = 0;
 IplImage *image = 0; 
 bool bLButtonDown = false; 
 CvPoint pt, pt1,pt2;
 char* strImageDir = "C:\\123"; //截取图像存放目录
 CvRect selectedROI;
  CvRect reg;
 //鼠标事件
 
 void on_mouse( int event, int x, int y, int flags, void* param )
 {        
     if( !image ) 
        return;      
     if( event == CV_EVENT_LBUTTONDOWN )  
     {                
        bLButtonDown = true;       
        pt1.x = x;              
        pt1.y = y;
selectedROI.x  = x;
selectedROI.y  = y;
     }        
     else if ( event == CV_EVENT_MOUSEMOVE )    
     {                 
        pt2.x = x;               
        pt2.y = y;              
        if(bLButtonDown)        
        {  
 image1 = cvCreateImage( cvGetSize(image), 8, 3 );  
              image1->origin = image->origin;  
              cvCopy( image, image1, 0 ); //复制图像数据  
              image->roi = NULL;      
              image1->roi = NULL;  
              if(pt2.x>image->width)            
                pt2.x = image->width;         
              if(pt2.y>image->height)       
                pt2.y = image->height; 
               CvFont font;                     
               double hScale=1.0;               
               double vScale=1.0;              
               int    lineWidth=1;              
               cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC, hScale,vScale,0,lineWidth);        
               char text[200];              
               reg.x = pt1.x;                
               reg.y = pt1.y;               
               reg.height = abs (pt2.y - pt1.y);      
               reg.width = abs (pt2.x - pt1.x);       
               sprintf(text, "(%dx%d)",reg.width, reg.height);   
               cvPutText (image1,text,cvPoint(10,30), &font, cvScalar(255,255,0));  //图片画文字 
               cvRectangle(image1, pt1, pt2, CV_RGB(255,0,0), 1);       //图片画矩形      
               cvShowImage("Harr Positive Image Creator",image1); 
             }         
         }         
         else if ( event == CV_EVENT_LBUTTONUP )    
         {                 
               bLButtonDown = false;
  //下面确定鼠标选取的感兴趣区域
  if( pt1.x > pt2.x)   
              {                               
                  selectedROI.x  = pt2.x;
               }                         
               if ( pt2.y < pt1.y )      
               {                        
                   selectedROI.y  = pt2.y;      
               }                 
  selectedROI.width  = abs(pt1.x - pt2.x);
  selectedROI.height  = abs(pt1.y - pt2.y);
 
     }
 } 


int main(int argc, char** argv[])
{
int i=0;
     CvCapture* capture = 0;  
     IplImage* frame = 0;  
     int c;      
     char* video;  
     video="C:\\006窗口过程_baofeng.avi";  //加载avi视频
     capture = cvCaptureFromAVI(video);    
     if( !capture )      
     {         
         fprintf(stderr,"Could not initialize capturing...\n");  
         return -1; 
     }          
     cvNamedWindow("Harr Positive Image Creator", CV_WINDOW_AUTOSIZE);  
     cvSetMouseCallback("Harr Positive Image Creator", on_mouse, 0);  


     srand((unsigned)time(NULL));//种子要放在for()外边,才能产生不同的随机数


     for(;;)    
     {        
          frame = cvQueryFrame( capture );        
          if( !frame ) break;  
         
image = cvCreateImage( cvGetSize(frame), 8, 3 );  
         image->origin = frame->origin;  
         cvCopy( frame, image, 0 );       
         cvShowImage("Harr Positive Image Creator", image); 
         char c = cvWaitKey(20);//等待50ms,设置每帧的间隔事件为50ms
if(bLButtonDown)

while(bLButtonDown) //按下鼠标左键
    {
c = cvWaitKey(500);
}
if(selectedROI.width > 0 && selectedROI.height > 0)

//下面保存鼠标拖拽区域图像
float scale= ((float)rand())/RAND_MAX;
             char f[512] ;   
//  sprintf(f, "%s%d%s", "image", i, ".jpg");//保存的图片名  
            sprintf(f,"%s\\密密麻麻.jpg",strImageDir,i/10, i); 
             IplImage* negImage =0;         
             negImage = cvCreateImage(cvSize (selectedROI.width, selectedROI.height), image->depth, image->nChannels);                     
             cvSetImageROI (image, selectedROI);
             cvCopy(image,negImage);               
             cvSaveImage(f, negImage);
cvResetImageROI(image);
             i++;
c = cvWaitKey(100);
}
}
 if( c == 27 ) break;//如果有按键ESC,停止播放,退出。
 

      cvReleaseCapture( &capture );  
      cvDestroyAllWindows();

      return 0; 

}

此源代码是在安装了opencv的前期下才可以实现的,并且需要对其工程属性进行配置,具体的方法可在百度上找,一般全一点的都具有简单的属性配置及安装步骤。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值