这是基于颜色识别的物体追踪

不废话

直接看代码

这是Opencv3的代码

  1. //---------------------------------【头文件、命名空间包含部分】----------------------------
  2. // 描述:包含程序所使用的头文件和命名空间
  3. //-------------------------------------------------------------------------------------------------
  4. #include "opencv2/video/tracking.hpp"
  5. #include "opencv2/imgproc/imgproc.hpp"
  6. #include "opencv2/highgui/highgui.hpp"
  7. #include <iostream>
  8. #include <ctype.h>
  9.  
  10. using namespace cv;
  11. using namespace std;
  12.  
  13. //-----------------------------------【全局变量声明】-----------------------------------------
  14. // 描述:声明全局变量
  15. //-------------------------------------------------------------------------------------------------
  16. Mat image;
  17. bool backprojMode = false;
  18. bool selectObject = false;
  19. int trackObject = ;
  20. bool showHist = true;
  21. Point origin;
  22. Rect selection;
  23. int vmin = , vmax = , smin = ;
  24.  
  25. //--------------------------------【onMouse( )回调函数】------------------------------------
  26. // 描述:鼠标操作回调
  27. //-------------------------------------------------------------------------------------------------
  28. static void onMouse( int event, int x, int y, int, void* )
  29. {
  30. if( selectObject )
  31. {
  32. selection.x = MIN(x, origin.x);
  33. selection.y = MIN(y, origin.y);
  34. selection.width = std::abs(x - origin.x);
  35. selection.height = std::abs(y - origin.y);
  36.  
  37. selection &= Rect(, , image.cols, image.rows);
  38. }
  39.  
  40. switch( event )
  41. {
  42. //此句代码的OpenCV2版为:
  43. //case CV_EVENT_LBUTTONDOWN:
  44. //此句代码的OpenCV3版为:
  45. case EVENT_LBUTTONDOWN:
  46. origin = Point(x,y);
  47. selection = Rect(x,y,,);
  48. selectObject = true;
  49. break;
  50. //此句代码的OpenCV2版为:
  51. //case CV_EVENT_LBUTTONUP:
  52. //此句代码的OpenCV3版为:
  53. case EVENT_LBUTTONUP:
  54. selectObject = false;
  55. if( selection.width > && selection.height > )
  56. trackObject = -;
  57. break;
  58. }
  59. }
  60.  
  61. //--------------------------------【help( )函数】----------------------------------------------
  62. // 描述:输出帮助信息
  63. //-------------------------------------------------------------------------------------------------
  64. static void ShowHelpText()
  65. {
  66. cout << "\n\n\t此Demo显示了基于均值漂移的追踪(tracking)技术\n"
  67. "\t请用鼠标框选一个有颜色的物体,对它进行追踪操作\n";
  68.  
  69. cout << "\n\n\t操作说明: \n"
  70. "\t\t用鼠标框选对象来初始化跟踪\n"
  71. "\t\tESC - 退出程序\n"
  72. "\t\tc - 停止追踪\n"
  73. "\t\tb - 开/关-投影视图\n"
  74. "\t\th - 显示/隐藏-对象直方图\n"
  75. "\t\tp - 暂停视频\n";
  76. }
  77.  
  78. const char* keys =
  79. {
  80. "{1| | 0 | camera number}"
  81. };
  82.  
  83. //-----------------------------------【main( )函数】--------------------------------------------
  84. // 描述:控制台应用程序的入口函数,我们的程序从这里开始
  85. //-------------------------------------------------------------------------------------------------
  86. int main( int argc, const char** argv )
  87. {
  88. ShowHelpText();
  89.  
  90. VideoCapture cap;
  91. Rect trackWindow;
  92. int hsize = ;
  93. float hranges[] = {,};
  94. const float* phranges = hranges;
  95.  
  96. cap.open();
  97.  
  98. if( !cap.isOpened() )
  99. {
  100. cout << "不能初始化摄像头\n";
  101. }
  102.  
  103. namedWindow( "Histogram", );
  104. namedWindow( "CamShift Demo", );
  105. setMouseCallback( "CamShift Demo", onMouse, );
  106. createTrackbar( "Vmin", "CamShift Demo", &vmin, , );
  107. createTrackbar( "Vmax", "CamShift Demo", &vmax, , );
  108. createTrackbar( "Smin", "CamShift Demo", &smin, , );
  109.  
  110. Mat frame, hsv, hue, mask, hist, histimg = Mat::zeros(, , CV_8UC3), backproj;
  111. bool paused = false;
  112.  
  113. for(;;)
  114. {
  115. if( !paused )
  116. {
  117. cap >> frame;
  118. if( frame.empty() )
  119. break;
  120. }
  121.  
  122. frame.copyTo(image);
  123.  
  124. if( !paused )
  125. {
  126. cvtColor(image, hsv, COLOR_BGR2HSV);
  127.  
  128. if( trackObject )
  129. {
  130. int _vmin = vmin, _vmax = vmax;
  131.  
  132. inRange(hsv, Scalar(, smin, MIN(_vmin,_vmax)),
  133. Scalar(, , MAX(_vmin, _vmax)), mask);
  134. int ch[] = {, };
  135. hue.create(hsv.size(), hsv.depth());
  136. mixChannels(&hsv, , &hue, , ch, );
  137.  
  138. if( trackObject < )
  139. {
  140. Mat roi(hue, selection), maskroi(mask, selection);
  141. calcHist(&roi, , , maskroi, hist, , &hsize, &phranges);
  142. //此句代码的OpenCV3版为:
  143. normalize(hist, hist, , , NORM_MINMAX);
  144. //此句代码的OpenCV2版为:
  145. //normalize(hist, hist, 0, 255, CV_MINMAX);
  146.  
  147. trackWindow = selection;
  148. trackObject = ;
  149.  
  150. histimg = Scalar::all();
  151. int binW = histimg.cols / hsize;
  152. Mat buf(, hsize, CV_8UC3);
  153. for( int i = ; i < hsize; i++ )
  154. buf.at<Vec3b>(i) = Vec3b(saturate_cast<uchar>(i*./hsize), , );
  155.  
  156. //此句代码的OpenCV3版为:
  157. cvtColor(buf, buf, COLOR_HSV2BGR);
  158. //此句代码的OpenCV2版为:
  159. //cvtColor(buf, buf, CV_HSV2BGR);
  160.  
  161. for( int i = ; i < hsize; i++ )
  162. {
  163. int val = saturate_cast<int>(hist.at<float>(i)*histimg.rows/);
  164. rectangle( histimg, Point(i*binW,histimg.rows),
  165. Point((i+)*binW,histimg.rows - val),
  166. Scalar(buf.at<Vec3b>(i)), -, );
  167. }
  168. }
  169.  
  170. calcBackProject(&hue, , , hist, backproj, &phranges);
  171. backproj &= mask;
  172. RotatedRect trackBox = CamShift(backproj, trackWindow,
  173.  
  174. //此句代码的OpenCV3版为:
  175. TermCriteria( TermCriteria::EPS | TermCriteria::COUNT, , ));
  176. //此句代码的OpenCV2版为:
  177. //TermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ));
  178.  
  179. if( trackWindow.area() <= )
  180. {
  181. int cols = backproj.cols, rows = backproj.rows, r = (MIN(cols, rows) + )/;
  182. trackWindow = Rect(trackWindow.x - r, trackWindow.y - r,
  183. trackWindow.x + r, trackWindow.y + r) &
  184. Rect(, , cols, rows);
  185. }
  186.  
  187. if( backprojMode )
  188. cvtColor( backproj, image, COLOR_GRAY2BGR );
  189.  
  190. //此句代码的OpenCV3版为:
  191. ellipse( image, trackBox, Scalar(,,), , LINE_AA );
  192. //此句代码的OpenCV2版为:
  193. //ellipse( image, trackBox, Scalar(0,0,255), 3, CV_AA );
  194.  
  195. }
  196. }
  197. else if( trackObject < )
  198. paused = false;
  199.  
  200. if( selectObject && selection.width > && selection.height > )
  201. {
  202. Mat roi(image, selection);
  203. bitwise_not(roi, roi);
  204. }
  205.  
  206. imshow( "CamShift Demo", image );
  207. imshow( "Histogram", histimg );
  208.  
  209. char c = (char)waitKey();
  210. if( c == )
  211. break;
  212. switch(c)
  213. {
  214. case 'b':
  215. backprojMode = !backprojMode;
  216. break;
  217. case 'c':
  218. trackObject = ;
  219. histimg = Scalar::all();
  220. break;
  221. case 'h':
  222. showHist = !showHist;
  223. if( !showHist )
  224. destroyWindow( "Histogram" );
  225. else
  226. namedWindow( "Histogram", );
  227. break;
  228. case 'p':
  229. paused = !paused;
  230. break;
  231. default:
  232. ;
  233. }
  234. }
  235.  
  236. return ;
  237. }

