问题描述
我希望图像中的眼睛是水平的
$rightEyeY = 446;
$rightEyeX = 625;
$leftEyeY = 433;
$leftEyeX = 733;
// Get middle point of two eyes
$y = $rightEyeY - $leftEyeY;
$x = $rightEyeX - $leftEyeX;
$angle = rad2deg(atan2($y,$x)) - 180; // -6.8 degrees
$manager = new ImageManager(['driver' => 'imagick']);
$image = $manager->make('image.jpg')->rotate($angle);
$a = $angle * pi() / 180.0;
$cosa = cos($a);
$sina = sin($a);
$x = $x * $cosa - $y * $sina; // This one calculates x of the middle point not each eye.
$y = $x * $sina + $y * $cosa; // This one calculates y of the middle point not each eye.
旋转后如何获取每只眼睛的坐标?
我想要那些变量在顶部
FROM:
右眼 = 446
rightEyeX = 625
leftEyeY = 433
leftEyeX = 733
TO:
右眼 = 432
rightEyeX = 640
leftEyeY = 432
leftEyeX = 749
解决方法
我尝试了一些东西,但得到了其他坐标。它看起来很适合我。诀窍是旋转平移到中心。我认为差异来自 -6.83 的角度是错误的(OP 代码中眼睛的距离)。
如果你不平移,旋转将在坐标系的原点 (0,0) 处完成,然后是图像空间的左上角,但你想要中心。
$angle = deg2rad(-6.83);
list($leftX,$leftY) = $rotateEye($leftEyeX,$leftEyeY,$angle);
list($rightX,$rightY) = $rotateEye($rightEyeX,$rightEyeY,$angle);
然后给我
L: (734.56131177907,734.56131177907)
R: (628.87375746869,418.91568508316)
但图像看起来像那样,左蓝色,右红色。下面一对是原点,上面一对旋转了-6.83度。
二维旋转矩阵和平移代码
$rotateEye = function ($x,$y,$angle) use ($centerX,$centerY): array {
$tx = $x - $centerX;
$ty = $y - $centerY;
$rx = cos($angle) * $tx - sin($angle) * $ty;
$ry = sin($angle) * $tx + cos($angle) * $ty;
return [$rx + $centerX,$ry + $centerY];
};
这里是完整代码的pastebin。