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

标签: 技术 科研 OpenCV Tracking 多目标跟踪 | 发表时间:2011-10-14 09:34 | 作者:丕子 Fenix
出处:http://www.zhizhihu.com

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.数学仍然是科学界的女皇。

http://pic002.cnblogs.com/images/2011/109710/2011100308362795.jpg

您可能也喜欢:

OpenCV中CamShift的例子记录

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

OpenCV在图上写个字

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

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

相关文章

相关 [记录 opencv demo] 推荐:

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

- Fenix - 丕子
Demo做完了,但是鲁棒性和泛化能力很差,是关于视频中人体检测跟踪以及计数的,对我这个没有接触过视频以及跟踪的人来说,10天搞定还真是困难很大. 主要就是先进行图像差将运动的前景减出来,然后只要在前景当中运行HOG的MultiScale方法检测行人,这样可以提高一部分效率,毕竟前景图都是原始图的子图.

Activiti工作流demo

- - CSDN博客综合推荐文章
继上篇《 Activiti工作流的环境配置》.        前几篇对Activiti工作流进行了介绍,并讲解了其环境配置. 本篇将会用一个demo来展示Activiti工作流具体的体现,直接上干货.        以HelloWorld程序为例.       首先说一下业务流程,员工张三提交了一个申请,然后由部门经理李四审核,审核通过后再由总经理王五审核,通过则张三申请成功.

PyQt+OpenCV 录制保存、播放视频

- - 编程语言 - ITeye博客
准备这一两个月看看以前的书,另外学习下视频方面的东西(CV方面). 之前学过几天QT/PyQt,于是用PyQt结合OpenCV,做了一个小程序. 具有播放并保存摄像头捕获组成的视频,以及播放本地视频文件两个小功能. 界面很简单,没图没真相. 代码就100多行,很容易看懂. 最后感叹下OpenCV和python的强大,噢,还有QT/PyQt.

Y Combinator 举办 Demo Day

- Radar - 丕子
世界上最大的创业公司孵化器 Y Combinator 今天举办他们的 Demo Day,这次一共有 63 家创业公司参加演示,其中有 31 家愿意向媒体和投资人曝光自己,下面是这些创业公司的名字以及一句话描述:. Aisle50: 杂货版 Groupon. Interstate: 项目管理软件,可以跟客户分享开发路线图.

地形模拟演示Demo

- kongshanzhanglao - 博客园-首页原创精华区
地形渲染的首先是创建一个三角网络平面,然后调整平面顶点的y高度值,模拟地面的山丘和山谷,最后再绘制贴图效果. 本文首先介绍如何生成三角网络平面. 然后介绍如何通过高度图调整平面高度. 以及使用BlendMap和3种材质绘制贴图效果的方法. 最后演示如何调整摄像机位置和移动速度,在地面上行走. 一个m*n个顶点的平面由2*(m-1)*(n-1)个三角形组成.

android的Notifications的例子demo

- - 博客园_首页
android的Notifications通知的原理和Demo.   在APP中经常会用到通知. 比如网易新闻客户端,有什么重大新闻的话会在通知栏弹出一条通知.   在做程序过程中我也遇到这个需求. 每隔7天就自动弹出通知,提醒用户. 在网上搜了搜,用了2天时间实现了.   一:通知要调用闹钟功能来实现,第一步设置闹钟.

IKAnalyzer和Ansj切词Demo

- - ITeye博客
        IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包. String content = "Java编程思想(第4版)";.         Ansj中文分词这是一个ictclas的java实现.基本上重写了所有的数据结构和算法.词典是用的开源版的ictclas所提供的.切词Demo代码如下:.

Android Https请求详细demo

- - 移动开发 - ITeye博客
   Android Https详细请求全方案实现,包括HttpUrlConnection及HttpClient方式实现指定证书及信任所有的实现,不多说了,以下代码都经过详细测试,可以直接使用. * HttpUrlConnection 方式,支持指定load-der.crt证书验证,此种方式Android官方建议.

一个 Demo 入门 Flutter

- - limboy's HQ
Flutter 是 Google 研发的一套移动端开发框架,也是 Google 正在研发的下一代操作系统 Fuchsia 的 App 开发框架(Web 和 Desktop 也都在进行积极的尝试),前几天刚发布了 1.0 正式版. 关于 Flutter 的原理和介绍可以参考美团的 这篇文章. 本文希望通过一个 Demo 来更深入地了解 Flutter 的布局、状态管理等细节.

Windows平台上编译OpenCV的Android版本

- Pei - C++博客-首页原创精华区
Android NDK(r5b或更高版本). 在opencv\android\scripts\目录下,新建wincfg.cmd文件. 关于wincfg.cmd文件的配置,可以参考opencv\android\scripts\wincmd.cfg.tmpl文件. 编译完成即可在opencv\android\build目录下得到所有的静态库文件.