summaryrefslogtreecommitdiff
path: root/sci_gateway1/cpp/opencv_evaluate.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sci_gateway1/cpp/opencv_evaluate.cpp')
-rw-r--r--sci_gateway1/cpp/opencv_evaluate.cpp417
1 files changed, 417 insertions, 0 deletions
diff --git a/sci_gateway1/cpp/opencv_evaluate.cpp b/sci_gateway1/cpp/opencv_evaluate.cpp
new file mode 100644
index 0000000..2794b90
--- /dev/null
+++ b/sci_gateway1/cpp/opencv_evaluate.cpp
@@ -0,0 +1,417 @@
+/***************************************************
+Author : Rohit Suri
+***************************************************/
+#include <iostream>
+#include <opencv2/opencv.hpp>
+#include <opencv2/nonfree/nonfree.hpp>
+#include <opencv2/ml/ml.hpp>
+
+using namespace std;
+using namespace cv;
+
+extern "C"
+{
+ #include "api_scilab.h"
+ #include "Scierror.h"
+ #include "BOOL.h"
+ #include <localization.h>
+ #include "sciprint.h"
+ int opencv_evaluate(char *fname, unsigned long fname_len)
+ {
+ // Error management variables
+ SciErr sciErr;
+
+ //------Local variables------//
+ int upright = 1;
+ Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("FlannBased");
+ Ptr<DescriptorExtractor> 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<KeyPoint> 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<descriptionCount; i++)
+ {
+ if(strcmp(classifierDescription[i],description[i])!=0)
+ {
+ Scierror(999, "Error: The input imageSet does not match the classifier's training set.\n");
+ return 0;
+ }
+ }
+ sciprint("Evaluating image category classifier for %d categories.\n",descriptionCount);
+ sciprint("--------------------------------------------------------\n\n");
+ for(int i=0;i<descriptionCount;i++)
+ {
+ sciprint("# Category %d: %s\n",i+1,description[i]);
+ }
+ sciprint("\n");
+ confMatrix = (double*) malloc(sizeof(double)*descriptionCount*descriptionCount);
+ for(int i=0;i<descriptionCount*descriptionCount;i++)
+ {
+ confMatrix[i]=0;
+ }
+ FileStorage fs(bagOfFeaturesLocation, FileStorage::READ);
+ fs["dictionary"] >> dictionary;
+ fs.release();
+ dictionarySize = dictionary.rows;
+ bowDE.setVocabulary(dictionary);
+ svm.load(classifierLocation);
+ for(int i=0; i<descriptionCount;i++)
+ {
+ sciprint("# Evaluating %d images from category %d ...",count[i],i+1);
+ for(int j=0; j<count[i]; j++)
+ {
+ features.release();
+ keyPoints.clear();
+ fileName = location[i][j];
+ inp = imread(fileName);
+ detector.detect(inp, keyPoints);
+ bowDE.compute(inp, keyPoints, features);
+ response = svm.predict(features);
+ confMatrix[i+(int)response*descriptionCount]++;
+ }
+ sciprint("done.\n");
+ }
+ sciprint("\n");
+ sciprint("\t PREDICTED\n");
+ sciprint("KNOWN\t|");
+ for(int i=0;i<descriptionCount;i++)
+ {
+ sciprint(" %d\t",i+1);
+ }
+ sciprint("\n");
+ for(int i=0; i<descriptionCount;i++)
+ {
+ sciprint("%d\t|",i+1);
+ for(int j=0; j<descriptionCount; j++)
+ {
+ confMatrix[i+descriptionCount*j] /= count[i];
+ sciprint(" %.2f\t",confMatrix[i+descriptionCount*j]);
+ }
+ sciprint("\n");
+ }
+ sciprint("\n");
+ for(int i=0;i<descriptionCount*descriptionCount;i=i+descriptionCount+1)
+ {
+ avgAccuracy += confMatrix[i];
+ }
+ sciprint("# Average accuracy: %f\n",avgAccuracy/descriptionCount);
+ //------Create output arguments------//
+ sciErr = createMatrixOfDouble(pvApiCtx, nbInputArgument(pvApiCtx)+1, descriptionCount, descriptionCount, confMatrix);
+ if(sciErr.iErr)
+ {
+ printError(&sciErr, 0);
+ return 0;
+ }
+ //------Return Arguments------//
+ AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx)+1;
+ ReturnArguments(pvApiCtx);
+ return 0;
+ }
+ /* ==================================================================== */
+}