javascript - 使用点击点在 Canvas 中拉直脸部图像

标签 javascript html math canvas html5-canvas

我正在尝试构建一个小型应用程序,用户只需点击 2 次即可将倾斜的脸部拉直

我要求用户点击图像中脸部的 Nose 中部眉毛中部

从那里我得到 2 分 eyebrowMiddle(x1,y1)noseMiddle (x2,y2).

Is it possible via these 2 points to calculate how much Canvas rotation I need to have to rotate the image and make the face straight in relation to the canvas rectangle?

Also, how can I detect and adjust accordingly if the image is tilted to the left or right?

这是一个更具描述性的图片,可以向您展示我现在的意思。

Tilted face with user click points and an imaginary line

<小时/>

PS:

  • x1,y1x2,y2与 Canvas 周长有关 当然,不是浏览器窗口或其他任何东西。

  • 我们尝试了直线方程,例如 m = (x2-x1)/(y2-y1),但是 结果总是接近 1,所以我认为我们没有遵循正确的方法 目前的类(class)。

  • 我们不在乎图像在 Canvas 上看起来是否错误,只要 面部特征相对于 Canvas 底部平行 (他们应该直视)。

最佳答案

要执行此类旋转,您需要确定枢轴点。这里我选择眉毛。
然后,您必须在目标 Canvas 中选择一个点来 Hook 该枢轴点。我决定选择中间 x 坐标和 y 屏幕第四个位置的点。
要计算旋转 Angular ,您必须使用 atan2,它可以很好地为您提供两点之间给定 deltaY/deltaX 的 Angular (angle = Math.atan2 ( delta y , delta x ) )。

然后绘制:
- 平移到目标点。
- 旋转直 Angular 。
- 以枢轴为中心绘制图像。

瞧,它有效:-)

function rotate() {
  ctx.save();
  // go to default center position
  ctx.translate(eyeBrowTargetPosition.x, eyeBrowTargetPosition.y);
  // compute angle 
  var yDelta = noseMiddle.y - eyebrowMiddle.y;
  var xDelta =  noseMiddle.x - eyebrowMiddle.x ;
  var angle = Math.atan2 (yDelta ,xDelta);
  // compensate for angle
  ctx.rotate(angle);
  //draw image centering input on eyebrow
  ctx.drawImage(face, -eyebrowMiddle.x, -eyebrowMiddle.y);
  ctx.restore();
};

jsbin在这里:
http://jsbin.com/wavokaku/2/edit?js,output

结果与现有绿点的近似值:

enter image description here

关于javascript - 使用点击点在 Canvas 中拉直脸部图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24690337/

相关文章:

javascript - Angular 2 Form - 当 ngModel = empty obj 时禁用提交

javascript - 无法从 map 中删除所有图层

javascript - 如何在现有 Span 标记之前或之后添加新的 Span 标记

jquery - 使用 JQuery 很好地向 DOM 添加 HTML 元素

javascript - 将坐标转换为等距坐标,反之亦然不起作用

javascript - 如何在 Gulp 中添加特定的 Bower 组件作为 IE8 条件 block

javascript - 从隐藏元素获取宽度大小

html - 如何将多个div相邻对齐?

c++ - C++ 和 OpenGL 矩阵顺序之间的混淆(行优先与列优先)

c++ - 计算以恒定加速度对齐两个 3D vector 所需的扭矩?