感兴趣区域的划分,在视频处理中有着重要应用,用OpenCV介绍两种,在视频中标注感兴趣区域的方法:

原视频:


-----------------------------------------------------------------------------------------------------------------------------------

第一种:暂停视频或者在视频流的第一帧中,画出感兴趣区域

#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
using namespace cv;
#include<iostream>
#include<vector>
using namespace std;
/*----定义鼠标事件--画矩形区域:作用当两个车灯----*/
//第一步:全局变量
bool drawing_box = false;
bool gotBox =  false;
Rect box;
Point downPoint;
/*
void mouseRectHandler(int event, int x, int y, int flags, void *param)
{switch (event){case CV_EVENT_MOUSEMOVE:if (drawing_box){box.width = x - box.x;box.height = y - box.y;}break;case CV_EVENT_LBUTTONDOWN:drawing_box = true;box = Rect(x, y, 0, 0);break;case CV_EVENT_LBUTTONUP:drawing_box = false;gotBox = true;if (box.width < 0){box.x += box.width;box.width *= -1;}if( box.height < 0 ){box.y += box.height;box.height *= -1;}break;default:break;}
}
*/void mouseRectHandler(int event, int x, int y, int flags, void *param)
{switch (event){case CV_EVENT_MOUSEMOVE:if (drawing_box){//鼠标的移动到downPoint的右下角if( x >=downPoint.x && y >= downPoint.y){box.x = downPoint.x;box.y = downPoint.y;box.width = x - downPoint.x;box.height =  y -  downPoint.y;}//鼠标的移动到downPoint的右上角if( x >= downPoint.x && y <= downPoint.y){box.x =  downPoint.x;box.y = y;box.width = x - downPoint.x;box.height = downPoint.y - y;}//鼠标的移动到downPoint的左上角if( x <= downPoint.x && y <= downPoint.y){box.x = x;box.y = y;box.width = downPoint.x - x;box.height = downPoint.y - y;}//鼠标的移动到downPoint的左下角if( x <= downPoint.x && y >= downPoint.y){box.x = x;box.y = downPoint.y;box.width = downPoint.x -x;box.height = y - downPoint.y;}}break;case CV_EVENT_LBUTTONDOWN://按下鼠标,代表可以可以开始画矩形drawing_box = true;//记录起点downPoint = Point(x,y);break;case CV_EVENT_LBUTTONUP://松开鼠标,代表结束画矩形drawing_box = false;gotBox = true;break;default:break;}
}int main(int argc,char*argv[])  {  //读取视频  VideoCapture video(argv[1]);  //判断视频是否打开  if( !video.isOpened())  return 0;  //视频中的第一帧  Mat firstFrame;  Mat frame;  //读取视频的第一帧  video>>frame;  //复制到firstFrame中  frame.copyTo(firstFrame);  //register   namedWindow("video",1);  setMouseCallback("video",mouseRectHandler,NULL);  //画感兴趣区域 while(!gotBox)  {  firstFrame.copyTo(frame);  rectangle(frame,box,Scalar(255,0,0),2);//画出感兴趣区域imshow("video",frame);  if(waitKey(50) == 'q')//---------很重要  break;  }  //remove callback  setMouseCallback("video",NULL,NULL);  //视频继续  for(;;)  {  //读取视频 video>>frame;//判断是否有当前帧if(!frame.data)break;//画出感兴趣区域rectangle(frame,box,Scalar(255,255,0),2);imshow("video",frame);  if(waitKey(33) == 'q')  break;  }  return 0;  }  

【结果显示】:

 

第二种情况:不影响视频播放的情况下,画出感兴趣区域


#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
using namespace cv;
#include<iostream>
#include<vector>
using namespace std;
/*----定义鼠标事件--画矩形区域:作用当两个车灯----*/
//第一步:全局变量
bool drawing_box = false;
bool gotBox =  false;
Rect box;
Point downPoint;
/*
void mouseRectHandler(int event, int x, int y, int flags, void *param)
{switch (event){case CV_EVENT_MOUSEMOVE:if (drawing_box){box.width = x - box.x;box.height = y - box.y;}break;case CV_EVENT_LBUTTONDOWN:drawing_box = true;box = Rect(x, y, 0, 0);break;case CV_EVENT_LBUTTONUP:drawing_box = false;gotBox = true;if (box.width < 0){box.x += box.width;box.width *= -1;}if( box.height < 0 ){box.y += box.height;box.height *= -1;}break;default:break;}
}
*/void mouseRectHandler(int event, int x, int y, int flags, void *param)
{switch (event){case CV_EVENT_MOUSEMOVE:if (drawing_box){//鼠标的移动到downPoint的右下角if( x >=downPoint.x && y >= downPoint.y){box.x = downPoint.x;box.y = downPoint.y;box.width = x - downPoint.x;box.height =  y -  downPoint.y;}//鼠标的移动到downPoint的右上角if( x >= downPoint.x && y <= downPoint.y){box.x =  downPoint.x;box.y = y;box.width = x - downPoint.x;box.height = downPoint.y - y;}//鼠标的移动到downPoint的左上角if( x <= downPoint.x && y <= downPoint.y){box.x = x;box.y = y;box.width = downPoint.x - x;box.height = downPoint.y - y;}//鼠标的移动到downPoint的左下角if( x <= downPoint.x && y >= downPoint.y){box.x = x;box.y = downPoint.y;box.width = downPoint.x -x;box.height = y - downPoint.y;}}break;case CV_EVENT_LBUTTONDOWN://按下鼠标,代表可以可以开始画矩形drawing_box = true;//记录起点downPoint = Point(x,y);break;case CV_EVENT_LBUTTONUP://松开鼠标,代表结束画矩形drawing_box = false;gotBox = true;break;default:break;}
}int main(int argc,char*argv[])  {  //读取视频  VideoCapture video(argv[1]);  //判断视频是否打开  if( !video.isOpened())  return 0;  //视频帧  Mat frame;  //register   namedWindow("video",1);  setMouseCallback("video",mouseRectHandler,NULL);  //画感兴趣区域 for(;;)  {  //读取视频的第一帧  video>>frame;if(!frame.data)break;rectangle(frame,box,Scalar(255,255,0),2);//画出感兴趣区域imshow("video",frame); if(gotBox)break;if(waitKey(50) == 'q')//---------很重要  break;  }  //remove callback  setMouseCallback("video",NULL,NULL);  //视频继续  for(;;)  {  //读取视频 video>>frame;//判断是否有当前帧if(!frame.data)break;//画出感兴趣区域rectangle(frame,box,Scalar(0,255,0),2);imshow("video",frame);  if(waitKey(33) == 'q')  break;  }  return 0;  }  

【结果】

  


至于上述两者的区别,试一下就会发现!


opencv-视频处理--画感兴趣区域(ROI)相关推荐

  1. python二值化 感兴趣区域_Python+OpenCV感兴趣区域ROI提取方法

    方法一:使用轮廓 步骤1 """src为原图""" ROI = np.zeros(src.shape, np.uint8) #感兴趣区域RO ...

  2. C/C++ OpenCV设置感兴趣区域ROI

    设置感兴趣区域(ROI,region of interest),来专注或者简化工作过程,也就是从图像中选择一个图像区域,这个区域是 图像分析所关注的重点.我们圈定的这个区域,以便进行进一步处理 定义R ...

  3. python提取图片感兴趣区域_Python+OpenCV感兴趣区域ROI提取方法

    方法一:使用轮廓 步骤1 """src为原图""" ROI = np.zeros(src.shape, np.uint8) #感兴趣区域RO ...

  4. 【QtOpenCV 图像的感兴趣区域ROI】

    图像的ROI(region of interest)是指图像中感兴趣区域.在OpenCV中图像设置图像ROI区域,实现只对ROI区域操作. 文章目录 前言 一.GUI 二.实现代码 1.Rubber ...

  5. ITK:在一幅图像中提取感兴趣区域ROI

    ITK:在一幅图像中提取感兴趣区域ROI 内容提要 输出结果 C++实现代码 内容提要 在给定图像中提取给定的关注区域(ROI) 输出结果 C++实现代码 #include "itkImag ...

  6. Python-OpenCV选择、提取感兴趣区域(ROI区域)

    Python-OpenCV选择.提取感兴趣区域(ROI区域) 在图像处理中,我们常常要对某个区域进行选择.提取,然后对这个区域进行单独分析.处理.显示. 这样的区域我们称为叫ROI区域,英文全称为Re ...

  7. C# opencvSharp实现鼠标移动选择感兴趣区域(ROI)

    C# opencvSharp实现鼠标移动选择感兴趣区域(ROI)主要通过鼠标响应事件来实现. 1.鼠标按下响应 MouseDown() 获取鼠标按下的开始坐标. private void pictur ...

  8. openCV任意几何形状感兴趣区域(ROI)提取

    图像感兴趣区域(ROI)提取主要使用掩模来进行.掩模是二值图像,感兴趣区域的掩模值设置为255,非感兴趣区域的掩模值为0 获取掩模的方法主要有两种 方法一 使用opencv中Mat函数方法,调用Mat ...

  9. opencv感兴趣区域ROI的图像混合操作

    AddWeighted( const CvArr* src1, double alpha,const CvArr* src2, double beta,double gamma, CvArr* dst ...

  10. 使用 OpenCV 和 Tesseract 对图像中的感兴趣区域 (ROI) 进行 OCR

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在这篇文章中,我们将使用 OpenCV 在图像的选定区域上应用 O ...

最新文章

  1. netmiko 自动判断设备类型python_Python模块-Netmiko入门
  2. Android异步下载网络图片(其二:AsyncTask)
  3. vim查看cmd打印的trick
  4. 【机器学习入门】图解超经典的KNN算法
  5. 如何在window下杀死进程?
  6. 四二拍用音符怎么表示_每个音符都是赞美歌拍子分析 0基础识简谱每日必看
  7. 接口测试--apipost在json中如何使用mock变量
  8. MyCat分布式数据库集群架构工作笔记0016---高可用_单表存储千万级_海量存储_垂直分库划分原则
  9. 解决Could not load file or assembly CefSharp.Core.dll的问题
  10. python time sleep 阻塞 异步_python 之 并发编程(进程池与线程池、同步异步阻塞非阻塞、线程queue)...
  11. 网络安全实验室 综合关 解析
  12. 阅读《http权威指南》
  13. 无需U盘最简单的系统重装Win10
  14. mysql c 打开数据库文件怎么打开_vs中打开数据库文件路径
  15. 年度总结—2019-2020
  16. 服务器配置信息怎么查看,查看服务器配置信息
  17. matlab如何处理矩阵中的NaN
  18. java获取网络图片(比如微信授权后的头像)上传至linux服务器
  19. ubuntu18.04安装无线网卡驱动安装心得(解决无法在线下载驱动问题)
  20. bash和zsh的相互切换

热门文章

  1. 【MCS-51系列单片机汇编语言】学习笔记(在更)
  2. LibreOJ - 10066 新的开始
  3. ubuntu死机咋办_Ubuntu16.04死机解决方案
  4. 堆栈stack的基本操作
  5. 形容等待时间长的句子_形容“等待时间长”的成语有哪些?
  6. Google Play Store上线流程
  7. [译] Oracle Database 21c 中的 SQL 集合运算符增强功能(EXCEPT、EXCEPT ALL、MINUS ALL、INTERSECT ALL)
  8. 腾讯2016实习生招聘后台研发面试经
  9. 桌上游戏(桌面游戏)入门指南
  10. 科技热点周刊|ClickHouse 融资 2.5 亿美元、个人信息保护法正式实施、Facebook 改名 Meta