小白的学习笔记——opencv camshift

-基础:零c++基础,零opencv基础,简单C语言基础,略知数字图像处理知识
-工具:VS2015+opencv 2.4.13
-sample: E:\opencv-2.4.13\opencv\sources\samples\cpp\camshiftdemo


目录

  • 小白的学习笔记opencv camshift
  • 目录
  • camshiftdemo
  • 一些c的概念
    • 类Class
    • 重载
    • bool
    • namespace 和 std
  • opencv中的函数
    • Point
    • Rect
    • VideoCapture
    • keys和CommandLineParser
    • namedwindow
    • setMouseCallback
    • createTrackbar
    • cvColor
    • inRange

camshiftdemo

#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"#include <iostream>
#include <ctype.h>using namespace cv;
using namespace std;Mat image;bool backprojMode = false;
bool selectObject = false;
int trackObject = 0;
bool showHist = true;
Point origin;
Rect selection;
int vmin = 10, vmax = 256, smin = 30;static void onMouse( int event, int x, int y, int, void* )
{if( selectObject ){selection.x = MIN(x, origin.x);selection.y = MIN(y, origin.y);selection.width = std::abs(x - origin.x);selection.height = std::abs(y - origin.y);selection &= Rect(0, 0, image.cols, image.rows);}switch( event ){case CV_EVENT_LBUTTONDOWN:origin = Point(x,y);selection = Rect(x,y,0,0);selectObject = true;break;case CV_EVENT_LBUTTONUP:selectObject = false;if( selection.width > 0 && selection.height > 0 )trackObject = -1;break;}
}static void help()
{cout << "\nThis is a demo that shows mean-shift based tracking\n""You select a color objects such as your face and it tracks it.\n""This reads from video camera (0 by default, or the camera number the user enters\n""Usage: \n""   ./camshiftdemo [camera number]\n";cout << "\n\nHot keys: \n""\tESC - quit the program\n""\tc - stop the tracking\n""\tb - switch to/from backprojection view\n""\th - show/hide object histogram\n""\tp - pause video\n""To initialize tracking, select the object with mouse\n";
}const char* keys =
{"{1|  | 0 | camera number}"
};int main( int argc, const char** argv )
{help();VideoCapture cap;Rect trackWindow;int hsize = 16;float hranges[] = {0,180};const float* phranges = hranges;CommandLineParser parser(argc, argv, keys);int camNum = parser.get<int>("1");cap.open(camNum);if( !cap.isOpened() ){help();cout << "***Could not initialize capturing...***\n";cout << "Current parameter's value: \n";parser.printParams();return -1;}namedWindow( "Histogram", 0 );namedWindow( "CamShift Demo", 0 );setMouseCallback( "CamShift Demo", onMouse, 0 );createTrackbar( "Vmin", "CamShift Demo", &vmin, 256, 0 );createTrackbar( "Vmax", "CamShift Demo", &vmax, 256, 0 );createTrackbar( "Smin", "CamShift Demo", &smin, 256, 0 );Mat frame, hsv, hue, mask, hist, histimg = Mat::zeros(200, 320, CV_8UC3), backproj;bool paused = false;for(;;){if( !paused ){cap >> frame;if( frame.empty() )break;}frame.copyTo(image);if( !paused ){cvtColor(image, hsv, COLOR_BGR2HSV);if( trackObject ){int _vmin = vmin, _vmax = vmax;inRange(hsv, Scalar(0, smin, MIN(_vmin,_vmax)),Scalar(180, 256, MAX(_vmin, _vmax)), mask);int ch[] = {0, 0};hue.create(hsv.size(), hsv.depth());mixChannels(&hsv, 1, &hue, 1, ch, 1);if( trackObject < 0 ){Mat roi(hue, selection), maskroi(mask, selection);calcHist(&roi, 1, 0, maskroi, hist, 1, &hsize, &phranges);normalize(hist, hist, 0, 255, CV_MINMAX);trackWindow = selection;trackObject = 1;histimg = Scalar::all(0);int binW = histimg.cols / hsize;Mat buf(1, hsize, CV_8UC3);for( int i = 0; i < hsize; i++ )buf.at<Vec3b>(i) = Vec3b(saturate_cast<uchar>(i*180./hsize), 255, 255);cvtColor(buf, buf, CV_HSV2BGR);for( int i = 0; i < hsize; i++ ){int val = saturate_cast<int>(hist.at<float>(i)*histimg.rows/255);rectangle( histimg, Point(i*binW,histimg.rows),Point((i+1)*binW,histimg.rows - val),Scalar(buf.at<Vec3b>(i)), -1, 8 );}}calcBackProject(&hue, 1, 0, hist, backproj, &phranges);backproj &= mask;RotatedRect trackBox = CamShift(backproj, trackWindow,TermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ));if( trackWindow.area() <= 1 ){int cols = backproj.cols, rows = backproj.rows, r = (MIN(cols, rows) + 5)/6;trackWindow = Rect(trackWindow.x - r, trackWindow.y - r,trackWindow.x + r, trackWindow.y + r) &Rect(0, 0, cols, rows);}if( backprojMode )cvtColor( backproj, image, COLOR_GRAY2BGR );ellipse( image, trackBox, Scalar(0,0,255), 3, CV_AA );}}else if( trackObject < 0 )paused = false;if( selectObject && selection.width > 0 && selection.height > 0 ){Mat roi(image, selection);bitwise_not(roi, roi);}imshow( "CamShift Demo", image );imshow( "Histogram", histimg );char c = (char)waitKey(10);if( c == 27 )break;switch(c){case 'b':backprojMode = !backprojMode;break;case 'c':trackObject = 0;histimg = Scalar::all(0);break;case 'h':showHist = !showHist;if( !showHist )destroyWindow( "Histogram" );elsenamedWindow( "Histogram", 1 );break;case 'p':paused = !paused;break;default:;}}return 0;
}

