【待测】OpenCV 在视频中绘制矩形框ROI:使用静态、动态方式

#include "core/core.hpp"  
#include "highgui/highgui.hpp"  
#include "imgproc/imgproc.hpp"  
#include<iostream>  
 
using namespace cv;  
using namespace std;  
 
Mat image;
Mat imageCopy; //绘制矩形框时用来拷贝原图的图像
bool leftButtonDownFlag=false; //左键单击后视频暂停播放的标志位
Point originalPoint; //矩形框起点
Point processPoint; //矩形框终点
 
void onMouse(int event,int x,int y,int flags ,void* ustc); //鼠标回调函数
 
int main(int argc,char*argv[])  
{  
	VideoCapture video(argv[1]);
	double fps=video.get(CV_CAP_PROP_FPS); //获取视频帧率
	double pauseTime=1000/fps; //两幅画面中间间隔
	namedWindow("Friends");
	setMouseCallback("Friends",onMouse);
	while(true)
	{
		if(!leftButtonDownFlag) //判定鼠标左键没有按下,采取播放视频,否则暂停
		{
			video>>image;
		}
		if(!image.data||waitKey(pauseTime)==27)  //图像为空或Esc键按下退出播放
		{
			break;
		}
		//两种情况下不在原始视频图像上刷新矩形
		//1. 起点等于终点
		//2. 左键按下且未抬起
		if(originalPoint!=processPoint&&!leftButtonDownFlag)
		{
			rectangle(image,originalPoint,processPoint,Scalar(255,0,0),2);
		}
		imshow("Friends",image);		
	}
	return 0;
}  
 
//*******************************************************************//  
//鼠标回调函数  
void onMouse(int event,int x,int y,int flags,void *ustc)  
{     
 
	if(event==CV_EVENT_LBUTTONDOWN)  
	{  
		leftButtonDownFlag=true; //标志位
		originalPoint=Point(x,y);  //设置左键按下点的矩形起点
		processPoint=originalPoint;
	}  
	if(event==CV_EVENT_MOUSEMOVE&&leftButtonDownFlag)  
	{  
		imageCopy=image.clone();
		processPoint=Point(x,y);
		if(originalPoint!=processPoint)
		{
			//在复制的图像上绘制矩形
			rectangle(imageCopy,originalPoint,processPoint,Scalar(255,0,0),2);
		}
		imshow("Friends",imageCopy);
	}  
	if(event==CV_EVENT_LBUTTONUP)  
	{  
		leftButtonDownFlag=false;
		Mat rectImage=image(Rect(originalPoint,processPoint)); //子图像显示
		imshow("Sub Image",rectImage);		 
	}	 
} 

 

 

#include "core/core.hpp"  
#include "highgui/highgui.hpp"  
#include "imgproc/imgproc.hpp"  
#include<iostream>  
 
using namespace cv;  
using namespace std;  
 
Mat image;
Mat imageCopy; //绘制矩形框时用来拷贝原图的图像
bool leftButtonDownFlag=false; //左键单击后视频暂停播放的标志位
Point originalPoint; //矩形框起点
Point processPoint; //矩形框终点
 
void onMouse(int event,int x,int y,int flags ,void* ustc); //鼠标回调函数
 
int main(int argc,char*argv[])  
{  
	VideoCapture video(argv[1]);
	double fps=video.get(CV_CAP_PROP_FPS); //获取视频帧率
	double pauseTime=1000/fps; //两幅画面中间间隔
	namedWindow("Friends");
	setMouseCallback("Friends",onMouse);
	while(true)
	{		
		video>>image;		
		if(!image.data||waitKey(pauseTime)==27)  //图像为空或Esc键按下退出播放
		{
			break;
		}
		//两种情况下不在原始视频图像上刷新矩形
		//1. 起点等于终点
		//2. 左键按下且未抬起
		if(originalPoint!=processPoint)
		{
			rectangle(image,originalPoint,processPoint,Scalar(255,0,0),2);
		}
		imshow("Friends",image);		
	}
	return 0;
}  
 
//*******************************************************************//  
//鼠标回调函数  
void onMouse(int event,int x,int y,int flags,void *ustc)  
{     
 
	if(event==CV_EVENT_LBUTTONDOWN)  
	{  
		leftButtonDownFlag=true; //标志位
		originalPoint=Point(x,y);  //设置左键按下点的矩形起点
		processPoint=originalPoint;
	}  
	if(event==CV_EVENT_MOUSEMOVE&&leftButtonDownFlag)  
	{  		
		processPoint=Point(x,y);		
	}  
	if(event==CV_EVENT_LBUTTONUP)  
	{  
		leftButtonDownFlag=false;
		Mat rectImage=image(Rect(originalPoint,processPoint)); //子图像显示
		imshow("Sub Image",rectImage);		 
	}	 
}  

 

猜你喜欢

转载自blog.csdn.net/nyist_yangguang/article/details/121844718
今日推荐