Opencv颜色识别与追踪

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

不废话

直接看代码

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

拜拜啦 兄弟们

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

关于根据颜色刷选图像内容的问题

在CSDN本人博文《OpenCVPython图像处理:用inRange刷选图像中指定颜色对象案例》(请点击文章底部最下方的“阅读原文”跳转CSDN阅读原文)中介绍了根据颜色刷选图像内容相关的概念及实现,介绍了通过使用inRange在HSV颜色空间中识别制定颜色的图像内容,文中概要介绍了HSV颜色空间中进行制定颜色对象识别的要点,使用的inRange函数的语法

.NET的命名空间

关于Namespace(命名空间)的使用在前面的程序中我们看到,我常用<%@ImportNamespace"System.Data"%,这是在引用M$为我们提供的Namespace,这和ASP不同的,我们在ASP.net必须先引用与我们操作有关的Namespace后才能使用相应的功能。其实说白了,一个Namespace;就是一个组件。这个是关

Opencv实时眼球追踪,解脱的你双手,让你的眼睛写代码!

   Opencv实时眼球追踪,让你的眼睛写代码!这个还是有点对于我现在的追踪效果,还有点距离,但是我想完成这个还是没有问题的,用眼睛去控制电脑打字。我认为只要用手可以做,用眼睛都可以做到,包括游戏、画画、写字等等!   废话不多说,目前追踪率82.5%98%(戴眼镜和不戴眼镜),目前这个是第一个版本,只是基本上实现了眼球追踪,后面会加上G

OPENCV3 命名空间等变化

CV\_VERSION表示的opencv的版本号命名空间变化: 可以通过增加include<cv.h解决  1直接去掉CV\_前缀          1)nameWindow函数  CV\_WINDOW\_AUTOSIZE直接变成 WINDOW\_AUTOSIZE         

## 码出高效——小组代码规范

码出高效——小组代码规范编程规约一.命名风格1.代码中的命名不能以下划线、美元符号开头或结尾。反例:<fontcolorDC143Csize3\_name/$name/name&/name\_</font2.【强制】代码中的命名严禁使用拼音与英文混合的方式,更不