问题描述:在测试目标跟踪算法时,需要选择不同区域作为目标,进行目标跟踪,测试目标跟踪的效果。

解决思路:

1.OpenCV中提供了鼠标交互控制,利用setMouseCallback()给固定的窗口设置鼠标回调函数。

2.在鼠标回调函数中,选择感兴趣区域。

代码实现如下,将感兴趣区域封装在MouseSelect类中,提供选择点和矩形框两种模式。

#pragma once

#ifndef __MOUSESELECT_H__

#define __MOUSESELECT_H__

#include

#include

#define MAX_OBJECTS 10

using namespace cv;

using namespace std;

typedef struct MouseSelectParams

{

vector 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 vPoints;

vector 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<

}

}

}

void MouseSelect::select_point(Mat &frame)

{

obj_selected = ;

while( == obj_selected)

{

obj_selected = get_points(frame);

if (obj_selected == )

{

cout<

}

}

}

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 = &params;

setMouseCallback(win_name,on_mouse,);

waitKey();

destroyWindow(win_name);

int x1,x2,y1,y2,w,h;

Rect rt;

Point pt1,pt2;

cout<

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 = &params;

setMouseCallback(win_name,on_mouse,);

waitKey();

destroyWindow(win_name);

cout<

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<

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<

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<

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区域 &lpar;转&rpar;

问题描述:在测试目标跟踪算法时,需要选择不同区域作为目标,进行目标跟踪,测试目标跟踪的效果. 解决思路: 1.OpenCV中提供了鼠标交互控制,利用setMouseCallback()给固定的窗口设置 ...

opencv——设置ROI区域

#include "stdafx.h" #include #include #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组件进阶&lpar;2 ROI区域图像叠加&amp&semi;图像混合;分离颜色通道、多通道图像混合;图像对比度,亮度值调整)

ROI区域图像叠加&图像混合 #include #include

C&plus;&plus; 中利用 Opencv 得到不规则的ROI 区域&lpar;已知不规则区域&rpar;

因为需要,之前写了一个利用mask 得到不规则ROI 区域的程序. 现在需要修改,发现自己都看不懂是怎么做的了.. 所以把它整理下来. 首先利用 鼠标可以得到 你想要的不规则区域的 顶点信息.具体这里 ...

随机推荐

PS Web切图界面设置

界面为移动工具时(快捷键V),选中左上角的图层. 点击视图,选中显示→智能参考线,与标尺. 点击窗口,把"库" "颜色"去掉,把屏幕右上角的"通道&q ...

转向Web

一直搞桌面软件开发,用C++绘界面那蛋疼的日子是记忆犹新,也不想钻研什么网络协议了,好好搞Web方面吧,它的开放很让人激动 Python是个好东西,适合许多场合,包括云计算,科学计算,软件测试,运维等 ...

Eclipse搭建Struts框架,及一个简单的Struts例子

一.下载struts2.0.1 http://struts.apache.org/downloads.html,下载struts-2.0.1-all.zip,这个压缩包中包含了开发struts2所需的 ...

Hackers&&num;39&semi; Crackdown( UVA UVA 11825状压dp)

题意:N台电脑,现在有N种服务,现在你可以在每台电脑终止一项服务,他和他相邻的电脑都会被关闭,如果一项服务在所有电脑都没运行,该项服务成功被破坏,问最多能破坏几种服务. 分析:把n个集合分成尽量多组, ...

PHP 发邮件不换行

Content-Type:用于定义用户的浏览器或相关设备如何显示将要加载的数据,或者如何处理将要加载的数据 MIME:MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件 ...

Spring - 运行时获取bean(ApplicationContextAware接口)

默认情况下,我们的bean都是单例模式(即从容器初始化到销毁只保持一个实例).当一个bean需要引用另外一个bean,我们往往会通过bean属性的方式通过依赖注入来引用另外一个bean.那么问题就来了 ...

鸟哥Linux学习笔记07

