1.一文详解头部位姿估计【收藏好文】
2.使用OpenCV和MediaPipe实现姿态识别!手势手势
3.使用OpenCV和Dlib估计头部姿势
4.OpenCV书籍推荐
5.求手势验证码VAPTCHA破解方法
一文详解头部位姿估计【收藏好文】
在许多应用中,源码我们需要知道头部相对于相机是手势手势如何倾斜的。例如,源码在虚拟现实应用程序中,手势手势可以使用头部的源码zeppelin 源码姿势来渲染场景的正确视图。在驾驶员辅助系统中,手势手势汽车上的源码摄像头可以观察驾驶员的面部,通过头部姿态估计来判断驾驶员是手势手势否在关注道路。当然,源码人们也可以使用基于头部姿势的手势手势手势来控制免提应用程序。
本文中我们约定使用下面术语,源码以免混淆。手势手势位姿:英文是源码pose,包括位置和姿态。手势手势位置:英文是location。:英文是photo,本文中用来指一幅照片。图像:英文是image,本文中用在平面或坐标系中,例如image plane指图像平面,image coordinate system指图像坐标系统。旋转:英文是rotation。平移:英文是translation。变换:英文是transform。投影:英文是project。
什么是位姿估计?在计算机视觉中,物体的姿态是指物体相对于相机的相对方向和位置。你可以通过物体相对于相机移动,或者相机相对于物体移动来改变位姿。—— 这二者对于改变位姿是等价的,因为它们之间的关系是相对的。本文中描述的位姿估计问题通常被称为“Perspective-n-Point” 问题,或计算机视觉中的PnP问题。PnP问题的目标是找到一个物体的位姿,我们需要具备两个条件:条件1:有一个已经校准了的相机;条件2:我们知道物体上的n个3D点的位置locations和这些3D点在图像中相应的2D投影。
如何在数学上描述相机的运动?一个3D刚体(rigid object)仅有2种类型的相对于相机的运动。第一种:平移运动(Translation)。平移运动是指相机从当前的位置location其坐标为(X, Y, Z)移动到新的坐标位置(X‘, Y’,app直播源码抓取Z‘)。平移运动有3个自由度——各沿着X,Y,Z三个轴的方向。平移运动可以用向量t = (X’-X, Y’-Y, Z’-Z)来描述。第二种:旋转运动(Rotation)。是指将相机绕着X,Y,Z轴旋转。旋转运动也有3个自由度。有多种数学上的方法描述旋转运动。使用欧拉角(横摇roll, 纵摇pitch, 偏航yaw)描述,使用3X3的旋转矩阵描述,或者使用旋转方向和角度(directon of rotation and angle)。
进行位姿估计时你需要什么?为了计算一幅图像中一个刚体的3D位姿,你需要下面的信息:信息1:若干个点的2D坐标。你需要一幅图像中若干个点的2D(x, y)位置locations。在人的面部这个例子中,你可以选择:眼角、鼻尖、嘴角等。在本文中,我们选择:鼻尖、下巴、左眼角、右眼角、左嘴角、右嘴角等6个点。信息2:与2D坐标点一一对应的3D位置locations。你需要2D特征点的3D位置locations。信息3:相机的内参。正如前文说提到的,在这个PnP问题中,我们假定相机已经被标定了。换句话说,你需要知道相机的焦距focal length、图像的光学中心、径向畸变参数。
位姿估计算法是如何工作的?有很多的位姿估计算法,最有名的可以追溯到年。该算法的小程社区源码详细讨论超出了本文的讨论范围。这里只给出其简要的核心思想。该位姿估计PnP问题涉及到3个坐标系统。(1)世界坐标系。前面给出的各个面部特征的3D点就是在世界坐标系之中;(2)如果我们知道了旋转矩阵R和平移向量t,我们就能将世界坐标系下的3D点“变换Transform”到相机坐标系中的3D点。(3)使用相机内参矩阵,能将相机坐标系中的3D点能被投影到图像平面image plane, 也就算图像坐标系统image coordinate system。整个问题就是在3个坐标系统中玩耍:3D的世界坐标系World coordiantes、3D的相机坐标系Camera coordinates、2D的图像坐标系Image coordinates。下面,我们来深入研究图像生成方程式,以理解上述三个坐标系是如何工作的。
在上述中,左下角的O是相机的中心,中间的平面Image Plane就是像平面,我们感兴趣的是找出“将3D点P投影到像平面中点p的方程式”。首先,我们假设已经知道了位于世界坐标系中3D点P的位置(U,V,W),如果我们还知道了世界坐标系相对于相机坐标系之间的旋转矩阵R和平移向量t,通过下面方程式,就能计算出点P在相机坐标系下的位置(X,Y,Z)。
下面,我们来深入研究图像生成方程式,以理解上述三个坐标系是如何工作的。在上述中,左下角的O是相机的中心,中间的平面Image Plane就是像平面,我们感兴趣的是找出“将3D点P投影到像平面中点p的方程式”。首先,我们假设已经知道了位于世界坐标系中3D点P的位置(U,V,W),如果我们还知道了世界坐标系相对于相机坐标系之间的旋转矩阵R和平移向量t,通过下面方程式,就能计算出点P在相机坐标系下的位置(X,Y,Z)。
正如将在下面章节讲述的视频解析收费源码,我们知道(X, Y, Z)只在一个未知的尺度上或者说(X, Y, Z)仅由一个未知的尺度所决定,所以我们没有一个简单的线性系统。
直接线性变换(Direct Linear Transform)我们已经知道了3D模型世界坐标系中的很多点也就是(U,V,W),但是,我们不知道(X, Y, Z)。我们只知道这些3D点对应的2D点在图像平面Image Plane中的位置也就是(x, y)。在不考虑畸变参数的情况下,像平面中点p的坐标(x,y)由下面的方程式(3)给出。方程式(3)中的s是什么?它是一个未知的尺度因子scale factor。由于在图像中我们没有点的depth信息,所以这个s必须存在于方程中。引入s是为了表示:图2中射线O-P上的任何一点,无论远近,在像平面Image Plane上的都是同一个点p。也就是说:如果我们将世界坐标系中的任何一点P与相机坐标系的中心点O连接起来,射线O-P与像平面Image Plane的交点就是点P在像平面上的像点p,该射线上的任何一点P,都将在像平面上产生同一个像点p。现在,上面这些讨论已经将方程式(2)搞复杂了。因为这已经不是我们所熟悉的、能解决的一个“好的线性方程”了。我们方程看起来更像下面的形式。不过,幸运的是,上面形式的方程,可以使用一些“代数魔法”来解决——直接线性变换(DLT)。当你发现一个问题的方程式“几乎是线性的,但又由于存在未知的尺度因子,造成该方程不完全线性”,那么你就可以使用DLT方法来求解。
列文伯格-马夸尔特优化算法(Levenberg-Marquardt Optimization)由于下面的一些原因,前面阐述的DLT解决方案并不能非常精确地求解。第一:旋转向量R有3个自由度,但是DLT方案中使用的矩阵描述有9个数,DLT方案中没有任何措施“强迫估计后得到的3X3的矩阵变为一个旋转矩阵”。更重要的是:DLT方案没有“正确的目标函数”。的确,我们希望能最小化“重投影误差reprojection error”,简单java程序源码正如下面将要讲的。
对于方程式(2)和方程式(3),如果我们知道正确的位姿(矩阵R和向量t),通过将3D点投影到2D像平面中,我们能预测到3D面部点的2D点在图像中的位置locations。换而言之,如果我们知道R和t,对于每一个3D点P,我们都能在像平面上找到对于的点p。我们也知道了2D面部特征点通过Dlib或者手工点击给出。我们可以观察被投影的3D点和2D面部特征之间的距离。当位姿估计结果是准确的时候,被投影到像平面Image Plane中的3D点将与2D面部特征点几乎完美地对齐。但是,当位姿估计不准确时,我们可以计算“重投影误差reprojection error”——被投影的3D点和2D面部特征点之间的距离平方和。
位姿(R和t)的近似估计可以使用DLT方案。改进DLT解决方案的一个简单方法是随机“轻微”改变姿态(R和t),并检查重投影误差是否减小。如果的确减小了,我们就采用新的估计结果。我们可以不断地扰动R和t来找到更好的估计。尽管这种方法可以工作,但是很慢。可以证明,有一些基本性的方法可以通过迭代地改变R和t的值,从而降低重投影误差。——其中之一就是所谓的“列文伯格-马夸尔特优化算法”。在OpenCV中,有两种用于位姿估计的API:solvePnP和solvePnPRansac。solvePnP实现了几种姿态估计算法,可以使用参数进行选择不同的算法。默认情况下,它使用标志SOLVEPNP_ITERATIVE,其本质上是DLT解决方案,然后是列文伯格-马夸尔特算法进行优化。SOLVEPNP_P3P只使用3个点来计算姿势,并且应该只在使用solvePnPRansac时使用。在OpenCV3中,引入了SOLVEPNP_DLS和SOLVEPNP_UPNP两种新方法。关于SOLVEPNP_UPNP有趣的事情是,它在估计位姿时,也试图估计相机内部参数。solvePnPRansac中的“Ransac”是“随机抽样一致性算法Random Sample Consensus”的意思。引入Ransac是为了位姿估计的鲁棒性。当你怀疑一些数据点是噪声数据的时候,使用RANSAC是有用的。
样例CMakeLists.txt文件:文件:源代码:OAK中国|追踪AI技术和产品新动态公众号|OAK视觉人工智能开发点「这里」添加微信好友(备注来意)戳「+关注」获取最新资讯↗↗
使用OpenCV和MediaPipe实现姿态识别!
大家好,我是小F~
MediaPipe是一个开源的数据流处理机器学习应用开发框架,由Google开发。
它基于图的数据处理管线,可以处理视频、音频、传感器等多种形式的数据源。
MediaPipe通过将感知模型抽象为模块,并连接到可维护的图中,来解决数据处理问题。
项目地址:github.com/google/media...
今天小F要给大家介绍如何使用MediaPipe实现姿态识别!
这项技术可以结合摄像头,智能识别人的行为,并做出相应处理,例如控制电脑音量、俯卧撑计数、坐姿矫正等。
/ / 依赖安装
使用Python 3.9.7版本,需要安装以下依赖:
使用pip命令进行安装,环境配置好后,可以查看姿态识别情况。
MediaPipe提供全身、脸部、手部三种姿态估计。
/ / 全身姿态估计
人体姿态估计一次只能跟踪一个人,并在身体上显示个坐标点。
具体代码如下。
运行代码后,结果如下。
左侧是原图,右侧是检测结果。
is_image参数表示是否为或视频,media_path参数表示源文件地址。
视频检测效果如下。
效果还不错。
/ / 脸部识别跟踪
MediaPipe可以在脸部周围画网格进行检测和跟踪。
具体代码如下。
效果如下。
/ / 手部跟踪识别
手部跟踪可以同时跟踪2只手,并显示相应的坐标点。
具体代码如下。
结果如下所示。
/ / 总结
以上是MediaPipe姿态识别的部分内容。
我们还可以通过MediaPipe的其他识别功能来做出有趣的事情。
例如,结合摄像头识别手势动作,控制电脑音量等。
相关文件及代码已上传,评论区回复姿态识别即可获取。
万水千山总是情,点个赞行不行。
使用OpenCV和Dlib估计头部姿势
在本文中,我们将探索如何利用OpenCV和Dlib进行头部姿势估计。这项技术在虚拟现实应用中至关重要,以正确渲染场景视图,驾驶员辅助系统中用于监控驾驶员是否专注道路,以及手势控制的免提应用程序/游戏。
头部姿势估计在计算机视觉中涉及确定头部相对于相机的倾斜角度。例如,从左到右偏航头部可能表示“NO”,而在印度南部可能意味着“是”。理解头部姿势对于实现这些技术至关重要。
在数学上,对象的姿态表示其相对于相机的方向和位置。这可以通过平移和旋转来实现,其中平移涉及沿X、Y、Z轴的移动,而旋转涉及围绕这些轴的旋转。平移和旋转共同构成对象的6个自由度。
进行头部姿势估计时,需要以下信息:图像中几个点的2D坐标,以及这些点在3D空间中的位置。Dlib的面部标志检测器提供了许多选择,例如眼角、鼻尖、嘴角等。在本教程中,我们将使用鼻尖、下巴、左眼左角、右眼右角、左嘴角和右嘴角。
为了计算图像中对象的3D姿势,您需要一个任意参考系中几个点的3D位置。在我们的案例中,我们使用了鼻尖(0.0, 0.0, 0.0)、下巴(0.0,-.0,-.0)、左眼左角(-.0,.0,-.0)、右眼右角(.0, .0, -.0)、左嘴角(-.0,-.0,-.0)和右嘴角(.0,-.0,-.0)。这些点位于世界坐标系中。
在进行计算时,您还需要相机的内在参数,如焦距、光心和径向畸变参数。在许多情况下,我们可以通过图像的中心近似光学中心,通过图像的像素宽度近似焦距,并假设不存在径向畸变。这使得我们无需进行繁重的相机校准。
头部姿势估计算法通常基于直接线性变换(DLT)来解决。DLT方法允许我们求解一组点在不同坐标系之间的转换。然而,这种方法的解决方案可能不准确。为了解决这个问题,我们可以使用Levenberg-Marquardt优化,它通过迭代更改旋转和位移参数以最小化重新投影误差来改进DLT解决方案。
在OpenCV中,我们可以使用solvePnP和solvePnPRansac函数来进行头部姿势估计。solvePnP函数提供几种算法,包括基于Levenberg-Marquardt优化的SOLVEPNP_ITERATIVE,用于使用三个点计算姿势的SOLVEPNP_P3P,以及EPnP算法。solvePnPRansac则使用随机样本共识(RANSAC)方法来稳健地估计姿势,以抵抗数据点的噪声。
OpenCV提供了C++和Python版本的示例代码,用于在单个图像中估计头部姿势。这些代码将面部特征点的位置硬编码,如果您想使用自己的图像,则需要自行调整。
OpenCV书籍推荐
《Learning OpenCV 3: Computer Vision in C++ with the OpenCV Library》
本书作为OpenCV入门的经典之作,由OpenCV项目创始人之一Gary Bradski与资深计算机视觉专家Adrian Kaehler合著。内容全面涵盖了从图像处理基础到复杂计算机视觉任务的介绍,包括人脸识别和机器学习应用。书中配有大量示例代码和解析,助读者深入理解OpenCV的运用。
《OpenCV 4 with Python Blueprints: Build nine projects by leveraging powerful frameworks such as OpenCV 4 and Python》
本书以项目驱动,指导读者使用OpenCV 4与Python构建九个实际项目。每个项目都涉及到特定的计算机视觉任务,如图像分割、目标检测、手势识别等。通过实践项目,读者不仅学习高级OpenCV功能,还了解如何在实际应用中运用这些功能。本书适合已有Python基础并希望通过实践学习OpenCV的读者。
《Mastering OpenCV 4 with Python: A comprehensive guide to building computer vision and image processing applications with Python 3》
本书专为希望深入学习OpenCV并掌握高级功能的读者设计。作者Alberto Fernandez Villan是一位经验丰富的计算机视觉工程师,本书详细介绍了OpenCV 4的各种高级功能和应用,包括图像处理、视频分析、机器学习、深度学习等。书中附有大量代码示例和项目,帮助读者从基础知识逐步过渡到高级应用。
《Mastering OpenCV with Python: Use NumPy, Scikit, TensorFlow, and Matplotlib to learn Advanced algorithms for Machine Learning through a set of Practical Projects》
通过本书,读者能沉浸在计算机视觉领域,从图像处理与OpenCV基本概念到神经网络与对象检测等高级技术,获得全面知识。每章都包含丰富实践练习与实际项目,确保读者获得立即应用于职业旅程的实用技能。
《Practical Machine Learning and Image Processing: For Facial Recognition, Object Detection, and Pattern Recognition Using Python》
本书结合机器学习与图像处理,非常适合希望将机器学习应用于计算机视觉领域的读者。书中详细讲解如何使用OpenCV与Python构建各种图像处理与机器学习应用,如人脸识别、目标检测与模式识别等。通过本书,读者学会将机器学习算法应用于实际图像处理任务。
《Computer Vision: Algorithms and Applications》
虽然本书并非专为OpenCV设计,但作为计算机视觉领域的经典教材之一,被许多国外高校用作计算机视觉课程推荐书。书中详细阐述了计算机视觉算法与应用,涵盖图像处理、三维重建、运动分析、目标检测等领域。读者通过本书深入理解计算机视觉基本原理与算法,随后结合OpenCV实现这些算法。
求手势验证码VAPTCHA破解方法
第一步当然先要识别出轨迹,可以通过二值化做初步处理后再利用openCV来根据特征提取出大致轨迹。
然后比较麻烦的是模拟人工特征的轨迹数据,这个只能利用机器学习来做大量的学习。
最后伪造客户端的参数,设备指纹、环境变量、IP等,最简单的方法就是每次都清空伪装成第一次验证请求。
总得说来破解成本挺高的,尤其是如果轨迹变成曲线再风格化去掉一些规律化的图像信息,感觉破解几乎不可能了。干脆花点成本,人工打码吧。。整理大概思路,希望对楼主有帮助,望采纳。