一些c++的概念

类Class

待续……

重载

待续……

bool

C语言中没有bool类型,它是C++独有的。
bool表示布尔型变量,也就是逻辑性变量的定义符;
它只有一个字节;
bool取值false和true,0为false,非0为true;

namespace 和 std::

所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。—— [ 360百科 ]

就像我们会用1班的张三和2班的张三来区分同一个学校同一个年级两个叫张三的人一样,命名空间就是用来区分重名的变量和函数。它不仅是起名无能患者的福音,更重要的是解决了不同人写库函数出现同名变量或函数的冲突。
使用C++库函数的标识符,有三种方法:

1、直接指定标识符。例如std::ostream而不是ostream。完整语句如下: std::cout << std::hex << 3.4 << std::endl;
2、使用using关键字。 using std::cout; using std::endl; using std::cin; 以上程序可以写成 cout << std::hex << 3.4 << endl;
3、最方便的就是使用using namespace std; 例如: using namespace std;这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。— [ 360百科 ]

opencv中的函数

Point

Point是core.hpp中的一个函数,用来在图像中定义2D数据点。
用法如下:

Point pt;
pt.x = a;
pt.y = b;

Point pt = Point(a, b);

Rect

创建一个Rect矩阵对象:
Rect rect(a, b, c, d);
(a, b) 是矩形左上顶点的坐标;c 是矩形宽度;d 是矩形高度;
rect.x = a;
rect.y = b;
rect.width = c;
rect.height = d;
更多Rect矩形类用法见博主@CAUC康辉
http://blog.csdn.net/kh1445291129/article/details/51149849

VideoCapture

opencv中用VideoCapture对视频进行操作及调用摄像头。读入视频方法一般由两种:

VideoCapture cap;
cap.open();

VideoCapture();

更多opencv视频基础操作参考博主@洪流之源
http://blog.csdn.net/weicao1990/article/details/53379881

keys和CommandLineParser

const char* keys =
{"{1|  | 0 | camera number}"     //{简称|文件来源|文件值|帮助}
};
CommandLineParser parser(argc, argv, keys);//定义命令行解析类对象parser,并调用其构造函数对其初始化

