【OpenCV】选择ROI区域
问题描述:在测试目标跟踪算法时,需要选择不同区域作为目标,进行目标跟踪,测试目标跟踪的效果。
解决思路:
1.OpenCV中提供了鼠标交互控制,利用setMouseCallback()给固定的窗口设置鼠标回调函数。
2.在鼠标回调函数中,选择感兴趣区域。
代码实现如下,将感兴趣区域封装在MouseSelect类中,提供选择点和矩形框两种模式。
- #pragma once
- #ifndef __MOUSESELECT_H__
- #define __MOUSESELECT_H__
- #include <opencv2/opencv.hpp>
- #include <iostream>
- #define MAX_OBJECTS 10
- using namespace cv;
- using namespace std;
- typedef struct MouseSelectParams
- {
- vector<Point> pts; //Points of selected
- char *win_name;
- Mat *image;
- unsigned int mode; //1 Point,2 Rect
- int n; // selected object number
- }MouseSelectParams;
- void on_mouse(int event,int x,int y,int flags,void *param);
- class MouseSelect
- {
- public:
- MouseSelect();
- ~MouseSelect();
- void select_rect(Mat &frame);
- void select_point(Mat &frame);
- vector<Point> vPoints;
- vector<Rect> vRects;
- unsigned int obj_selected;
- private:
- int get_rects(Mat &frame);
- int get_points(Mat &frame);
- };
- #endif
- #include "MouseSelect.h"
- MouseSelectParams *g_mousep;
- MouseSelect::MouseSelect() {}
- MouseSelect::~MouseSelect() {}
- void MouseSelect::select_rect(Mat &frame)
- {
- obj_selected = ;
- while( == obj_selected)
- {
- obj_selected = get_rects(frame);
- if (obj_selected == )
- {
- cout<<"You haven't selected any rectangles. "<<endl;
- }
- }
- }
- void MouseSelect::select_point(Mat &frame)
- {
- obj_selected = ;
- while( == obj_selected)
- {
- obj_selected = get_points(frame);
- if (obj_selected == )
- {
- cout<<"You haven't selected any points."<<endl;
- }
- }
- }
- int MouseSelect::get_rects(Mat &frame)
- {
- char *win_name = "Init Frame";
- MouseSelectParams params;
- params.win_name = win_name;
- params.image = &frame;
- params.n = ;
- params.mode = ;
- namedWindow(win_name,WINDOW_AUTOSIZE);
- imshow(win_name,frame);
- g_mousep = ¶ms;
- setMouseCallback(win_name,on_mouse,);
- waitKey();
- destroyWindow(win_name);
- int x1,x2,y1,y2,w,h;
- Rect rt;
- Point pt1,pt2;
- cout<<"Point Num: "<<params.pts.size()<<" Object Num: "<<params.n<<" Object Type: Rect."<<endl;
- for(int i = ;i < params.pts.size();i += )
- {
- pt1 = params.pts[i];
- pt2 = params.pts[i + ];
- x1 = min(pt1.x,pt2.x);
- x2 = max(pt1.x,pt2.x);
- y1 = min(pt1.y,pt2.y);
- y2 = max(pt1.y,pt2.y);
- w = x2 - x1;
- h = y2 - y1;
- w = (w % )? w:w+;
- h = (h % )? h:h+;
- rt.x = x1;
- rt.y = y1;
- rt.width = w;
- rt.height = h;
- vRects.push_back(rt);
- }
- return params.n;
- }
- int MouseSelect::get_points(Mat &frame)
- {
- char *win_name = "Init Frame";
- MouseSelectParams params;
- params.win_name = win_name;
- params.image = &frame;
- params.n = ;
- params.mode = ;
- namedWindow(win_name,);
- imshow(win_name,frame);
- g_mousep = ¶ms;
- setMouseCallback(win_name,on_mouse,);
- waitKey();
- destroyWindow(win_name);
- cout<<"Point Num: "<<params.pts.size()<<" Object Num: "<<params.n<<" Object Type: Point."<<endl;
- for (int i = ;i < params.n;i++)
- {
- vPoints.push_back(params.pts[i]);
- }
- return params.n;
- }
- void on_mouse(int event,int x,int y,int flags,void *param)
- {
- int n;
- static bool pressed = false;
- static Point cur_pt;
- static Point prev_pt;
- /* on left button press, remember first corner of rectangle around object */
- if (event == CV_EVENT_LBUTTONDOWN)
- {
- n = g_mousep->n;
- if (n == MAX_OBJECTS)
- {
- return;
- }
- prev_pt.x = x;
- prev_pt.y = y;
- //cout<<prev_pt.x <<","<<prev_pt.y<<" "<<cur_pt.x<<","<<cur_pt.y<<endl;
- pressed = true;
- }
- /* on left button up, finalise the rectangle and draw it in black */
- else if(event == CV_EVENT_LBUTTONUP && pressed)
- {
- /* 1 == mode for selecting points */
- if ( == g_mousep->mode)
- {
- n = g_mousep->n;
- if (n == MAX_OBJECTS)
- {
- return;
- }
- cur_pt.x = x;
- cur_pt.y = y;
- g_mousep->pts.push_back(cur_pt);
- int radius = ;
- circle(*g_mousep->image,cur_pt,radius,CV_RGB(,,));
- imshow(g_mousep->win_name,*g_mousep->image);
- pressed = false;
- g_mousep->n++;
- }
- /* 2 == mode for selecting rectangles */
- else if ( == g_mousep->mode)
- {
- n = g_mousep->n;
- if (n == MAX_OBJECTS)
- {
- return;
- }
- cur_pt.x = x;
- cur_pt.y = y;
- g_mousep->pts.push_back(prev_pt);
- g_mousep->pts.push_back(cur_pt);
- // cout<<prev_pt.x <<","<<prev_pt.y<<" "<<cur_pt.x<<","<<cur_pt.y<<endl;
- rectangle(*g_mousep->image,prev_pt,cur_pt,CV_RGB(,,));
- imshow(g_mousep->win_name,*g_mousep->image);
- pressed = false;
- g_mousep->n++;
- }
- else if ( == g_mousep->mode)
- {
- n = g_mousep->n;
- }
- }
- else if (event == CV_EVENT_MOUSEMOVE && pressed && CV_EVENT_FLAG_LBUTTON)
- {
- if ( == g_mousep->mode)
- {
- n = g_mousep->n;
- if (n == MAX_OBJECTS)
- {
- return;
- }
- cur_pt.x = x;
- cur_pt.y = y;
- Mat tmp = (*g_mousep->image).clone();
- //cout<<prev_pt.x <<","<<prev_pt.y<<" "<<cur_pt.x<<","<<cur_pt.y<<endl;
- rectangle(tmp,prev_pt,cur_pt,CV_RGB(,,));
- imshow(g_mousep->win_name,tmp);
- }
- }
- }
代码分析:
on_mouse()回调函数,对应于一个显示窗口。
在回调函数处理鼠标事件,要理解一个鼠标点击过程,会产生多个事件。
例如:鼠标左击,对应着CV_EVENT_LBUTTONDOWN和CV_EVENT_LBUTTONUP。
在选择矩形框区域时,CV_EVENT_LBUTTONDOWN记录一个对角点;CV_EVENT_MOUSEMOVE记录选对矩形框的中间过程,并显示出来,便于用户调整选择的区域;CV_EVENT_LBUTTONUP记录另一个对角点,CV_EVENT_LBUTTONUP响应后,完成一个矩形框的选择。
在选择点时,只需记录CV_EVENT_LBUTTONUP事件响应的坐标。
【OpenCV】选择ROI区域的更多相关文章
- 【OpenCV】选择ROI区域 (转)
问题描述:在测试目标跟踪算法时,需要选择不同区域作为目标,进行目标跟踪,测试目标跟踪的效果. 解决思路: 1.OpenCV中提供了鼠标交互控制,利用setMouseCallback()给固定的窗口设置 ...
- opencv——设置ROI区域
#include "stdafx.h" #include<opencv2\opencv.hpp> #include<opencv\cv.h> #includ ...
- 【opencv学习笔记六】图像的ROI区域选择与复制
图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...
- 图像的ROI区域选择与复制
[opencv学习笔记六]图像的ROI区域选择与复制 孜然 7 人赞同了该文章 图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感 ...
- Python 图像处理 OpenCV (3):图像属性、图像感兴趣 ROI 区域及通道处理
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 图像属性 图像 ...
- OpenCV计算机视觉学习(1)——图像基本操作(图像视频读取,ROI区域截取,常用cv函数解释)
1,计算机眼中的图像 我们打开经典的 Lena图片,看看计算机是如何看待图片的: 我们点击图中的一个小格子,发现计算机会将其分为R,G,B三种通道.每个通道分别由一堆0~256之间的数字组成,那Ope ...
- 【opencv学习笔记】SetImageROI函数设置ROI区域的作用及用法
虽然先前知道ROI区域是感兴趣区域,但是真正看到调用了OpenCV的cvSetImageROI函数时,并不知道它的作用,所以还是单独写了一段代码对这个函数进行探究. OpenCVchm文档中对cv ...
- opencv 3 core组件进阶(2 ROI区域图像叠加&图像混合;分离颜色通道、多通道图像混合;图像对比度,亮度值调整)
ROI区域图像叠加&图像混合 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp&g ...
- opencv——感兴趣区域(ROI)的分析和选取[详细总结]
引言 在利用OpenCV对图像进行处理时,通常会遇到一个情况,就是只需要对部分感兴趣区域进行处理.因此,如何选取感兴趣区域呢?(其实就是"抠图"). 在学习opencv的掩码运算后 ...
随机推荐
- SAP ECC MM 配置文档
SAP ECC 6.0 Configuration Document Materials Management (MM) Table of Content TOC \o \h \z 1. Genera ...
- saiku、mondrian前奏之——立方体、维度、Schema的基本概念
以前介绍了几个基本工具:saiku 和 Schema Workbench,算是入门级别的了解多维报表,如果要继续深入,需要深入了解如下几个概念: 1.OLAP 联机分析处理,和他对应的是OLTP(联机 ...
- git pull 指定版本
git init git remote add origin git@bitbucket.org:huashiyiqike/lstm-hf.git git pull origin master
- 【Android】Handler、Looper源码分析
一.前言 源码分析使用的版本是 4.4.2_r1. Handler和Looper的入门知识以及讲解可以参考我的另外一篇博客:Android Handler机制 简单而言:Handler和Looper是 ...
- MFC ADO连接Oracle12c数据库 类库文件
Stdafx.h Stdafx.h libado.h libado.h libado.cpp libado.cpp 参考网址如下:http://www.cnblogs.com/livewithnore ...
- codeforces Restore Cube(暴力枚举)
/* 题意:给出立方体的每个顶点的坐标(是由源坐标三个数某几个数被交换之后得到的!), 问是否可以还原出一个立方体的坐标,注意这一句话: The numbers in the i-th output ...
- HTML5探索一(那些新增的标签和属性)
tml5相比html4,添加了部分语义化的标签和属性,现在我们就从这些标签和属性开始,学习html5吧. 首先,认识下HTML5新的文档类型: <!DOCTYPE html> 那些新标签 ...
- Asp.net Mvc4 基于Authorize实现的模块权限验证方式
在MVC中,我们可以通过在action或者controller上设置Authorize[Role="xxx"] 的方式来设置用户对action的访问权限.显然,这样并不能满足我们的 ...
- [Node.js] 使用File API 异步上传文件
原文地址:http://www.moye.me/2014/11/05/html5-filereader/ 最近在做一个网盘的项目,不出意外的涉及到大文件的上传,那么问题来了:如何实时的显示文件上传的进 ...
- cmd 窗口配置mysql数据库
1.运行-cmd 进入command 窗口 首先cd 到mysql目录下的bin的 路运行-cmd 进入command 窗口 首先cd 到mysql目录下的bin的路径.注意cd D盘时直接输入D:就 ...