Back Projection反向投影
2016-03-08 15:23
169 查看
直方图反向投影是通过给定的直方图信息, 在原图像找到相应的像素分布区域, 其可分为基于像素点的直方图反向投影和基于区域的直方图反向投影两种方法. 经实验表明, 由于存在光照、噪声等干扰因素, 并且图像的许多特性在单一的像素级别上无法确定, 但是可从一组像素确定, 因此前者提取特征点的精度不如后者.对于归一化直方图模型来说, 反向投影图像为一幅表示目标是否可能出现的概率图, 先对图像做平滑处理, 然后寻找反向投影图像中峰值点, 并将该点在原图像中对应的位置作为目标的特征点. 对于规则目标来说, 该点即为目标的质心。
openCV提供有方便的函数,用于Back Projection,其关键函数与用法如下:
如何构建以上函数需要的上下文环境:
1,载入一张图像(目标图像)。
2,将载入的图像(RGB格式)转换到HSV格式并且分离出将要用于直方图的出色调(H)通道。(使用openCV的mixChannels函数)
3,创建一个跟踪条,便于调整输入的bins值,该bins值是绘制直方图的重要参数
4,计算图像的方向投影(backprojection )
原图:
![](http://img.blog.csdn.net/20160308152129923)
效果图:
openCV提供有方便的函数,用于Back Projection,其关键函数与用法如下:
1,calcBackProject
void calcBackProject(const Mat* images, int nimages, const int* channels, const SparseMat& hist, OutputArray backProject, const float** ranges, double scale=1, bool uniform=true )
2,calcHist
void calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, SparseMat& hist, int dims, const int* histSize, const float** ranges, bool uniform=true, bool accumulate=false )
如何构建以上函数需要的上下文环境:
1,载入一张图像(目标图像)。
2,将载入的图像(RGB格式)转换到HSV格式并且分离出将要用于直方图的出色调(H)通道。(使用openCV的mixChannels函数)
3,创建一个跟踪条,便于调整输入的bins值,该bins值是绘制直方图的重要参数
4,计算图像的方向投影(backprojection )
//全局变量的声明 Mat src; Mat hsv; Mat hue; int bins = 40; //函数声明 void HistAndBackproj(int, void*); //Do it ! void DoIt(){ //读取原图像 src = imread("hand.jpg", 1); //将图像转换为HSV cvtColor(src, hsv, CV_BGR2HSV); //只使用HSV值 //HSV:HSV(Hue, Saturation, Value)是根据颜色的直观特性由 //A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型 //色调(H),饱和度(S),明度(V) hue.create(hsv.size(), hsv.depth()); int ch[] = { 0, 0 }; mixChannels(&hsv, 1, &hue, 1, ch, 1); //创建跟踪条来输入bins的值 char* windowImage = "原图像"; namedWindow(windowImage, CV_WINDOW_AUTOSIZE); createTrackbar("Hue Bins:", windowImage, &bins, 180, HistAndBackproj); HistAndBackproj(0, 0); imshow(windowImage, src); waitKey(0); } void HistAndBackproj(int, void*){ MatND hist; int histSize = MAX(bins, 2); float hueRange[] = { 0, 180 }; const float*ranges = { hueRange }; //获得直方图并将其标准化 calcHist(&hue, 1, 0, Mat(), hist, 1, &histSize, &ranges, true, false); normalize(hist, hist, 0, 255, NORM_MINMAX, -1, Mat()); //获得 Backprojection MatND backproj; calcBackProject(&hue, 1, 0, hist, backproj, &ranges, 1, truenttp://img.blog.csdn.net/20160308152058688)t main(){ DoIt(); return 0; }
原图:
效果图:
相关文章推荐
- 详解Android开发中Activity的四种launchMode
- Java集合类详解 set、list、map、
- Python正则表达式指南
- ASP.NET文件的上传
- 设置多图片表good_pic(中的商品id)为外键.参考goods商品表中的id,在删除商品的时候.一起删除多图片.
- linux基础教程--安装Android SDK
- jquery笔记(仅供个人参考)
- ASPX中使用EF实现增删改查
- 九度:斐波那契数列
- tomcat JNDI 的配置
- 手机号正则表达式iOS
- 开发过程中遇到的BUG
- Oracle动态查拆分号票,合并号段
- mysql截取字符串substring_index(str,delim,count)
- poj 2965 The Pilots Brothers' refrigerator 飞行员兄弟的冰箱?
- 反素数
- Android分享笔记(3)Android 使用存放在存assets文件夹下的SQLite数据库
- Xcode7 插件制作入门
- Chrome控制台使用详解
- ubuntu下设置开机自启动项