这一点我的理解就是,为了跑程序时,输参数方便。重复的参数,或者是参数的初始化,直接用keys指针搞定。
更多详细的内容请参考博主@Dream_yz
http://blog.csdn.net/yzhang6_10/article/details/51074305
和博主tornadomeet
http://www.cnblogs.com/tornadomeet/archive/2012/04/15/2450505.html

namedwindow

namedWindow( const char* name, int flags=CV_WINDOW_AUTOSIZE);

name 是显示图片的窗口的名称
CV_WINDOW_AUTOSIZE 是根据图片大小显示的参数:
flags = 1是自动调整窗口大小;
flags = 0是用户可以手动调整窗口大小;

setMouseCallback

这个函数是鼠标对图像进行操作时,计算机对鼠标的响应。

setMouseCallback(const string& winname, MouseCallback onMouse, void* userdata = 0);
/* winname:鼠标进行操作的窗口名
onMouse:鼠标响应函数。根据鼠标不同的动作,进行不同的操作。
userdata:传给回调函数的参数 */  
void on_Mouse(int event, int x, int y, int flags, void* param);
/* event事件代表鼠标各种操作:
#define CV_EVENT_MOUSEMOVE 0             //滑动
#define CV_EVENT_LBUTTONDOWN 1           //左键点击
#define CV_EVENT_RBUTTONDOWN 2           //右键点击
#define CV_EVENT_MBUTTONDOWN 3           //中键点击
#define CV_EVENT_LBUTTONUP 4             //左键放开
#define CV_EVENT_RBUTTONUP 5             //右键放开
#define CV_EVENT_MBUTTONUP 6             //中键放开
#define CV_EVENT_LBUTTONDBLCLK 7         //左键双击
#define CV_EVENT_RBUTTONDBLCLK 8         //右键双击
#define CV_EVENT_MBUTTONDBLCLK 9         //中键双击
x, y是鼠标的位置位于窗口坐标(x,y),即Point(x,y)
flags表示鼠标的拖拽事件
param标志所响应的事件函数,相当于自定义标识码用来匹配鼠标的操作和响应的事件 */

更多详细的内容请参考博主@五仁月饼哭了
http://blog.csdn.net/qq_29540745/article/details/52562101
和博主@-牧野-
http://blog.csdn.net/dcrmg/article/details/52027847

createTrackbar

creatTrackbar可在显示图像的窗口中快速创建一个滑动块用来更改阈值。

CV_EXPORTS int createTrackbar(const string& trackbarname, const string& winname,int* value, int count,TrackbarCallback onChange = 0,void* userdata = 0);

trackbarname:滑动空间的名称
winname:滑动块作用的图像窗口名称
value:初始化阈值
count:滑块位置的最大值,最小值一直是0
TrackbarCallback:是回调函数,没有时设为NULL
参考自@mysee1989
http://blog.csdn.net/mysee1989/article/details/41379817

cvColor

CV_EXPORTS_W void cvtColor( InputArray src, OutputArray dst, int code, int dstCn=0 );
/* 用于将图像从一个颜色空间转换到另一个颜色空间src:输入序列dst:输出序列code:颜色序列dsrCn:输出的通道数(0 = automatic)*/

inRange

inRange()函数的功能是检查输入数组(矩阵)每个元素大小是否在给定2个给定数值之间,它的输出是一幅二值图像。相比于threshold()函数,它可以同时针对多通道进行操作。

