记录下用OpenCV做Demo时候用到的小代码
- Fenix - 丕子Demo做完了,但是鲁棒性和泛化能力很差,是关于视频中人体检测跟踪以及计数的,对我这个没有接触过视频以及跟踪的人来说,10天搞定还真是困难很大. 主要就是先进行图像差将运动的前景减出来,然后只要在前景当中运行HOG的MultiScale方法检测行人,这样可以提高一部分效率,毕竟前景图都是原始图的子图.
Demo做完了,但是鲁棒性和泛化能力很差,是关于视频中人体检测跟踪以及计数的,对我这个没有接触过视频以及跟踪的人来说,10天搞定还真是困难很大。主要就是先进行图像差将运动的前景减出来,然后只要在前景当中运行HOG的MultiScale方法检测行人,这样可以提高一部分效率,毕竟前景图都是原始图的子图。
检测到行人,就要跟踪,用到的思想就是在周围进行搜索匹配,当然很多其他方法MeanShift、Filter等等,但是自己愚笨,还没有能够实现出来,相信用这些思想修改一下进行Multi-Object的Tracking应该更加好一点儿,最起码比我现在的方法好多了。
下面是Demo的视频,当然我只是选择了好的部分,其实鲁棒性很差的,当视频中出现一些其他情况或者人比较多的时候,基本就凌乱了,但是通过做这个demo学了视频中的tracking等等很多东西,提升的空间很大。
关于模型的改进,如果以后还有机会做这个,打算从这两个方面着手: 1、关于Human Detection,优化HOG,方法基本上就是积分图以及AdaBoost等得方法,可以参考文献 论文地址:Fast Human Detection Using a Cascade of Histograms of Oriented Gradients 在一个就是训练其他更加鲁棒的行人检测方法和模型。 2、关于Multi-Object Tracking的问题,这个问题让我很头疼,没想出什么优美性感的方法来,不过2011 PAMI上有篇文章: 《Multiple Object Tracking using K-Shortest Paths Optimization》,感觉很性感的样子,不知道真正如何。可以索要代码,不过要签名。 这些东西都很有用也很有意思,最近也找工作,希望能够继续找到计算机视觉、机器学习、数据挖掘的相关工作,喜欢。
下面我记录一下自己用到的可能以后还要用的小函数小方法:
获得随即的颜色方法:
/ get the random color Scalar getRandomColor(int i) { vector c; c.push_back(Scalar(255,97,0)); c.push_back(Scalar(65,105,225)); c.push_back(Scalar(0,255,255)); c.push_back(Scalar(0,255,0)); c.push_back(Scalar(255,0,0)); c.push_back(Scalar(0,0,255)); c.push_back(Scalar(255,0,255)); c.push_back(Scalar(218,112,214)); c.push_back(Scalar(30,144,255)); c.push_back(Scalar(244,124,96)); int ci = i % c.size(); return c[ci]; }
获得图像中某子图区域HSV颜色直方图的方法:
// compute HSV Normalized Histogram MatND getHSVNormalizedHistogram(const Mat& img, Rect r){ // subimage Mat img_rec = Mat(img, r); Mat hsv; cvtColor(img_rec, hsv, CV_BGR2HSV); // let's quantize the hue to 30 levels // and the saturation to 32 levels int hbins = 30, sbins = 32; int histSize[] = {hbins, sbins}; // hue varies from 0 to 179, see cvtColor float hranges[] = { 0, 180 }; // saturation varies from 0 (black-gray-white) to // 255 (pure spectrum color) float sranges[] = { 0, 256 }; const float* ranges[] = { hranges, sranges }; MatND hist; // we compute the histogram from the 0-th and 1-st channels int channels[] = {0, 1}; calcHist( &hsv, 1, channels, Mat(), // do not use mask hist, 2, histSize, ranges, true, // the histogram is uniform false ); double maxVal=0; minMaxLoc(hist, 0, &maxVal, 0, 0); // Normalize if(maxVal == 0) { return hist; } for( int h = 0; h < hbins; h++ ) { for( int s = 0; s < sbins; s++ ) { float binVal = hist.at(h, s); hist.at(h, s) = hist.at(h, s)/(float)maxVal; } } return hist; }
静态图像进行HOG检测的方法,Opencv的例子:
int countInStaticImg(char* filename) { Mat img; int humNum=0; int l = strlen(filename); if(lprintf("Filename is invalid.\n"); } printf("%s:\n", filename); img = imread(filename); if(!img.data) printf("Maybe something error in the image.\n"); HumanCounting hc; HOGDescriptor hog; hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); vector found, found_filtered; double t = (double)getTickCount(); // run the detector with default parameters. to get a higher hit-rate // (and more false alarms, respectively), decrease the hitThreshold and // groupThreshold (set groupThreshold to 0 to turn off the grouping completely). hog.detectMultiScale(img, found, 0, Size(8,8), Size(32,32), 1.05, 1); t = (double)getTickCount() - t; printf("t detection time = %gms\n", t*1000./getTickFrequency()); size_t i, j; humNum=found.size(); for( i = 0; i < found.size(); i++ ) { Rect r = found[i]; for( j = 0; j < found.size(); j++ ) if( j != i && (r & found[j]) == r) break; if( j == found.size() ) found_filtered.push_back(r); } for( i = 0; i < found_filtered.size(); i++ ) { Rect r = found_filtered[i]; // the HOG detector returns slightly larger rectangles than the real objects. // so we slightly shrink the rectangles to get a nicer output. r.x += cvRound(r.width*0.1); r.width = cvRound(r.width*0.8); r.y += cvRound(r.height*0.07); r.height = cvRound(r.height*0.8); rectangle(img, r.tl(), r.br(), hc.getRandomColor(i), 3); char str_i[11]; sprintf(str_i,"%d",(i+1)); putText(img, str_i, cvPoint( r.x+int(0.3*r.width), r.y-5),CV_FONT_HERSHEY_COMPLEX,0.7,hc.getRandomColor(i)); } printf("Number of human in static image: %d\n",humNum); imshow("people detector", img); int c = waitKey(0) & 255; if( c == 'q' || c == 'Q') { return humNum; } return humNum; }
学无止境啊:
一位在MIT教数学的老师总结了十条经验,对理工科学生应该很有教益:
1.你能够做到每天七个小时坐在书桌前。
2.只有在学你觉得学不会的东西时才能学到东西。
3.总的来说,知其所以然比知其然重要得多。
4.在科学和工程方面,没有人能骗太久。
5.并不是天才才能做有创造性的工作。
6.你必须对自己高标准严要求。
7.世界变化很快,你最好选学那些坚实恒久的学科,少赶时髦。
8.你永远赶不上进度,别人也一样。
9.未来的计算机文化是正发生在你的身边,并不是计算机文化课上学的东西。
10.数学仍然是科学界的女皇。
您可能也喜欢: | ||||
OpenCV中CamShift的例子记录 |
用OpenCV来检测目标移动的一段代码 |
OpenCV在图上写个字 |
OpenCV中读取指定时间间隔的视频 |
关于OpenCV的Python接口,兴奋之 |
无觅 |