需求人脸检测以后,有了检测框,须要将眼睛扶正
更新时间:2022-09-19 0:06:03
分类:百科资讯 浏览:15
需求
人脸检测后,配合检测框,眼睛需要拉直,裁剪到需要的大小。
人脸检测结果如下:
蓝色框是检测框透视镜原理,里面的红色框是我根据长宽展开的正方形,绿色框是根据眼睛的倾斜角度计算出来的正方形面积,也就是我需要。获取绿框区域。
初步方法:
可以看到,上面的方法包括两次裁剪和一次旋转。这不是一个好计划。搜索了一下,发现还有一个透视变换函数cv::,可以用一个函数代替上面的一系列应用,速度还是比较快的(我在arm上测试过)。
视角变化
下图左侧显示仿射变化,右侧显示透视变化。仿射变化只能通过旋转和两侧的倾斜来进行。透视变化模拟人眼透视原理,可以调节每一侧的距离。仿射更改是使用 2x3 矩阵进行的更改,而透视更改是使用 3x3 矩阵进行的更改。
我的目的是用透视变化来代替“裁剪+旋转+”系列的使用。 (仿射变化应该也能做到,因为我的应用都是2D的透视镜原理,不过还没试过)
简历::
透视变换的函数是cv::.
调用原理是先计算一个3x3的变化矩阵,然后进行变化。
要计算改变矩阵的时间,需要源图像上的坐标和目标图像上的坐标。 [] 在数组中,我填写了上图中绿色框内四个点的坐标,坐标顺序为:“左上、右上、右下、左下”。我已经提前设置好了大小,所以是四个点的坐标。
- //透视变换
- int face_PerspectiveTransform(const cv::Mat &src_img, int incline_bbox[8], cv::Mat &out_img)
- {
- cv::Point2f srcTri[4];
- // CvMat* warp_mat = cvCreateMat (3, 3, CV_32FC1);
- //坐标顺序:左上,右上,右下,左下
- for (int i = 0; i < 4; i++)
- {
- srcTri[i].x = incline_bbox[i * 2];
- srcTri[i].y = incline_bbox[i * 2 + 1];
- }
- auto w = out_img.cols;
- auto h = out_img.rows;
- cv::Point2f dstTri[4] = {{0, 0}, {w, 0}, {0, h}, {w, h}};
- cv::Mat M = cv::getPerspectiveTransform(srcTri, dstTri);
- cv::warpPerspective(src_img, out_img, M, out_img.size());
- return 0;
- }
复制代码
结果
参考文献
来自带有 () 的图像
() 上的裁剪框
代码提取:函数实现(c++)
官方示例:#a26
免责声明:如侵犯您的权益,请联系站长,我们会及时删除侵权内容,感谢您的配合!
版权声明:
本站内容部分来源网络,版权归作者所有,如有侵权,请联系我们删除!