训练
train(ft_data &data,
const vector<Point2f> &ref,
const Size psize,
const Size ssize,
const bool mirror,
const float var,
const float lambda,
const float mu_init,
const int nsamples,
const bool visi)
{
//char filename[20]={0};
//set reference shape,n为ref中特征点的数据量
int n = ref.size();
//参照模型就是刚性空间第一列倍乘后的结果;
reference = Mat(ref).reshape(1,2*n);
Size wsize = psize + ssize;
//train each patch model in turn
patches.resize(n);
for(int i = 0; i < n; i++){
if(visi)cout << "training patch " << i << "..." << endl;
vector<Mat> images(0);
for(int j = 0; j < data.n_images(); j++){
Mat im = data.get_image(j,0);
vector<Point2f> p = data.get_points(j,false);
//pt是第j张图片的样本点;
Mat pt = Mat(p).reshape(1,2*n);
//把刚性空间第一列对齐到第j张图片样本点;
//是利用第一列把后面的列都倍乘;
//返回的是参考样本reference转动到样本pt的旋转角度以及pt的样本中心,
//就是说reference转动加上机上移动位置就是样本了;
Mat S = this->calc_simil(pt),A(2,3,CV_32F);
A.fl(0,0) = S.fl(0,0); A.fl(0,1) = S.fl(0,1);
A.fl(1,0) = S.fl(1,0); A.fl(1,1) = S.fl(1,1);
A.fl(0,2) = pt.fl(2*i ) -
(A.fl(0,0) * (wsize.width-1)/2 + A.fl(0,1)*(wsize.height-1)/2);
A.fl(1,2) = pt.fl(2*i+1) -
(A.fl(1,0) * (wsize.width-1)/2 + A.fl(1,1)*(wsize.height-1)/2);
Mat I; warpAffine(im,I,A,wsize,INTER_LINEAR+WARP_INVERSE_MAP);
images.push_back(I);
if(mirror){
im = data.get_image(j,1);
p = data.get_points(j,true);
pt = Mat(p).reshape(1,2*n);
S = this->calc_simil(pt);
A.fl(0,0) = S.fl(0,0); A.fl(0,1) = S.fl(0,1);
A.fl(1,0) = S.fl(1,0); A.fl(1,1) = S.fl(1,1);
A.fl(0,2) = pt.fl(2*i ) -
(A.fl(0,0) * (wsize.width-1)/2 + A.fl(0,1)*(wsize.height-1)/2);
A.fl(1,2) = pt.fl(2*i+1) -
(A.fl(1,0) * (wsize.width-1)/2 + A.fl(1,1)*(wsize.height-1)/2);
warpAffine(im,I,A,wsize,INTER_LINEAR+WARP_INVERSE_MAP);
images.push_back(I);
}
}
patches[i].train(images,psize,var,lambda,mu_init,nsamples,visi);
}
}
参考http://blog.youkuaiyun.com/limit_ing/article/details/62091088
的warpAffine函数使用方法可知
这里的warpAffine目的是把原图片缩放成和标准图片一样的比例然后以特征点在缩放后的标准窗口中使用以特征点为中心截取wsize大小的窗口图片然后进行下一步的patches[i].train(images,psize,var,lambda,mu_init,nsamples,visi);单个模块训练
目的是把所有的训练样本图片都统一到一个尺度一个方向上去训练
可以说下面的这段训练的中间代码就是上面这么来的
Mat S = this->calc_simil(pt),A(2,3,CV_32F);
A.fl(0,0) = S.fl(0,0); A.fl(0,1) = S.fl(0,1);
A.fl(1,0) = S.fl(1,0); A.fl(1,1) = S.fl(1,1);
A.fl(0,2) = pt.fl(2*i ) -
(A.fl(0,0) * (wsize.width-1)/2 + A.fl(0,1)*(wsize.height-1)/2);
A.fl(1,2) = pt.fl(2*i+1) -
(A.fl(1,0) * (wsize.width-1)/2 + A.fl(1,1)*(wsize.height-1)/2);
本文介绍了块匹配模型的训练过程,通过参考warpAffine函数的应用,将原始图片调整至标准尺寸,并围绕特征点截取固定大小的图像窗口进行训练。此步骤旨在确保所有训练样本在同一尺度和方向上,以便后续的单个模块训练。
365

被折叠的 条评论
为什么被折叠?



