记录下用OpenCV做Demo时候用到的小代码

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做Demo时候用到的小代码_第1张图片

您可能也喜欢:

OpenCV中CamShift的例子记录

用OpenCV来检测目标移动的一段代码

OpenCV在图上写个字

OpenCV中读取指定时间间隔的视频

关于OpenCV的Python接口,兴奋之
无觅

相关文章

  • OpenCV中CamShift目标跟踪的例子记录 (8)
  • OpenCV中读取指定时间间隔的视频 (3)
  • 将OpenCV2.3中的HOG抽取出来 (11)
  • OpenCV在图上写个字 (7)
  • OpenCV中HOG人检测以及Part Model latent SVM目标识别 (7)
  • 用OpenCV来检测目标移动的一段代码 (8)
  • 利用OpenCV进行”视频的读取”与”保存视频文件或者图像”源码 (0)
  • 关于OpenCV的Python接口,兴奋之 (1)

你可能感兴趣的:(技术,科研,opencv,Tracking,多目标跟踪)