Skip to content
Snippets Groups Projects
MexNormalizedCovariance.cpp 3.68 KiB
Newer Older
Eric Wait's avatar
Eric Wait committed
#include "Vec.h"
#include "CWrappers.cuh"
Eric Wait's avatar
Eric Wait committed
void MexNormalizedCovariance::execute( int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[] )
{
	int device = 0;

	if (nrhs>2)
		device = mat_to_c((int)mxGetScalar(prhs[2]));

	double normCoVar;

	if (mxIsUint8(prhs[0]))
	{
		unsigned char* imageIn1,* imageIn2;
		setupImagePointers(prhs[0],&imageIn1,&imageDims1);
		setupImagePointers(prhs[1],&imageIn2,&imageDims2);

		if (imageDims1!=imageDims2)
			mexErrMsgTxt("Image Dimensions Must Match!\n");

Eric Wait's avatar
Eric Wait committed
		normCoVar = normalizedCovariance(imageIn1,imageIn2,imageDims1,device);
	}
	else if (mxIsUint16(prhs[0]))
	{
Eric Wait's avatar
Eric Wait committed
		unsigned short* imageIn1,* imageIn2;
		setupImagePointers(prhs[0],&imageIn1,&imageDims1);
		setupImagePointers(prhs[1],&imageIn2,&imageDims2);

		if (imageDims1!=imageDims2)
			mexErrMsgTxt("Image Dimensions Must Match!\n");

Eric Wait's avatar
Eric Wait committed
		normCoVar = normalizedCovariance(imageIn1,imageIn2,imageDims1,device);
	}
	else if (mxIsInt16(prhs[0]))
Eric Wait's avatar
Eric Wait committed
	{
		short* imageIn1,* imageIn2;
		setupImagePointers(prhs[0],&imageIn1,&imageDims1);
		setupImagePointers(prhs[1],&imageIn2,&imageDims2);

		if (imageDims1!=imageDims2)
			mexErrMsgTxt("Image Dimensions Must Match!\n");

Eric Wait's avatar
Eric Wait committed
		normCoVar = normalizedCovariance(imageIn1,imageIn2,imageDims1,device);
Eric Wait's avatar
Eric Wait committed
	}
	else if (mxIsUint32(prhs[0]))
	{
		unsigned int* imageIn1,* imageIn2;
		setupImagePointers(prhs[0],&imageIn1,&imageDims1);
		setupImagePointers(prhs[1],&imageIn2,&imageDims2);

		if (imageDims1!=imageDims2)
			mexErrMsgTxt("Image Dimensions Must Match!\n");

Eric Wait's avatar
Eric Wait committed
		normCoVar = normalizedCovariance(imageIn1,imageIn2,imageDims1,device);
Eric Wait's avatar
Eric Wait committed
	}
	else if (mxIsInt32(prhs[0]))
	{
		int* imageIn1,* imageIn2;
		setupImagePointers(prhs[0],&imageIn1,&imageDims1);
		setupImagePointers(prhs[1],&imageIn2,&imageDims2);

		if (imageDims1!=imageDims2)
			mexErrMsgTxt("Image Dimensions Must Match!\n");

Eric Wait's avatar
Eric Wait committed
		normCoVar = normalizedCovariance(imageIn1,imageIn2,imageDims1,device);
	}
	else if (mxIsSingle(prhs[0]))
	{
		float* imageIn1,* imageIn2;
		setupImagePointers(prhs[0],&imageIn1,&imageDims1);
		setupImagePointers(prhs[1],&imageIn2,&imageDims2);

		if (imageDims1!=imageDims2)
			mexErrMsgTxt("Image Dimensions Must Match!\n");

Eric Wait's avatar
Eric Wait committed
		normCoVar = normalizedCovariance(imageIn1,imageIn2,imageDims1,device);
	}
	else if (mxIsDouble(prhs[0]))
	{
		double* imageIn1,* imageIn2;
		setupImagePointers(prhs[0],&imageIn1,&imageDims1);
		setupImagePointers(prhs[1],&imageIn2,&imageDims2);
		if (imageDims1!=imageDims2)
			mexErrMsgTxt("Image Dimensions Must Match!\n");
Eric Wait's avatar
Eric Wait committed
		normCoVar = normalizedCovariance(imageIn1,imageIn2,imageDims1,device);
	}
	else
	{
		mexErrMsgTxt("Image type not supported!");
	}
Eric Wait's avatar
Eric Wait committed
std::string MexNormalizedCovariance::check( int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[] )
{
	if (nrhs!=3)
		return "Incorrect number of inputs!";

	if (nlhs!=1)
		return "Requires one output!";

	size_t numDims1 = mxGetNumberOfDimensions(prhs[0]);
	if (numDims1>3)
		return "Image can have a maximum of three dimensions!";
	size_t numDims2= mxGetNumberOfDimensions(prhs[1]);
	if (numDims2>3)
		return "Image can have a maximum of three dimensions!";
	if (numDims1!=numDims2)
		return "Images must have the same dimensions!";
Eric Wait's avatar
Eric Wait committed
std::string MexNormalizedCovariance::printUsage()
{
	return "normalizedCovariance = CudaMex('NormalizedCovariance',imageIn1,imageIn2,[device]);";
}

Eric Wait's avatar
Eric Wait committed
std::string MexNormalizedCovariance::printHelp()
{
	std::string msg = "\tThis will calculate how similar the images are to one another.\n";
	msg += "\tThe return value will be between [-1,1].  Where 1 is exactly the same and -1 is exactly the opposite.\n";
	msg += "\tImages must match in dimension.\n";
	msg += "\n";
	return msg;
}