opencv-视频处理--画感兴趣区域(ROI)
感兴趣区域的划分,在视频处理中有着重要应用,用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)相关推荐
- python二值化 感兴趣区域_Python+OpenCV感兴趣区域ROI提取方法
方法一:使用轮廓 步骤1 """src为原图""" ROI = np.zeros(src.shape, np.uint8) #感兴趣区域RO ...
- C/C++ OpenCV设置感兴趣区域ROI
设置感兴趣区域(ROI,region of interest),来专注或者简化工作过程,也就是从图像中选择一个图像区域,这个区域是 图像分析所关注的重点.我们圈定的这个区域,以便进行进一步处理 定义R ...
- python提取图片感兴趣区域_Python+OpenCV感兴趣区域ROI提取方法
方法一:使用轮廓 步骤1 """src为原图""" ROI = np.zeros(src.shape, np.uint8) #感兴趣区域RO ...
- 【QtOpenCV 图像的感兴趣区域ROI】
图像的ROI(region of interest)是指图像中感兴趣区域.在OpenCV中图像设置图像ROI区域,实现只对ROI区域操作. 文章目录 前言 一.GUI 二.实现代码 1.Rubber ...
- ITK:在一幅图像中提取感兴趣区域ROI
ITK:在一幅图像中提取感兴趣区域ROI 内容提要 输出结果 C++实现代码 内容提要 在给定图像中提取给定的关注区域(ROI) 输出结果 C++实现代码 #include "itkImag ...
- Python-OpenCV选择、提取感兴趣区域(ROI区域)
Python-OpenCV选择.提取感兴趣区域(ROI区域) 在图像处理中,我们常常要对某个区域进行选择.提取,然后对这个区域进行单独分析.处理.显示. 这样的区域我们称为叫ROI区域,英文全称为Re ...
- C# opencvSharp实现鼠标移动选择感兴趣区域(ROI)
C# opencvSharp实现鼠标移动选择感兴趣区域(ROI)主要通过鼠标响应事件来实现. 1.鼠标按下响应 MouseDown() 获取鼠标按下的开始坐标. private void pictur ...
- openCV任意几何形状感兴趣区域(ROI)提取
图像感兴趣区域(ROI)提取主要使用掩模来进行.掩模是二值图像,感兴趣区域的掩模值设置为255,非感兴趣区域的掩模值为0 获取掩模的方法主要有两种 方法一 使用opencv中Mat函数方法,调用Mat ...
- opencv感兴趣区域ROI的图像混合操作
AddWeighted( const CvArr* src1, double alpha,const CvArr* src2, double beta,double gamma, CvArr* dst ...
- 使用 OpenCV 和 Tesseract 对图像中的感兴趣区域 (ROI) 进行 OCR
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在这篇文章中,我们将使用 OpenCV 在图像的选定区域上应用 O ...
最新文章
- netmiko 自动判断设备类型python_Python模块-Netmiko入门
- Android异步下载网络图片(其二:AsyncTask)
- vim查看cmd打印的trick
- 【机器学习入门】图解超经典的KNN算法
- 如何在window下杀死进程?
- 四二拍用音符怎么表示_每个音符都是赞美歌拍子分析 0基础识简谱每日必看
- 接口测试--apipost在json中如何使用mock变量
- MyCat分布式数据库集群架构工作笔记0016---高可用_单表存储千万级_海量存储_垂直分库划分原则
- 解决Could not load file or assembly CefSharp.Core.dll的问题
- python time sleep 阻塞 异步_python 之 并发编程(进程池与线程池、同步异步阻塞非阻塞、线程queue)...
- 网络安全实验室 综合关 解析
- 阅读《http权威指南》
- 无需U盘最简单的系统重装Win10
- mysql c 打开数据库文件怎么打开_vs中打开数据库文件路径
- 年度总结—2019-2020
- 服务器配置信息怎么查看,查看服务器配置信息
- matlab如何处理矩阵中的NaN
- java获取网络图片(比如微信授权后的头像)上传至linux服务器
- ubuntu18.04安装无线网卡驱动安装心得(解决无法在线下载驱动问题)
- bash和zsh的相互切换
热门文章
- 【MCS-51系列单片机汇编语言】学习笔记(在更)
- LibreOJ - 10066 新的开始
- ubuntu死机咋办_Ubuntu16.04死机解决方案
- 堆栈stack的基本操作
- 形容等待时间长的句子_形容“等待时间长”的成语有哪些?
- Google Play Store上线流程
- [译] Oracle Database 21c 中的 SQL 集合运算符增强功能(EXCEPT、EXCEPT ALL、MINUS ALL、INTERSECT ALL)
- 腾讯2016实习生招聘后台研发面试经
- 桌上游戏(桌面游戏)入门指南
- 科技热点周刊|ClickHouse 融资 2.5 亿美元、个人信息保护法正式实施、Facebook 改名 Meta