You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

121 lines
4.5 KiB

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
namespace Emgu.CV
{
/// <summary>
/// The kernel that can be use as the parameter of the Convulution function in Image class
/// </summary>
public class ConvolutionKernelF : Matrix<float>
{
/// <summary>
/// The center of the convolution kernel
/// </summary>
protected Point2D<int> _center;
/// <summary>
/// Create a convolution kernel of the specific rows and cols
/// </summary>
/// <param name="rows">The number of raws for the convolution kernel</param>
/// <param name="cols">The number of columns for the convolution kernel</param>
public ConvolutionKernelF(int rows, int cols)
:base(rows, cols)
{
Debug.Assert( ! (rows <= 1 || cols <= 1) );
_center = new Point2D<int>(-1, -1);
}
/// <summary>
/// Create a convolution kernel using the specific matrix and center
/// </summary>
/// <param name="kernel">the values for the convolution kernel</param>
/// <param name="center">the center of the kernel</param>
public ConvolutionKernelF(Matrix<float> kernel, Point2D<int> center)
: this(kernel.Data, center)
{
}
/// <summary>
/// Create a convolution kernel using the specific floating point matrix
/// </summary>
/// <param name="kernel">the values for the convolution kernel</param>
public ConvolutionKernelF(float[,] kernel)
: this(kernel, new Point2D<int>(-1, -1))
{
}
/// <summary>
/// Create a convolution kernel using the specific floating point matrix and center
/// </summary>
/// <param name="kernel">the values for the convolution kernel</param>
/// <param name="center">the center for the convolution kernel</param>
public ConvolutionKernelF(float[,] kernel, Point2D<int> center)
: base( Math.Max(kernel.GetLength(0), 2), Math.Max(kernel.GetLength(1), 2))
{
int rows = kernel.GetLength(0);
int cols = kernel.GetLength(1);
Debug.Assert(!(rows == 0 || cols == 0));
/*
if (rows == 1)
{
kernel = new float[2, cols] { kernel[0], new float[cols] };
rows++;
}
if (cols == 1)
{
kernel = System.Array.ConvertAll<float[], float[]>(kernel, delegate(float[] fs) { return new float[2] { fs[0], 0.0f }; });
cols++;
}
Emgu.Utils.CopyMatrix(kernel, CvMat.data);
*/
throw new System.Exception("Unimplemented");
_center = center;
}
///<summary> Return a filpped copy of the convolution kernel</summary>
///<param name="horizontal">if the kernel to be flipped horizontally</param>
///<param name="vertical">if the kernel to be flipped vertically</param>
///<returns> The flipped copy of <i>this</i> image </returns>
public ConvolutionKernelF Flip(bool horizontal, bool vertical)
{
int code = 0;
if (horizontal && !vertical) code = 1;
else if (!horizontal && vertical) code = 0;
else if (horizontal && vertical) code = -1;
else
{
throw new Emgu.Exception(
Emgu.ExceptionHeader.CriticalException,
"Must Flip in at least one of the dimension");
}
ConvolutionKernelF res = new ConvolutionKernelF(Height, Width);
CvInvoke.cvFlip(Ptr, res.Ptr, code);
res.Center.X = ( Center.X == -1 ? -1 : ( horizontal ? Width - Center.X -1 : Center.X) );
res.Center.Y = ( Center.Y == -1 ? -1 : ( vertical ? Height - Center.Y -1 : Center.Y));
return res;
}
/// <summary>
/// The center of the convolution kernel
/// </summary>
public Point2D<int> Center { get { return _center; } }
/// <summary>
/// Obtain the transpose of the convolution kernel
/// </summary>
/// <returns></returns>
public new ConvolutionKernelF Transpose()
{
return new ConvolutionKernelF(
base.Transpose(),
new Point2D<int>(_center.Y, _center.X));
}
}
}