拜拜啦 兄弟们

Opencv颜色识别与追踪的更多相关文章

  1. opencv颜色识别代码分享

    android 平台 opencv 实现颜色识别代码:http://www.eyesourcecode.com/thread-40682-1-1.htmlopencv的颜色识别简单实现的代码:http ...

  2. 基于OpenCV实现对图片及视频中感兴趣区域颜色识别

    基于OpenCV实现图片及视频中选定区域颜色识别 近期,需要实现检测摄像头中指定坐标区域内的主体颜色,通过查阅大量相关的内容,最终实现代码及效果如下,具体的实现步骤在代码中都详细注释,代码还可以进一步 ...

  3. 50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)

    目前计算机视觉(CV)与自然语言处理(NLP)及语音识别并列为人工智能三大热点方向,而计算机视觉中的对象检测(objectdetection)应用非常广泛,比如自动驾驶.视频监控.工业质检.医疗诊断等 ...

  4. opencv 图片识别

    # -*- coding: utf-8 -*-"""Created on Fri Nov 22 21:35:12 2019 @author: Administrator& ...

  5. opencv人脸识别代码

    opencv人脸识别C++代码 /* * Copyright (c) 2011,2012. Philipp Wagner <bytefish[at]gmx[dot]de>. * Relea ...

  6. 颜色传感器TCS230及颜色识别电路(转)

    摘要 TCS230是美国TAOS公司生产的一种可编程彩色光到频率的传感器.该传感器具有分辨率高.可编程的颜色选择与输出定标.单电源供电等特点:输出为数字量,可直接与微处理器连接.文中主要介绍TCS23 ...

  7. OpenCV人脸识别的原理 .

    OpenCV人脸识别的原理 . 在之前讲到的人脸测试后,提取出人脸来,并且保存下来,以供训练或识别是用,提取人脸的代码如下: void GetImageRect(IplImage* orgImage, ...

  8. OpenCV.物体识别

    1.度娘:“OpenCV 物体识别” 1.1.opencv实时识别指定物体 - 诺花雨的博客 - CSDN博客.html(https://blog.csdn.net/qq_27063119/artic ...

  9. opencv人脸识别提取手机相册内人物充当数据集,身份识别学习(草稿)

    未写完 采用C++,opencv+opencv contrib 4.1.0 对手机相册内人物opencv人脸识别,身份识别学习 最近事情多,介绍就先不介绍了 photocut.c #include & ...

随机推荐

  1. Hibernate——离线查询

    1.Criteria查询方式: (1)一般方式: 缺点:每一次查询dao层都需要书写对应的方法,离线查询可以解决这个问题. (2)离线方式: 2.离线查询 用DetachedCriteria来构造查询 ...

  2. canal简单安装使用

    canal简介:https://github.com/alibaba/canal 1.数据库配置 首先使用canal需要修改数据库配置 [mysqld] log-bin=mysql-bin # 开启 ...

  3. Spring事务经典案例-银行转账

    1.entity实体类 2.dao层 3.dao实现类 4.service层 5.serviceimpl层 6.大配置.xml <?xml version="1.0" enc ...

  4. mac 使用tesseract识别图片中的中文

    安装 tesseractbrew install tesseract 加入环境变量export TESSDATA_PREFIX=/usr/local/Cellar/tesseract/4.1.0/sh ...

  5. 数据接口-免费版(股票数据API)

    获取股票数据的源头主要有:数据超市.雅虎.新浪.Google.和讯.搜狐.ChinaStockWebService.东方财富客户端.证券之星.网易财经. 数据超市 2016年5月6日更新.根据最近频繁 ...

  6. git推送本地分支到远程仓库并在远程仓库创建新分支

    $ git push <远程主机名> <本地分支名>:<远程分支名> git push master test:test #master 为设置的远程仓库别名,第一 ...

  7. Oracle 03113

    SYSTEM的只有2M可以用了,还是需要 扩增 SYSTEM和SYSAUX的表空间 SELECT a.tablespace_name,a.bytes/1024/1024 total_M,b.bytes ...

  8. android studio如何连接夜神模拟器

    原创 2018-02-05 21:35:03 会飞的鱼儿android 阅读数 16706 文章标签: 夜神模拟器连接夜神模拟器的简单方式 更多 分类专栏: Android   版权声明:本文为博主原 ...

  9. 支付宝小程序开发——获取位置API没有城市区号的最佳处理方案

    前言: 需要对城市区号进行判断,但是支付宝小程序提供的my.getLocation() API返回的数据中只有6位的城市行政代码,诸如:深圳(440300),并没有区号(0755),那么怎么办呢? 需 ...

  10. idea 出现 bootstrap.properties 中的内容不能识别

    错误截图如下 依赖库引用问题 第一种: <dependency> <groupId>org.springframework.cloud</groupId> < ...