/*************************************************** Author : Rohit Suri ***************************************************/ #include #include #include #include using namespace std; using namespace cv; extern "C" { #include "api_scilab.h" #include "Scierror.h" #include "BOOL.h" #include #include "sciprint.h" int opencv_evaluate(char *fname, unsigned long fname_len) { // Error management variables SciErr sciErr; //------Local variables------// int upright = 1; Ptr matcher = DescriptorMatcher::create("FlannBased"); Ptr extractor = new SurfDescriptorExtractor(1, 4, 2, 1, int(upright)); BOWImgDescriptorExtractor bowDE(extractor, matcher); SurfFeatureDetector detector(1, 4, 2, 1, int(upright)); char *classifierLocation = NULL; Mat dictionary,inp,features; double response; vector keyPoints; CvSVM svm; int dictionarySize; int *piAddr = NULL; int *piChild = NULL; int iRows, iCols; char **pstData = NULL; int *piLen = NULL; int *count = NULL; char **classifierDescription = NULL; int classifierDescriptionCount; char **description = NULL; char ***location = NULL; char *bagOfFeaturesLocation = NULL; int descriptionCount; double *confMatrix = NULL; char *fileName = NULL; double avgAccuracy = 0; //------Check number of parameters------// CheckInputArgument(pvApiCtx, 2, 2); CheckOutputArgument(pvApiCtx, 1, 1); //------Get input arguments------// sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr); if (sciErr.iErr) { printError(&sciErr, 0); return 0; } if(!isListType(pvApiCtx, piAddr)) { Scierror(999, "Error: The input argument #1 is not of type classifier.\n"); return 0; } // Extracting object type and checking if type is classifier sciErr = getMatrixOfStringInList(pvApiCtx, piAddr, 1, &iRows, &iCols, NULL, NULL); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } piLen = (int*)malloc(sizeof(int) * iRows * iCols); sciErr = getMatrixOfStringInList(pvApiCtx, piAddr, 1, &iRows, &iCols, piLen, NULL); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } pstData = (char**)malloc(sizeof(char*) * iRows * iCols); for(int iter = 0 ; iter < iRows * iCols ; iter++) { pstData[iter] = (char*)malloc(sizeof(char) * (piLen[iter] + 1));//+ 1 for null termination } sciErr = getMatrixOfStringInList(pvApiCtx, piAddr, 1, &iRows, &iCols, piLen, pstData); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } if(!(strcmp(pstData[0],"classifier")==0)) { Scierror(999, "Error: The input argument #1 is not of type classifier.\n"); return 0; } sciErr = getMatrixOfStringInList(pvApiCtx, piAddr, 2, &iRows, &iCols, NULL, NULL); if (sciErr.iErr) { printError(&sciErr, 0); return 0; } piLen = (int*) malloc(sizeof(int) * iRows * iCols); sciErr = getMatrixOfStringInList(pvApiCtx, piAddr, 2, &iRows, &iCols, piLen, NULL); if (sciErr.iErr) { printError(&sciErr, 0); return 0; } pstData = (char**) malloc(sizeof(char*) * iRows * iCols); for(int iterPstData = 0; iterPstData < iRows * iCols; iterPstData++) { pstData[iterPstData] = (char*) malloc(sizeof(char) * piLen[iterPstData] + 1); } sciErr = getMatrixOfStringInList(pvApiCtx, piAddr, 2, &iRows, &iCols, piLen, pstData); if (sciErr.iErr) { printError(&sciErr, 0); return 0; } if(iRows!=1 || iCols!=1) { Scierror(999, "1x1 Matrix expected for classifier argument."); return 0; } classifierLocation = pstData[0]; sciErr = getMatrixOfStringInList(pvApiCtx, piAddr, 3, &iRows, &iCols, NULL, NULL); if (sciErr.iErr) { printError(&sciErr, 0); return 0; } piLen = (int*) malloc(sizeof(int) * iRows * iCols); sciErr = getMatrixOfStringInList(pvApiCtx, piAddr, 3, &iRows, &iCols, piLen, NULL); if (sciErr.iErr) { printError(&sciErr, 0); return 0; } pstData = (char**) malloc(sizeof(char*) * iRows * iCols); for(int iterPstData = 0; iterPstData < iRows * iCols; iterPstData++) { pstData[iterPstData] = (char*) malloc(sizeof(char) * piLen[iterPstData] + 1); } sciErr = getMatrixOfStringInList(pvApiCtx, piAddr, 3, &iRows, &iCols, piLen, pstData); if (sciErr.iErr) { printError(&sciErr, 0); return 0; } if(iRows!=1 || iCols!=1) { Scierror(999, "1x1 Matrix expected for bagOfFeatures argument."); return 0; } bagOfFeaturesLocation = pstData[0]; sciErr = getMatrixOfStringInList(pvApiCtx, piAddr, 4, &iRows, &iCols, NULL, NULL); if (sciErr.iErr) { printError(&sciErr, 0); return 0; } piLen = (int*) malloc(sizeof(int) * iRows * iCols); sciErr = getMatrixOfStringInList(pvApiCtx, piAddr, 4, &iRows, &iCols, piLen, NULL); if (sciErr.iErr) { printError(&sciErr, 0); return 0; } classifierDescription = (char**) malloc(sizeof(char*) * iRows * iCols); for(int iterPstData = 0; iterPstData < iRows * iCols; iterPstData++) { classifierDescription[iterPstData] = (char*) malloc(sizeof(char) * piLen[iterPstData] + 1); } sciErr = getMatrixOfStringInList(pvApiCtx, piAddr, 4, &iRows, &iCols, piLen, classifierDescription); if (sciErr.iErr) { printError(&sciErr, 0); return 0; } classifierDescriptionCount = iRows; // Second Argument sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr); if (sciErr.iErr) { printError(&sciErr, 0); return 0; } if(!isListType(pvApiCtx, piAddr)) { Scierror(999, "Error: The input argument #2 is not of type imageSet.\n"); return 0; } // Extracting object type and checking if type is imageSet sciErr = getMatrixOfStringInList(pvApiCtx, piAddr, 1, &iRows, &iCols, NULL, NULL); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } piLen = (int*)malloc(sizeof(int) * iRows * iCols); sciErr = getMatrixOfStringInList(pvApiCtx, piAddr, 1, &iRows, &iCols, piLen, NULL); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } pstData = (char**)malloc(sizeof(char*) * iRows * iCols); for(int iter = 0 ; iter < iRows * iCols ; iter++) { pstData[iter] = (char*)malloc(sizeof(char) * (piLen[iter] + 1));//+ 1 for null termination } sciErr = getMatrixOfStringInList(pvApiCtx, piAddr, 1, &iRows, &iCols, piLen, pstData); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } if(!(strcmp(pstData[0],"imageSet")==0)) { Scierror(999, "Error: The input argument #2 is not of type imageSet.\n"); return 0; } // Extracting Description attribute of input argument sciErr = getMatrixOfStringInList(pvApiCtx, piAddr, 2, &iRows, &iCols, NULL, NULL); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } piLen = (int*)malloc(sizeof(int) * iRows * iCols); sciErr = getMatrixOfStringInList(pvApiCtx, piAddr, 2, &iRows, &iCols, piLen, NULL); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } description = (char**)malloc(sizeof(char*) * iRows * iCols); for(int iter = 0 ; iter < iRows * iCols ; iter++) { description[iter] = (char*)malloc(sizeof(char) * (piLen[iter] + 1));//+ 1 for null termination } sciErr = getMatrixOfStringInList(pvApiCtx, piAddr, 2, &iRows, &iCols, piLen, description); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } descriptionCount = iRows; // Extracting Count attribute of input argument sciErr = getMatrixOfInteger32InList(pvApiCtx, piAddr, 3, &iRows, &iCols, &count); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } location = (char***) malloc(sizeof(char**) * descriptionCount); sciErr = getListItemAddress(pvApiCtx, piAddr, 4, &piChild); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } for(int iter = 1; iter<=descriptionCount; iter++) { sciErr = getMatrixOfStringInList(pvApiCtx, piChild, iter, &iRows, &iCols, NULL, NULL); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } piLen = (int*)malloc(sizeof(int) * iRows * iCols); sciErr = getMatrixOfStringInList(pvApiCtx, piChild, iter, &iRows, &iCols, piLen, NULL); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } location[iter-1] = (char**)malloc(sizeof(char*) * iRows * iCols); for(int colIter = 0 ; colIter < iRows * iCols ; colIter++) { location[iter-1][colIter] = (char*)malloc(sizeof(char) * (piLen[colIter] + 1));//+ 1 for null termination } sciErr = getMatrixOfStringInList(pvApiCtx, piChild, iter, &iRows, &iCols, piLen, location[iter-1]); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } } //------Actual processing------// if(descriptionCount != classifierDescriptionCount) { Scierror(999, "Error: The input imageSet does not match the classifier's training set.\n"); return 0; } for(int i=0; i> dictionary; fs.release(); dictionarySize = dictionary.rows; bowDE.setVocabulary(dictionary); svm.load(classifierLocation); for(int i=0; i