首页 百科全书 百科资讯 需求人脸检测以后,有了检测框,须要将眼睛扶正

需求人脸检测以后,有了检测框,须要将眼睛扶正

更新时间:2022-09-19 0:06:03 分类:百科资讯 浏览:13

需求

人脸检测后,配合检测框,眼睛需要拉直,裁剪到需要的大小。

人脸检测结果如下:

蓝色框是检测框透视镜原理,里面的红色框是我根据长宽展开的正方形,绿色框是根据眼睛的倾斜角度计算出来的正方形面积,也就是我需要。获取绿框区域。

初步方法:

可以看到,上面的方法包括两次裁剪和一次旋转。这不是一个好计划。搜索了一下,发现还有一个透视变换函数cv::,可以用一个函数代替上面的一系列应用,速度还是比较快的(我在arm上测试过)。

视角变化

下图左侧显示仿射变化,右侧显示透视变化。仿射变化只能通过旋转和两侧的倾斜来进行。透视变化模拟人眼透视原理,可以调节每一侧的距离。仿射更改是使用 2x3 矩阵进行的更改,而透视更改是使用 3x3 矩阵进行的更改。

我的目的是用透视变化来代替“裁剪+旋转+”系列的使用。 (仿射变化应该也能做到,因为我的应用都是2D的透视镜原理,不过还没试过)

简历::

方框透视原理_单向透视玻璃的原理_透视镜原理

透视变换的函数是cv::.

调用原理是先计算一个3x3的变化矩阵,然后进行变化。

要计算改变矩阵的时间,需要源图像上的坐标和目标图像上的坐标。 [] 在数组中,我填写了上图中绿色框内四个点的坐标,坐标顺序为:“左上、右上、右下、左下”。我已经提前设置好了大小,所以是四个点的坐标。

  1. //透视变换
  2. int face_PerspectiveTransform(const  cv::Mat &src_img, int incline_bbox[8], cv::Mat &out_img)
  3. {
  4.     cv::Point2f srcTri[4];
  5.     // CvMat*       warp_mat = cvCreateMat (3, 3, CV_32FC1);
  6.     //坐标顺序:左上,右上,右下,左下
  7.     for (int i = 0; i < 4; i++)
  8.     {
  9.         srcTri[i].x = incline_bbox[i * 2];
  10.         srcTri[i].y = incline_bbox[i * 2 + 1];
  11.     }
  12.     auto w = out_img.cols;
  13.     auto h = out_img.rows;
  14.     cv::Point2f dstTri[4] = {{0, 0}, {w, 0}, {0, h}, {w, h}};
  15.     cv::Mat M = cv::getPerspectiveTransform(srcTri, dstTri);
  16.     cv::warpPerspective(src_img, out_img, M, out_img.size());
  17.     return 0;
  18. }

复制代码

结果

参考文献

来自带有 () 的图像

() 上的裁剪框

代码提取:函数实现(c++)

官方示例:#a26

免责声明:如侵犯您的权益,请联系站长,我们会及时删除侵权内容,感谢您的配合!

版权声明: 本站内容部分来源网络,版权归作者所有,如有侵权,请联系我们删除!