阿牧路泽

哪有那么多坚强,无非是死扛罢了
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

1、【opencv实例】鼠标截图和滑动条播放视频

Posted on 2018-09-17 15:07  阿牧路泽  阅读(347)  评论(0编辑  收藏  举报

一、鼠标截图

 1 //鼠标截图
 2 #include<opencv2/opencv.hpp>
 3 #include<iostream>
 4 
 5 using namespace cv;
 6 using namespace std;
 7 
 8 Mat img=imread("1.jpg");
 9 Mat temp=img.clone();
10 Mat ROI;
11 Point pt;
12 bool flag=false;
13 
14 void onMouse(int event,int x,int y,int flag,void* param){
15     switch (event)
16     {
17     case CV_EVENT_LBUTTONDOWN://鼠标左键按下
18         //cout<<"鼠标左键按下"<<endl;
19         flag=true;
20         pt.x=x;
21         pt.y=y;
22         break;
23     case CV_EVENT_MOUSEMOVE://鼠标移动
24         //cout<<"鼠标移动"<<endl;
25         if(flag){
26             temp.copyTo(img);//temp复制给img(相当于恢复成原图),以便永远只有一个矩形(否则许多矩形会重叠在一起)
27             rectangle(img,pt,Point(x,y),Scalar(0,255,0),2,8);
28         }
29         break;
30     case CV_EVENT_LBUTTONUP://鼠标左键抬起
31         //cout<<"鼠标抬起"<<endl;
32         flag=false;
33         //ROI=img(Rect(pt.x,pt.y,x-pt.x,y-pt.y));//确定ROI区域,有矩形边框
34         ROI=temp(Rect(pt.x,pt.y,x-pt.x,y-pt.y));//无矩形边框
35         imshow("ROI",ROI);
36         imwrite("ROI.jpg",ROI);
37         break;
38     default:
39         break;
40     }
41 }
42 
43 int main(){
44     namedWindow("mouse",CV_WINDOW_AUTOSIZE);
45     setMouseCallback("mouse",onMouse,0);
46     while(1){
47         imshow("mouse",img);
48         if(27==waitKey(10))//esc跳出循环
49             break;
50     }
51     return 0;
52 }

二、滑动条视频播放

 1 #include<opencv2/opencv.hpp>
 2 #include<iostream>
 3 #include<stdio.h>
 4 
 5 using namespace cv;
 6 using namespace std;
 7 
 8 VideoCapture cap;
 9 int value = 0;
10 void onChange(int pos,void*){
11     cap.set(CV_CAP_PROP_POS_FRAMES,pos);//设置视频帧位置
12 }
13 
14 int main(){
15     Mat frame;
16     char strFps[20];
17     cap.open("1.mp4");
18     namedWindow("video",CV_WINDOW_AUTOSIZE);
19     int frameCount=cap.get(CV_CAP_PROP_FRAME_COUNT);//获取视频总帧数
20     createTrackbar("Frame","video",&value,frameCount,onChange);
21 
22     if(cap.isOpened()){//如果视频成功打开
23         while(1){
24             double Fps=cap.get(CV_CAP_PROP_FPS);//获得视频帧率
25             sprintf(strFps,"Fps%0.1f/s",Fps);//格式化字符串
26 
27             int framePos= (int)cap.get(CV_CAP_PROP_POS_FRAMES);//获取视频帧位置
28             cout << "current pos : " << framePos << endl;
29             setTrackbarPos("Frame","video",framePos);//设置滑动条位置
30             cap>>frame;
31             if(!frame.empty()){//如果该帧不为空
32                 putText(frame,strFps,Point(5,30),CV_FONT_HERSHEY_COMPLEX_SMALL,1,Scalar(0,255,0),2,8);
33                 imshow("video",frame);
34                 if(27==waitKey(1000/Fps))//esc退出,1000/Fps毫秒刷新
35                     break;
36             }
37         }
38     }
39     return 0;
40 }