1.主要内容
- 反向投影
- 相关步骤和相关API
- 代码演示
- 反向投影是反映直方图模型在目标图像中的分布情况
- 简单的讲,就是用直方图模型去目标图像中寻找是否有相似的对象。通常用HSV色彩空间的HS两个通道直方图模型。
(1)直方图模型建立
(2)待检测对象
(3)反向投影对象
4.实现步骤与相关API反向投影步骤:
1.建立直方图模型
2.计算待测图像直方图并映射到模型中
3.从模型反向计算生成图像
- 加载图片imread
- 将图像从RGB色彩空间转换到HSV色彩空间cvtColor
- 计算直方图和归一化calcHist与normalize(本代码中使用H通道)
- Mat与MatND其中Mat表示二维数组,MatND表示三维或者多维数据,此处均可以用Mat表示。
- 计算反向投影图像 - calcBackProject
而opencv里cvSplit使用的图像是32F则其取值是h为0-360、s取值为0-1、v取值为0-255。如果是8UC则取值范围是h为0-180、s取值为0-255、v取值是0-255. 其中h色调对图像的分辨是很准的。
//1.函数原型
void cv::calcBackProject(
const Mat * images,
int nimages,
const int * channels,
InputArray hist,
OutputArray backProject,
const float ** ranges,
double scale = 1,
bool uniform = true
)
//2.参数解释
//const Mat* images:输入图像,图像深度必须位CV_8U, CV_16U或CV_32F中的一种,尺寸相同,每一幅图像都可以有任意的通道数
//int nimages : 输入图像的数量
//const int* channels : 用于计算反向投影的通道列表,通道数必须与直方图维度相匹配,第一个数组的通道是从0到image[0].channels() - 1, 第二个数组通道从图像image[0].channels()到image[0].channels() + image[1].channels() - 1计数
//InputArray hist : 输入的直方图,直方图的bin可以是密集(dense)或稀疏(sparse)
//OutputArray backProject : 目标反向投影输出图像,是一个单通道图像,与原图像有相同的尺寸和深度
//const float ranges** : 直方图中每个维度bin的取值范围
//double scale = 1 : 可选输出反向投影的比例因子
//bool uniform = true : 直方图是否均匀分布(uniform)的标识符,有默认值true
//另外两种定义
void cv::calcBackProject(
const Mat * images,
int nimages,
const int * channels,
const SparseMat & hist,
OutputArray backProject,
const float ** ranges,
double scale = 1,
bool uniform = true
)
void cv::calcBackProject(
InputArrayOfArrays images,
const std::vector< int > & channels,
InputArray hist,
OutputArray dst,
const std::vector< float > & ranges,
double scale
)
mixChannels()函数
//1.函数功能:从输入图像中拷贝某通道到输出图像中特定的通道。
//2.函数原型及参数解释:
void mixChannels(
const Mat*src, //一系列输入图像的数组, 被拷贝的通道的来源一系列输入图像的数组, 被拷贝的通道的来源
size_t nsrcs, //输入图像的个数
Mat* dst, //一系列目的图像的数组, 储存拷贝的通道,所有的数组必须事先分配空间(如用create),大小和深度须与输入数组等同。
size_t ndsts, //目的数组中图像的数目
const int* fromTo, //通道索引对的数组,指示如何将输入图像的某一通道拷贝到目的图像的某一通道。偶数下标的用来标识输入矩阵,奇数下标的用来标识输出矩阵。如果偶数下标为负数,那么相应的输出矩阵为零矩阵。
size_t npairs //fromTo中的序号对数(两个算1对)。
);
5.演示代码