summaryrefslogtreecommitdiff
path: root/sci_gateway/cpp/opencv_imgaborfilt.cpp
diff options
context:
space:
mode:
authorshamikam2017-01-16 02:56:17 +0530
committershamikam2017-01-16 02:56:17 +0530
commita6df67e8bcd5159cde27556f4f6a315f8dc2215f (patch)
treee806e966b06a53388fb300d89534354b222c2cad /sci_gateway/cpp/opencv_imgaborfilt.cpp
downloadFOSSEE_Image_Processing_Toolbox-master.tar.gz
FOSSEE_Image_Processing_Toolbox-master.tar.bz2
FOSSEE_Image_Processing_Toolbox-master.zip
First CommitHEADmaster
Diffstat (limited to 'sci_gateway/cpp/opencv_imgaborfilt.cpp')
-rw-r--r--sci_gateway/cpp/opencv_imgaborfilt.cpp159
1 files changed, 159 insertions, 0 deletions
diff --git a/sci_gateway/cpp/opencv_imgaborfilt.cpp b/sci_gateway/cpp/opencv_imgaborfilt.cpp
new file mode 100644
index 0000000..457a4be
--- /dev/null
+++ b/sci_gateway/cpp/opencv_imgaborfilt.cpp
@@ -0,0 +1,159 @@
+/*
+ * imgaborfilt
+ *
+ * imgaborfilt in scilab
+ *
+ */
+
+// Created by Samiran Roy, mail: samiranroy@cse.iitb.ac.in
+// An implementation of imgaborfilt in scilab
+// Usage:
+// imgaborfilt(I,wavelength,orientation) : Perform gabor filtering on a grayscale image with given wavelength and orientation
+// imboxfilt(I,method)
+// method : 'upright' (default)
+// method : 'rotated' The area sums are calulated over a rectangle, which is
+// rotated 45 degrees
+// Known Changes from Matlab:
+/*
+ * 1) None, as of now
+ */
+
+#include <numeric>
+#include "opencv2/core/core.hpp"
+#include "opencv2/highgui/highgui.hpp"
+#include "opencv2/opencv.hpp"
+#include <iostream>
+using namespace cv;
+using namespace std;
+extern "C" {
+#include "api_scilab.h"
+#include "Scierror.h"
+#include "BOOL.h"
+#include <localization.h>
+#include "sciprint.h"
+#include "../common.h"
+
+int opencv_imgaborfilt(char *fname, unsigned long fname_len) {
+ SciErr sciErr;
+ int intErr = 0;
+ int iRows = 0, iCols = 0;
+ int *piAddr = NULL;
+ int *piAddr1 = NULL;
+ int *piAddr2 = NULL;
+ int *piAddr3 = NULL;
+
+ int error;
+
+ double wavelength;
+ double orientation;
+
+ int borderType = BORDER_REPLICATE;
+
+ // Parameters for convolution - Leave these alone
+
+ /* **********************************************************************************
+ */
+
+ Point anchor;
+ double delta;
+ int ddepth;
+
+ anchor = Point(-1, -1); // The center is unchanged
+ delta = 0; // No value is added to output
+ ddepth = -1; // The dimentions of input and output images are the same
+
+ /* **********************************************************************************
+ */
+
+ // Get the number of input arguments
+ int inputarg = *getNbInputArgument(pvApiCtx);
+
+ // String holding the second argument
+ int iRet = 0;
+ char *pstData = NULL;
+
+ // Checking input argument
+ CheckInputArgument(pvApiCtx, 3, 3);
+ CheckOutputArgument(pvApiCtx, 1, 1);
+
+ // Get input image
+
+ Mat image;
+ retrieveImage(image, 1);
+
+ if (image.channels() > 1) {
+ sciprint("The image must be grayscale.");
+ return 0;
+ }
+
+ // Getting the wavelength
+ sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr2);
+
+ if (sciErr.iErr) {
+ printError(&sciErr, 0);
+ return 0;
+ }
+
+ intErr = getScalarDouble(pvApiCtx, piAddr2, &wavelength);
+ if (sciErr.iErr) {
+ printError(&sciErr, 0);
+ return intErr;
+ }
+
+ if (wavelength < 2) {
+ sciprint("Wavelength must be >=2");
+ return 0;
+ }
+ // Getting the orientation
+ sciErr = getVarAddressFromPosition(pvApiCtx, 3, &piAddr3);
+
+ if (sciErr.iErr) {
+ printError(&sciErr, 0);
+ return 0;
+ }
+
+ intErr = getScalarDouble(pvApiCtx, piAddr3, &orientation);
+ if (sciErr.iErr) {
+ printError(&sciErr, 0);
+ return intErr;
+ }
+
+ if ((orientation < 0) || (orientation > 360)) {
+ sciprint("Orientation must be in the range [0,360]");
+ return 0;
+ }
+
+ double sigma = (1 / CV_PI) * sqrt(log(2) / 2) * 3 *
+ wavelength; // calculating sigma following matlab convention
+
+ orientation = (orientation / 360) * 2 * CV_PI; // Converting degree to radian
+ int K_size =
+ 33 +
+ 16 * (wavelength - 2); // size of kernel following matlab convention
+
+ Mat kernel = getGaborKernel(cv::Size(K_size, K_size), sigma, orientation,
+ wavelength, 0.5, 0);
+
+ Mat floatimage;
+ image.convertTo(floatimage, CV_32F); // Converting image to float type
+
+ Mat dst;
+ Mat new_image;
+ filter2D(floatimage, new_image, CV_32F, kernel); // Performing convolution
+
+ int temp = nbInputArgument(pvApiCtx) + 1;
+ string tempstring = type2str(new_image.type());
+ char *checker;
+ checker = (char *)malloc(tempstring.size() + 1);
+ memcpy(checker, tempstring.c_str(), tempstring.size() + 1);
+ returnImage(checker, new_image, 1);
+ free(checker);
+
+ // Assigning the list as the Output Variable
+ AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;
+ // Returning the Output Variables as arguments to the Scilab environment
+ ReturnArguments(pvApiCtx);
+ return 0;
+}
+/* ==================================================================== */
+}