匹配分为两个阶段:第一阶段,在HSV空间下对S、V通道进行匹配,H通道不变。会有些许色片。(对于HSV空间的理解,此处不足解释,自己查阅资料看)
第二阶段,将HSV空间下做好的匹配图转换到RGB空间下,在对R、G、B三通道分别进行匹配。这样就完成了。
过程中(指导老师提供了算法思想),遇到问题冷静思考解决,一步步去测试(直方图、均值、方差、映射系数、映射矩阵。。。)
自己碰到的麻烦:变量名的误写,最终的映射代码逻辑写反了(这个逻辑读者一定要注意)。
以下只给出HSV空间下的匹配代码(RGB空间用到的匹配思想是一样的,读者自行学习编写):
#include <iostream>
#include <iomanip>
#include "match.h"
using namespace std;
Mat firstMatch(Mat &src, Mat &tar)
{
//创建三通道的hsv图像
Mat srcHSV(src.rows,src.cols,CV_8UC3);
Mat tarHSV(tar.rows,tar.cols,CV_8UC3);
//将rgb图像转换成hsv图像
cvtColor(src,srcHSV,CV_BGR2HSV);
cvtColor(tar,tarHSV,CV_BGR2HSV);
//显示转换后的图像
//namedWindow("srcHSV",0);//定义显示窗口
//imshow("srcHSV",srcHSV );
//namedWindow("tarHSV",0);//定义显示窗口
//imshow("tarHSV",tarHSV );
//通道分离
vector<Mat> imgSrc(srcHSV.channels());
vector<Mat> imgTar(tarHSV.channels());//通过imgSrc、imgTar的[]这种数组形式来访问各通道分量
//提取各通道数据
split(srcHSV,imgSrc);
split(tarHSV, imgTar);//将通道分量保存在
//显示各通道分量
//namedWindow("srcH",0);//定义显示窗口
//imshow("srcH",imgSrc[0] );
//namedWindow("srcS",0);//定义显示窗口
//imshow("srcS",imgSrc[1]);
//namedWindow("srcV",0);//定义显示窗口
//imshow("srcV",imgSrc[2]);
//namedWindow("tarH",0);//定义显示窗口
//imshow("tarH", imgTar[0] );
//namedWindow("tarS",0);//定义显示窗口
//imshow("tarS", imgTar[1]);
//namedWindow("tarV",0);//定义显示窗口
//imshow("tarV", imgTar[2] );
//计算各通道的统计直方图
double srcHisto[2][256] = {0};
double tarHisto[2][256] = {0};
//calmageHist(srcHisto,imgSrc);
//计算source图的S、V通道的直方图
for(int level = 1; level < 3; level++)
{
for(int k = 0; k < 256; k++)
{
doub