【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的掩码运算后 ...
随机推荐
- 做最好的日期控件,My97 DatePicker 4.8 Beta4
4.8更新的内容 [新增]preload预载选项 [新增]时分秒选择菜单的定制功能,详见hmsMenuCfg属性[beta4] [新增]$dp.unbind函数,允许用户手动接触日期控件绑定[beta ...
- Mac OSX Versions输入username按1下都会出现2个字符,并且不能create,解决方法
我的系统,安装的versions1.3.2,下载地址:http://www.jb51.net/softs/193467.html 安装好了以后Versions输入username按1下都会出现2个字符 ...
- PyCharm4注册码--软件安装
软件连接:http://www.jetbrains.com/pycharm/ PyCharm4注册码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...
- 【软件分析与挖掘】A Comparative Study of Supervised Learning Algorithms for Re-opened Bug Prediction
摘要: 本文主要是评估多种监督机器学习算法的有效性,这些算法用于判断一个错误报告是否是reopened的,算法如下: 7种监督学习算法:kNN,SVM, SimpleLogistic,Bayesian ...
- 【cs229-Lecture18】线性二次型调节控制
本节内容: 控制MDP的算法: 状态行动奖励: 非线性动力学系统: 模型: LQR:线性二次型调节控制:(Riccati方程)
- 【解析 . PPT版】干货:阿里全息大数据构建与应用(包括:互联网金融、互联网+、精准营销...)
作者:毛波,阿里巴巴资深数据专家,阿里数据管理平台(DMP)产品负责人. 摘要: 回顾传统数据仓库.商业智能到大型分布式数据平台的进化历程,深入阐述阿里的数据发展历史和数据观,以阿里DMP平台为例深入 ...
- [Python] Interpreter setting in Pycharm
From: http://blog.csdn.net/u013088062/article/details/50135135 From: http://blog.csdn.net/u013088062 ...
- Unity 3D 中实现对物体 位置(position) 旋转(rotation) 大小(scale) 的全面控制
今天分享一些基础控制的脚本 1.位置(Position): 控制位置很简单,首先要知道要在xyz哪几个轴上移动,确定好后定义代表着那些轴的移动变量,速度(m_speed在函数外定义为全局变量)然后通过 ...
- 0x00411202指令引用的0x00000000内存该内存不能为read错误,怎么解决
0X000000该内存不能为read的解决方法 出现这个现象有方面的,一是硬件,即内存方面有问题,二是软件,这就有多方面的问题了. 一.先说说硬件问题,主要方面是: 1.内存条坏了 更换内存条 2.双 ...
- 【第一课】神奇的Context
初学Android的困惑 初学Android跳转页面的时候,往往教程里是这么写的: Intent intent = new Intent(); //MyActivity就是当前的Activity,It ...