UNPKG

jsfeat

Version:

JavaScript Computer Vision library

172 lines (156 loc) 7 kB
/** * @author Eugene Zatepyakin / http://inspirit.ru/ */ (function(global) { "use strict"; // var transform = (function() { // return { affine_3point_transform: function(mat, src_x0, src_y0, dst_x0, dst_y0, src_x1, src_y1, dst_x1, dst_y1, src_x2, src_y2, dst_x2, dst_y2) { // we need linear algebra module first }, perspective_4point_transform: function(mat, src_x0, src_y0, dst_x0, dst_y0, src_x1, src_y1, dst_x1, dst_y1, src_x2, src_y2, dst_x2, dst_y2, src_x3, src_y3, dst_x3, dst_y3) { var t1 = src_x0; var t2 = src_x2; var t4 = src_y1; var t5 = t1 * t2 * t4; var t6 = src_y3; var t7 = t1 * t6; var t8 = t2 * t7; var t9 = src_y2; var t10 = t1 * t9; var t11 = src_x1; var t14 = src_y0; var t15 = src_x3; var t16 = t14 * t15; var t18 = t16 * t11; var t20 = t15 * t11 * t9; var t21 = t15 * t4; var t24 = t15 * t9; var t25 = t2 * t4; var t26 = t6 * t2; var t27 = t6 * t11; var t28 = t9 * t11; var t30 = 1.0 / (t21-t24 - t25 + t26 - t27 + t28); var t32 = t1 * t15; var t35 = t14 * t11; var t41 = t4 * t1; var t42 = t6 * t41; var t43 = t14 * t2; var t46 = t16 * t9; var t48 = t14 * t9 * t11; var t51 = t4 * t6 * t2; var t55 = t6 * t14; var Hr0 = -(t8-t5 + t10 * t11 - t11 * t7 - t16 * t2 + t18 - t20 + t21 * t2) * t30; var Hr1 = (t5 - t8 - t32 * t4 + t32 * t9 + t18 - t2 * t35 + t27 * t2 - t20) * t30; var Hr2 = t1; var Hr3 = (-t9 * t7 + t42 + t43 * t4 - t16 * t4 + t46 - t48 + t27 * t9 - t51) * t30; var Hr4 = (-t42 + t41 * t9 - t55 * t2 + t46 - t48 + t55 * t11 + t51 - t21 * t9) * t30; var Hr5 = t14; var Hr6 = (-t10 + t41 + t43 - t35 + t24 - t21 - t26 + t27) * t30; var Hr7 = (-t7 + t10 + t16 - t43 + t27 - t28 - t21 + t25) * t30; t1 = dst_x0; t2 = dst_x2; t4 = dst_y1; t5 = t1 * t2 * t4; t6 = dst_y3; t7 = t1 * t6; t8 = t2 * t7; t9 = dst_y2; t10 = t1 * t9; t11 = dst_x1; t14 = dst_y0; t15 = dst_x3; t16 = t14 * t15; t18 = t16 * t11; t20 = t15 * t11 * t9; t21 = t15 * t4; t24 = t15 * t9; t25 = t2 * t4; t26 = t6 * t2; t27 = t6 * t11; t28 = t9 * t11; t30 = 1.0 / (t21-t24 - t25 + t26 - t27 + t28); t32 = t1 * t15; t35 = t14 * t11; t41 = t4 * t1; t42 = t6 * t41; t43 = t14 * t2; t46 = t16 * t9; t48 = t14 * t9 * t11; t51 = t4 * t6 * t2; t55 = t6 * t14; var Hl0 = -(t8-t5 + t10 * t11 - t11 * t7 - t16 * t2 + t18 - t20 + t21 * t2) * t30; var Hl1 = (t5 - t8 - t32 * t4 + t32 * t9 + t18 - t2 * t35 + t27 * t2 - t20) * t30; var Hl2 = t1; var Hl3 = (-t9 * t7 + t42 + t43 * t4 - t16 * t4 + t46 - t48 + t27 * t9 - t51) * t30; var Hl4 = (-t42 + t41 * t9 - t55 * t2 + t46 - t48 + t55 * t11 + t51 - t21 * t9) * t30; var Hl5 = t14; var Hl6 = (-t10 + t41 + t43 - t35 + t24 - t21 - t26 + t27) * t30; var Hl7 = (-t7 + t10 + t16 - t43 + t27 - t28 - t21 + t25) * t30; // the following code computes R = Hl * inverse Hr t2 = Hr4-Hr7*Hr5; t4 = Hr0*Hr4; t5 = Hr0*Hr5; t7 = Hr3*Hr1; t8 = Hr2*Hr3; t10 = Hr1*Hr6; var t12 = Hr2*Hr6; t15 = 1.0 / (t4-t5*Hr7-t7+t8*Hr7+t10*Hr5-t12*Hr4); t18 = -Hr3+Hr5*Hr6; var t23 = -Hr3*Hr7+Hr4*Hr6; t28 = -Hr1+Hr2*Hr7; var t31 = Hr0-t12; t35 = Hr0*Hr7-t10; t41 = -Hr1*Hr5+Hr2*Hr4; var t44 = t5-t8; var t47 = t4-t7; t48 = t2*t15; var t49 = t28*t15; var t50 = t41*t15; mat[0] = Hl0*t48+Hl1*(t18*t15)-Hl2*(t23*t15); mat[1] = Hl0*t49+Hl1*(t31*t15)-Hl2*(t35*t15); mat[2] = -Hl0*t50-Hl1*(t44*t15)+Hl2*(t47*t15); mat[3] = Hl3*t48+Hl4*(t18*t15)-Hl5*(t23*t15); mat[4] = Hl3*t49+Hl4*(t31*t15)-Hl5*(t35*t15); mat[5] = -Hl3*t50-Hl4*(t44*t15)+Hl5*(t47*t15); mat[6] = Hl6*t48+Hl7*(t18*t15)-t23*t15; mat[7] = Hl6*t49+Hl7*(t31*t15)-t35*t15; mat[8] = -Hl6*t50-Hl7*(t44*t15)+t47*t15; }, invert_affine_transform: function(src, dst) { var m11 = src[0], m12 = src[1], m13 = src[2]; var m21 = src[3], m22 = src[4], m23 = src[5]; var det = 1.0 / (m11 * m22 - m12 * m21); dst[0] = det * m22; dst[1] = det * -m12; dst[2] = det * (m12*m23 - m13*m22); dst[3] = det * -m21; dst[4] = det * m11; dst[5] = det * (m13*m21 - m11*m23); }, invert_perspective_transform: function(src, dst) { var m11 = src[0], m12 = src[1], m13 = src[2]; var m21 = src[3], m22 = src[4], m23 = src[5]; var m31 = src[6], m32 = src[7], m33 = src[8]; var det = 1.0 / (m11 * (m22*m33 - m23*m32) - m12 * (m21*m33 - m23*m31) + m13 * (m21*m32 - m22*m31)); dst[0] = det * (m22*m33 - m23*m32); dst[1] = det * (m13*m32 - m12*m33); dst[2] = det * (m12*m23 - m13*m22); dst[3] = det * (m23*m31 - m21*m33); dst[4] = det * (m11*m33 - m13*m31); dst[5] = det * (m13*m21 - m11*m23); dst[6] = det * (m21*m32 - m22*m31); dst[7] = det * (m12*m31 - m11*m32); dst[8] = det * (m11*m22 - m12*m21); } }; })(); global.transform = transform; })(jsfeat);