예제 #1
0
static void
filter_gabor_kernel_2d (const Matrix22 &filter, const Dual2<float> &w, float a,
                        const Vec2 &omega, const Dual2<float> &phi,
                        Dual2<float> &w_f, float &a_f,
                        Vec2 &omega_f, Dual2<float> &phi_f)
{
    //  Equation 10
    Matrix22 Sigma_f = filter;
    Dual2<float> c_G = w;
    Vec2 mu_G = omega;
    Matrix22 Sigma_G = (a * a / float(M_TWO_PI)) * Matrix22();
    float c_F = 1.0f / (float(M_TWO_PI) * sqrtf(determinant(Sigma_f)));
    Matrix22 Sigma_F = float(1.0 / (4.0 * M_PI * M_PI)) * Sigma_f.inverse();
    Matrix22 Sigma_G_Sigma_F = Sigma_G + Sigma_F;
    Dual2<float> c_GF = c_F * c_G
        * (1.0f / (float(M_TWO_PI) * sqrtf(determinant(Sigma_G_Sigma_F))))
        * expf(-0.5f * dot(Sigma_G_Sigma_F.inverse()*mu_G, mu_G));
    Matrix22 Sigma_G_i = Sigma_G.inverse();
    Matrix22 Sigma_GF = (Sigma_F.inverse() + Sigma_G_i).inverse();
    Vec2 mu_GF;
    Matrix22 Sigma_GF_Gi = Sigma_GF * Sigma_G_i;
    Sigma_GF_Gi.multMatrix (mu_G, mu_GF);
    w_f = c_GF;
    a_f = sqrtf(M_TWO_PI * sqrtf(determinant(Sigma_GF)));
    omega_f = mu_GF;
    phi_f = phi;
}
예제 #2
0
		//-----------------------------------------------------------------------------
		Matrix22 Matrix22::AsLeftHanded() const
		{
			DIA_ASSERT(IsOrthogonal(), "Must be orthogonal");
			DIA_ASSERT(IsAxisNormal(), "Axis are not normal");

			if (IsLeftHanded())
			{
				return Matrix22(*this);
			}

			Vector2D xAxis, yAxis;

			XAxis(xAxis);
			YAxis(yAxis);

			Matrix22 m(yAxis, xAxis);
	
			return m;
		}
예제 #3
0
namespace Common {

Matrix22::Matrix22()
{
	memset(m, 0, sizeof(m));
	m[0] = 1.0f;
	m[3] = 1.0f;
}


Matrix22::Matrix22(float a11, float a12,
		float a21, float a22)
{
	m[0] = a11;
	m[1] = a12;
	m[2] = a21;
	m[3] = a22;
}

Matrix22 Matrix22::operator*(const Matrix22& rhs) const
{
	Matrix22 res;

	res.m[0] = m[0] * rhs.m[0] + m[1] * rhs.m[2];
	res.m[1] = m[0] * rhs.m[1] + m[1] * rhs.m[3];

	res.m[2] = m[2] * rhs.m[0] + m[3] * rhs.m[2];
	res.m[3] = m[2] * rhs.m[1] + m[3] * rhs.m[3];

	return res;
}

Vector2 Matrix22::operator*(const Vector2& rhs) const
{
	Vector2 ret;
	ret.x = m[0] * rhs.x + m[1] * rhs.y;
	ret.y = m[2] * rhs.x + m[3] * rhs.y;
	return ret;
}

Matrix22 Matrix22::operator*(float rhs) const
{
	Matrix22 ret(*this);
	ret.m[0] *= rhs;
	ret.m[1] *= rhs;
	ret.m[2] *= rhs;
	ret.m[3] *= rhs;
	return ret;
}

void Matrix22::operator*=(const Matrix22& rhs)
{
	Matrix22 res = *this * rhs;
	*this = res;
}

Matrix22 Matrix22::transposed() const
{
	Matrix22 ret(*this);

	ret.m[1] = m[3];

	return ret;
}

void Matrix22::transpose()
{
	*this = this->transposed();
}

float Matrix22::determinant() const
{
	return m[0] * m[3] - m[1] * m[2];
}

Matrix22 Matrix22::inverse() const
{
	float det = determinant();
	if(!det) {
		throw std::runtime_error("Trying to get the inverse of a 2x2 matrix with a zero determinant");
	}
	Matrix22 ret;
	ret.m[0] = m[3];
	ret.m[1] = -m[1];
	ret.m[2] = -m[2];
	ret.m[3] = m[0];

	return ret * det;
}

const Matrix22 Matrix22::Identity = Matrix22(1, 0,
		0, 1);


}
예제 #4
0
Matrix22 Matrix22::operator*(const Matrix22 &right) const
{
	return Matrix22(matrix_ops::multiply(2,2,m_matrix,2,2,right.m_matrix));
}
예제 #5
0
Matrix22 Matrix22::operator*(double x) const
{
	return Matrix22(matrix_ops::multiply(2,2,m_matrix,x));
}
예제 #6
0
Transformation::Transformation():
    static_params(Vector2(0, 0), 1),
    params(std::make_pair(Vector2(0, 0), Matrix22(1, 0, 0, 1)))
{
}
예제 #7
0
inline Matrix22 extract_matrix(Params p)
{
    return Matrix22(p[2], p[3], p[4], p[5]);
}