用opencv实现目标追踪的学习笔记——camshift相关推荐

  1. 一些关于目标追踪的学习体会

    一些关于目标追踪的学习体会 Author: 疯子_007 关于目标追踪,经过导师和朋友们的推荐与帮助,我阅读了一些很经典的论文:在综述上关于目标追踪我仔细阅读了Alper Yilmaz的"O ...

  2. opencv多目标追踪容器

    opencv多目标追踪容器 之前做过一个多目标追踪的项目,尝试了一下opencv提供的追踪容器,个人感觉效果一般. # coding:utf-8 # @Time : 14/12/2018 17:07 ...

  3. 目标检测SSD学习笔记

    目标检测SSD学习笔记 SSD: Single Shot MultiBox Detector Abstract. 我们提出了一种使用单一深度神经网络来检测图像中的对象的方法.我们的方法,命名为SSD, ...

  4. Task 06 数据增强;模型微调;目标检测基础 学习笔记

    Task 06 数据增强:模型微调:目标检测基础 学习笔记 数据增强 图像增广 在5.6节(深度卷积神经网络)里我们提到过,大规模数据集是成功应用深度神经网络的前提.图像增广(image augmen ...

  5. OpenCV图像处理——目标追踪

    总目录 图像处理总目录←点击这里 二十四.目标追踪 24.1.多目标(手动检测)追踪 24.1.1.原理 目标检测:运行之后按下s,通过鼠标对某个目标进行检测,然后点击空格或者回车 目标追踪:open ...

  6. 深入目标检测原理学习笔记1

    目标检测(object detection)学习笔记 文章目录 目标检测(object detection)学习笔记 一.目标检测任务概述 1.图像识别的任务 2.图像识别的两种模式 3.目标检测的定 ...

  7. python怎么测试opencv安装是否成功_学习笔记:自己编译安装OpenCV+测试opencv安装是否成功...

    跟着猿人学python,我的学习笔记.本次的配置在ubuntu中成功安装了opencv,并通过以下方法测试成功了.现将具体的安装及测试过程整理出来分享给大家. 1. 安装编译依赖的软件包 # 安装读写 ...

  8. opencv 叠加文字_opencv3.1学习笔记(8) 绘制形状与文字

    绘制形状比较简单,基本上没啥子好说的,见代码. 演示代码:#include #include using namespace std; using namespace cv; Mat bgImage; ...

  9. 如何使用opencv进行目标追踪

    日常@尊师: © Fu Xianjun. All Rights Reserved. 使用opencv目标追踪之前先要在CDM中 安装pytesseract 代码是:pip install pytess ...

最新文章

  1. 比较好的处理事情的方法
  2. 2019深圳杯获奖论文_2019年第六届深圳南山杯全国手风琴网络邀请赛获奖名单、成绩公布!...
  3. windows10和ubuntu16.04双系统下时间不对的问题
  4. linux shell中各种分号和括号,linux shell 各种分号,括号使用方法总结
  5. 换工作,让我里外不是人,到底错在哪儿
  6. 图解从上电到执行main函数的处理
  7. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(4) - 比较指令
  8. 如何使用WebSocket
  9. kafka的connect实现数据写入到kafka和从kafka写出
  10. 第十二 关于JavaScript
  11. 浏览器userAgent大全
  12. catia 桥接曲面圆角_CATIA建模教程_二_圆角及桥接在空间曲线中的应用
  13. 电信屏蔽了80端口,利用80端口映射解决web网站应用发布问题
  14. AR - 增强现实技术(AR)的103个应用场景汇总
  15. 2019年7月2日 星期二(韩天峰的建议)
  16. 密码行业标准培训小结
  17. 手持PDA连接无线网络后下载安装程序
  18. 《周志明的软件架构课》学习笔记 Day1
  19. 整数规划Python
  20. 浅析AI智能识别技术在明厨亮灶场景中的应用

热门文章

  1. ushort mysql,C# NModbus4读取寄存器ushort[]
  2. iwebsec靶场 中间件漏洞通关笔记2-Tomcat中间件漏洞
  3. Mybatis-Plus动态表名插件实现数据库分表查询
  4. java中gui_java GUI 快速入门
  5. 【Eclipse】Eclipse常用快捷键
  6. Sketch Essential Training: The Basics Sketch基本训练:基础知识 Lynda课程中文字幕
  7. 汽车软件的SOA理解
  8. newduba首页怎么去掉_【主页劫持】关于浏览器主页被劫持到毒霸网址大全的解决方法...
  9. 一加6 Android11 氢OS 降级到Android P,安装氧OS包超简单流程
  10. 20165231 预习作业3 linux安装及学习