1, vi 是 老式的文字处理器,不过功能已经很齐全了,但是还是有可以进步的地方. vim可以说是程序开发者的一项很好用的工具,vim官网(http://www.vim.org)自己也说vim是一个“ ...

Jmeter接口测试使用beanshell断言json返回

一般情况下响应断言就能解决很多问题,但是返回复杂的json时就需要用到beanshell断言. 举个例子 免费的接口API www.sojson.com/api/beian/sojson.com ho ...

参数在一个线程中各个函数之间互相传递的问题(ThreadLocal)

ThreadLocal最常用的地方就是为每个线程绑定一个数据库连接,HTTP请求,用户身份信息等,这样一个线程的所有调用到的处理函数都可以非常方便地访问这些资源. 一个ThreadLocal变量虽然是 ...

C&num; 常用控件属性及方法介绍

C#常用控件属性及方法介绍                                               目录 1.窗体(Form) 2.Label (标签)控件 3.TextBox ...

opencv 手选roi区域_【OpenCV】选择ROI区域相关推荐

  1. opencv改变imshow窗口大小,窗口位置,ROI

    11年it研发经验,从一个会计转行为算法工程师,学过C#,c++,java,android,php,go,js,python,CNN神经网络,四千多篇博文,三千多篇原创,只为与你分享,共同成长,一起进 ...

  2. opencv 手选roi区域_如何用opencv实现感兴趣区域ROI的选取

    OpenCV中感兴趣区域的选取与检测 感兴趣区域(Region of Interest, ROI)的选取,一般有两种情形:1)已知ROI在图像中的位置:2)ROI在图像中的位置未知. 1)第一种情形 ...

  3. mat opencv 修改roi_OpenCV中如何提取不规则ROI区域

    点击上方"计算机视觉life",选择"星标" 快速获得最新干货 什么是ROI ROI是英文Region Of Interest的三个首字母缩写,很多时候我们对图 ...

  4. OpenCV学习笔记(六)——感兴趣区域ROI(浅拷贝与深拷贝的区别)

    目录 1 浅拷贝 2 深拷贝 示例代码 有时我们只对一张图像中的部分区域感兴趣,而原图像又比较大,如果带着非感兴趣区域一起处理会占用大量的内存,因次我们希望从原图像中截取部分图像后再进行处理.我们将这 ...

  5. vs矩形框边框线显示被选中的区域;_如何使用OpenCV可视化的截取感兴趣区域

    OpenCV是一个著名的计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函数和少量 C++ 类构成,同时提供了Python ...

  6. 【利用OpenCV-Python在图像中选择ROI区域并提取ROI坐标信息】

    [利用OpenCV-Python在图像中选择ROI区域并提取ROI坐标信息] 文前白话 代码: 效果: 文前白话 在图像中选定ROI区域进行进一步的功能开发,就需要提取到相应的ROI区域坐标,对于多边 ...

  7. opencv处理函数记录_转自opencv中文网站

    Cv图像处理 Wikipedia,自由的百科全书 注意:本章描述图像处理和分析的一些函数.大多数函数都是针对两维象素数组的,这里,我们称这些数组为"图像",但是它们不一定非得是Ip ...

  8. OpenCV实战(3)——图像感兴趣区域

    OpenCV实战(3)--图像感兴趣区域 0. 前言 1. 感兴趣区域 1.1 ROI 实例 1.2 定义 ROI 2. 使用图像掩码 3. 完整代码示例 小结 系列链接 0. 前言 在实际应用场景下 ...

  9. OpenCV-Python 选择ROI

    OpenCV-Python选择ROI 1. 矩形ROI,直接使用切片,简单粗暴 2. 使用OpenCV中的一些函数获取ROI区域,这个用的最多 3. 使用鼠标获取ROI区域 4. 鼠标获取多边形ROI ...

最新文章

  1. 周五话分析 | 方法论难落地?来个量身定制版本吧(AARRR模型)
  2. HttpClientFactory的套路,你知多少?
  3. linux查看redis内存,Linux查看redis占用内存的方法
  4. 代码的坏味道:控制结构嵌套太深
  5. linux 穿件文件_关于Linux的25件事
  6. 把网站图片和php程序分离,我的图片服务器和WEB应用服务器相分离的简单方案
  7. python实现的摩斯电码解码\编码器
  8. go interface 转 string_跟我一起学习go语言,map「string」interface「」代码示例
  9. IDEA的第一个java程序
  10. 战之六 使用ADMT 3.2迁移用户和计算机
  11. 串口助手使用16进制发送数据
  12. Win10右下角没有英特尔显卡设置图标怎么办?
  13. 手游脚本_雷电模拟器
  14. 移植tslib,测试电容屏
  15. 【OSPF的特殊区域和特性】ospf的lsdb优化、特殊区域、路由汇总、静默接口、ospf报文认证、LSA路由汇总、高级特性(PRC、智能计时器、FRR、ospf database overflow)
  16. 斐波那契数列——输出斐波那契数列的第n项
  17. pl/sql完全破解
  18. android版本内存卡,都8GB内存了 为何安卓手机还是这么卡?
  19. https访问http接口处理
  20. 中国象棋将帅问题java_编程之美:中国象棋将帅问题

热门文章

  1. 2.6java基础 数组
  2. 量子计算的基本原理论述
  3. 【机器学习】Radius Neighbors Classifier(rNN,radius nearest neighbors)
  4. (SEED-Lab)Buffer Overflow Vulnerability Lab缓冲区溢出实验
  5. 基于eNSP的企业PON入云网络模拟
  6. 现在seo还好做吗(SEO越来越好做了吗)
  7. INFOR WMS UI重构
  8. 杀怪物(dfs)题解
  9. 数据库系统原理期末复习
  10. matlab提示处,MATLAB提示:‘尝试将script XXX.m作为函数执行’解决方法