/// <summary>
/// Caculate the eigen images for the specific traning image
/// </summary>
/// <param name="trainingImages">The images used for training </param>
/// <param name="termCrit">The criteria for tranning</param>
/// <param name="eigenImages">The resulting eigen images</param>
/// <param name="avg">The resulting average image</param>
public static void CalcEigenObjects(Image <Gray, Byte>[] trainingImages, ref MCvTermCriteria termCrit, out Image <Gray, Single>[] eigenImages, out Image <Gray, Single> avg)
{
int width = trainingImages[0].Width;
int height = trainingImages[0].Height;
IntPtr[] inObjs = Array.ConvertAll <Image <Gray, Byte>, IntPtr>(trainingImages, delegate(Image <Gray, Byte> img) { return(img.Ptr); });
if (termCrit.max_iter <= 0 || termCrit.max_iter > trainingImages.Length)
{
termCrit.max_iter = trainingImages.Length;
}
int maxEigenObjs = termCrit.max_iter;
#region initialize eigen images
eigenImages = new Image <Gray, float> [maxEigenObjs];
for (int i = 0; i < eigenImages.Length; i++)
{
eigenImages[i] = new Image <Gray, float>(width, height);
}
IntPtr[] eigObjs = Array.ConvertAll <Image <Gray, Single>, IntPtr>(eigenImages, delegate(Image <Gray, Single> img) { return(img.Ptr); });
#endregion
avg = new Image <Gray, Single>(width, height);
CvInvoke.cvCalcEigenObjects(
inObjs,
ref termCrit,
eigObjs,
null,
avg.Ptr);
}