summaryrefslogtreecommitdiff
path: root/sci_gateway1/cpp/opencv_predict.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sci_gateway1/cpp/opencv_predict.cpp')
-rw-r--r--sci_gateway1/cpp/opencv_predict.cpp222
1 files changed, 222 insertions, 0 deletions
diff --git a/sci_gateway1/cpp/opencv_predict.cpp b/sci_gateway1/cpp/opencv_predict.cpp
new file mode 100644
index 0000000..51b9710
--- /dev/null
+++ b/sci_gateway1/cpp/opencv_predict.cpp
@@ -0,0 +1,222 @@
+/***************************************************
+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"
+ #include "../common.h"
+ int opencv_predict(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,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;
+ char **classifierDescription = NULL;
+ int classifierDescriptionCount;
+ char *bagOfFeaturesLocation = NULL;
+ int descriptionCount;
+ Mat input;
+ //------Check number of parameters------//
+ CheckInputArgument(pvApiCtx, 2, 2);
+ CheckOutputArgument(pvApiCtx, 1, 1);
+
+ //------Get input arguments------//
+ retrieveImage(input,2);
+ 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;
+ }
+ //------Actual processing------//
+ FileStorage fs(bagOfFeaturesLocation, FileStorage::READ);
+ fs["dictionary"] >> dictionary;
+ fs.release();
+ dictionarySize = dictionary.rows;
+ bowDE.setVocabulary(dictionary);
+ svm.load(classifierLocation);
+ detector.detect(input, keyPoints);
+ bowDE.compute(input, keyPoints, features);
+ response = svm.predict(features);
+ //------Create output arguments------//
+ sciErr = createMatrixOfString(pvApiCtx, nbInputArgument(pvApiCtx)+1, 1, 1, &classifierDescription[(int)response]);
+ if(sciErr.iErr)
+ {
+ printError(&sciErr, 0);
+ return 0;
+ }
+ //------Return Arguments------//
+ AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx)+1;
+ ReturnArguments(pvApiCtx);
+ return 0;
+ }
+ /* ==================================================================== */
+}