本文主要是介绍opencv图片旋转剪裁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
主要函数:
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; }
这篇关于opencv图片旋转剪裁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!