主要函数:
getRotationMatrix2D:获取旋转变换的矩阵2*3
warpAffine:仿射变换
需要注意的地方:
atan2的结果是弧度
而getRotationMatrix2D中的参数angle是角度
另注意:
angle/=CV_PI*180.0
angle=angle/CV_PI*180.0
第一个等式等价于:angle/=(CV_PI*180.0);
Mat cutImage(Mat src,Point2f eyeleft,Point2f eyeright)
{
Mat dst;
dst=Mat::zeros( src.rows, src.cols, src.type());
float offset[2] = { 0.2, 0.2 };
int dest_w = 100;
int dest_h =100;
float angle = atan2(eyeright.y - eyeleft.y, eyeright.x -eyeleft.x);
float Dik = sqrt(pow(eyeleft.x - eyeright.x, 2) + pow(eyeleft.y - eyeright.y, 2));
int offset_h =offset[0] * dest_w;
int offset_v =offset[1] * dest_h;
float reference = dest_w - 2.0 * offset_h;
float scale = Dik / reference;
Mat rot_mat(2,3,CV_32FC1);
angle=angle/CV_PI*180.0;
rot_mat=getRotationMatrix2D(eyeleft,angle,scale);
warpAffine(src,dst,rot_mat,src.size());
Rect rect((int)(eyeleft.x-scale*offset_h),(int)(eyeleft.y - scale * offset_v),(int)(dest_w * scale), (int)(dest_w * scale));
dst=dst(rect);
Mat dst2=Mat(Size(dest_w,dest_h),src.type());
resize(dst,dst2,dst2.size());
//namedWindow("warp_window",CV_WINDOW_AUTOSIZE);
//imshow("warp_window",dst2);
//namedWindow("src_window",CV_WINDOW_AUTOSIZE);
//imshow("src_window",dst);
//waitKey(0);
return dst2;
}