*1)要可视化反向投影结果,则不能用归一化直方图, 因为结果图像中的值就是hist相应bin的值
*2)匹配结果很好,但是计算时间太长! 不能接受
*3) 注意三个函数处理后的结果图像的大小和位数. back_project的结果图必须是8bit,不能是32; block反向投影的结果图必须是浮点; 模板比配的结果图,8bit 或者浮点都可以;
*4) 注意不同比配方法得到的值解释不同;如CHISQR方法中最小值为最佳匹配; CCOEFF方法,最大值表示最佳匹配
http://blog.sina.com.cn/s/blog_a98e39a201012bki.html
什么是反向投影:
简单的说:用输入图像的某一位置上像素值(多维或灰度)对应在直方图的一个bin上的值来代替该像素值,所以得到的反向投影图是单通的。用统计学术语,输出图像象素点的值是观测数组在某个分布(直方图)下的概率。(参考自:http://blog.163.com/thomaskjh@126/blog/static/370829982010112810358501
应用举例:如果有一个肤色直方图,你可以用它来寻找其他图像中的肤色区域。
工作原理:
以下面的图片为例:
1.首先要获得模型图片的肤色直方图,比如下图:
左边是模型图,右边是H-S二维直方图
接下来要做的事情就是,举个例子:
Image=
Histogram=
(3)反向投影图
Back_Projection=
例如位置(0,0)上的像素值为0,对应的bin为[0,3),所以反向直方图在该位置上的值这个bin的值4。
用到的函数:
calcBackProject。
calcBackProject的输入为图像及其直方图,输出与待跟踪图像大小相同,每一个像素点表示该点为目标区域的概率。这个点越亮,该点属于物体的概率越大。
程序代码及注释:
(该代码是最简单的一维直方图,且模型图片也是本身,下回再研究如何用floodFill定义图片肤色区域的掩码,而不是整个图片的直方图,二维直方图已经在上一篇文章中实现)
// 047 反向投影.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include<iostream>
using namespace std;
using namespace cv;
/// 全局变量
Mat src; Mat hsv; Mat hue;
int bins = 25;
void Hist_and_Backproj(int, void* );
int _tmain(int argc, _TCHAR* argv[])
{
//&hsv: 输入图像的矩阵, 被拷贝的通道的来源
//1: 输入数组中图像的数目
//&hue: 目的图像的矩阵, 储存拷贝的通道
//1: 目的数组中图像的数目
//ch[] = {0,0}: 通道索引对的数组,指示如何将输入图像的某一通道拷贝到目的图像的某一通道。
//在这里,&hsv图像的0通道(即Hue通道)被拷贝到&hue图像(单通道)的0 通道。
//1: 通道索引对的数目
}
//回调函数
void Hist_and_Backproj(int, void* )
{
}
运行结果: