39 #include <visp3/core/vpImageConvert.h>
40 #include <visp3/core/vpImageFilter.h>
41 #include <visp3/core/vpRGBa.h>
42 #if defined(VISP_HAVE_OPENCV) && (VISP_HAVE_OPENCV_VERSION >= 0x020408)
43 #include <opencv2/imgproc/imgproc.hpp>
44 #elif defined(VISP_HAVE_OPENCV) && (VISP_HAVE_OPENCV_VERSION >= 0x020101)
45 #include <opencv2/imgproc/imgproc_c.h>
46 #elif defined(VISP_HAVE_OPENCV)
80 unsigned int half_size_y = size_y / 2, half_size_x = size_x / 2;
85 for (
unsigned int i = half_size_y; i < I.
getHeight() - half_size_y; i++) {
86 for (
unsigned int j = half_size_x; j < I.
getWidth() - half_size_x; j++) {
89 for (
unsigned int a = 0; a < size_y; a++) {
90 for (
unsigned int b = 0; b < size_x; b++) {
91 double val = I[i + half_size_y - a][j + half_size_x - b];
92 conv += M[a][b] * val;
99 for (
unsigned int i = half_size_y; i < I.
getHeight() - half_size_y; i++) {
100 for (
unsigned int j = half_size_x; j < I.
getWidth() - half_size_x; j++) {
103 for (
unsigned int a = 0; a < size_y; a++) {
104 for (
unsigned int b = 0; b < size_x; b++) {
105 double val = I[i - half_size_y + a][j - half_size_x + b];
106 corr += M[a][b] * val;
130 unsigned int size = M.
getRows();
131 unsigned int half_size = size / 2;
137 for (
unsigned int v = half_size; v < I.
getHeight() - half_size; v++) {
138 for (
unsigned int u = half_size; u < I.
getWidth() - half_size; u++) {
142 for (
unsigned int a = 0; a < size; a++) {
143 for (
unsigned int b = 0; b < size; b++) {
144 double val = I[v + half_size - a][u + half_size - b];
145 conv_u += M[a][b] * val;
146 conv_v += M[b][a] * val;
154 for (
unsigned int v = half_size; v < I.
getHeight() - half_size; v++) {
155 for (
unsigned int u = half_size; u < I.
getWidth() - half_size; u++) {
159 for (
unsigned int a = 0; a < size; a++) {
160 for (
unsigned int b = 0; b < size; b++) {
161 double val = I[v - half_size + a][u - half_size + b];
162 conv_u += M[a][b] * val;
163 conv_v += M[b][a] * val;
228 unsigned int size = kernelH.
size();
229 unsigned int half_size = size / 2;
234 for (
unsigned int i = 0; i < I.
getHeight(); i++) {
235 for (
unsigned int j = half_size; j < I.
getWidth() - half_size; j++) {
237 for (
unsigned int a = 0; a < kernelH.
size(); a++) {
238 conv += kernelH[a] * I[i][j + half_size - a];
241 I_filter[i][j] = conv;
245 for (
unsigned int i = half_size; i < I.
getHeight() - half_size; i++) {
246 for (
unsigned int j = 0; j < I.
getWidth(); j++) {
248 for (
unsigned int a = 0; a < kernelV.
size(); a++) {
249 conv += kernelV[a] * I_filter[i + half_size - a][j];
257 #if defined(VISP_HAVE_OPENCV) && (VISP_HAVE_OPENCV_VERSION >= 0x020100)
299 unsigned int gaussianFilterSize,
double thresholdCanny,
unsigned int apertureSobel)
301 #if (VISP_HAVE_OPENCV_VERSION < 0x020408)
302 IplImage *img_ipl = NULL;
305 edges_ipl = cvCreateImage(cvSize(img_ipl->width, img_ipl->height), img_ipl->depth, img_ipl->nChannels);
307 cvSmooth(img_ipl, img_ipl, CV_GAUSSIAN, (
int)gaussianFilterSize, (
int)gaussianFilterSize, 0, 0);
308 cvCanny(img_ipl, edges_ipl, thresholdCanny, thresholdCanny, (
int)apertureSobel);
311 cvReleaseImage(&img_ipl);
312 cvReleaseImage(&edges_ipl);
314 cv::Mat img_cvmat, edges_cvmat;
316 cv::GaussianBlur(img_cvmat, img_cvmat, cv::Size((
int)gaussianFilterSize, (
int)gaussianFilterSize), 0, 0);
317 cv::Canny(img_cvmat, edges_cvmat, thresholdCanny, thresholdCanny, (
int)apertureSobel);
350 for (
unsigned int i = 0; i < I.
getHeight(); i++) {
351 for (
unsigned int j = 0; j < (size - 1) / 2; j++) {
355 for (
unsigned int j = (size - 1) / 2; j < I.
getWidth() - (size - 1) / 2; j++) {
358 for (
unsigned int j = I.
getWidth() - (size - 1) / 2; j < I.
getWidth(); j++) {
367 for (
unsigned int i = 0; i < I.
getHeight(); i++) {
368 for (
unsigned int j = 0; j < (size - 1) / 2; j++) {
373 for (
unsigned int j = (size - 1) / 2; j < I.
getWidth() - (size - 1) / 2; j++) {
378 for (
unsigned int j = I.
getWidth() - (size - 1) / 2; j < I.
getWidth(); j++) {
388 for (
unsigned int i = 0; i < I.
getHeight(); i++) {
389 for (
unsigned int j = 0; j < (size - 1) / 2; j++) {
393 for (
unsigned int j = (size - 1) / 2; j < I.
getWidth() - (size - 1) / 2; j++) {
396 for (
unsigned int j = I.
getWidth() - (size - 1) / 2; j < I.
getWidth(); j++) {
406 for (
unsigned int i = 0; i < (size - 1) / 2; i++) {
407 for (
unsigned int j = 0; j < I.
getWidth(); j++) {
411 for (
unsigned int i = (size - 1) / 2; i < I.
getHeight() - (size - 1) / 2; i++) {
412 for (
unsigned int j = 0; j < I.
getWidth(); j++) {
417 for (
unsigned int j = 0; j < I.
getWidth(); j++) {
425 for (
unsigned int i = 0; i < (size - 1) / 2; i++) {
426 for (
unsigned int j = 0; j < I.
getWidth(); j++) {
432 for (
unsigned int i = (size - 1) / 2; i < I.
getHeight() - (size - 1) / 2; i++) {
433 for (
unsigned int j = 0; j < I.
getWidth(); j++) {
440 for (
unsigned int j = 0; j < I.
getWidth(); j++) {
450 for (
unsigned int i = 0; i < (size - 1) / 2; i++) {
451 for (
unsigned int j = 0; j < I.
getWidth(); j++) {
455 for (
unsigned int i = (size - 1) / 2; i < I.
getHeight() - (size - 1) / 2; i++) {
456 for (
unsigned int j = 0; j < I.
getWidth(); j++) {
461 for (
unsigned int j = 0; j < I.
getWidth(); j++) {
482 double *fg =
new double[(size + 1) / 2];
505 double *fg =
new double[(size + 1) / 2];
528 double *fg =
new double[(size + 1) / 2];
559 sigma = (size - 1) / 6.0;
561 int middle = (int)(size - 1) / 2;
563 for (
int i = 0; i <= middle; i++) {
564 filter[i] = (1. / (sigma * sqrt(2. * M_PI))) * exp(-(i * i) / (2. * sigma2));
569 for (
int i = 1; i <= middle; i++) {
574 for (
int i = 0; i <= middle; i++) {
599 sigma = (size - 1) / 6.0;
601 int middle = (int)(size - 1) / 2;
604 for (
int i = 1; i <= middle; i++) {
605 filter[i] = -(1. / (sigma * sqrt(2. * M_PI))) *
606 (exp(-((i + 1) * (i + 1)) / (2. * sigma2)) - exp(-((i - 1) * (i - 1)) / (2. * sigma2))) / 2.;
611 for (
int i = 1; i <= middle; i++) {
612 sum += 2. * (1. / (sigma * sqrt(2. * M_PI))) * exp(-(i * i) / (2. * sigma2));
614 sum += (1. / (sigma * sqrt(2. * M_PI)));
616 for (
int i = 1; i <= middle; i++) {
626 for (
unsigned int i = 0; i < I.
getHeight(); i++) {
627 for (
unsigned int j = 0; j < 3; j++) {
630 for (
unsigned int j = 3; j < I.
getWidth() - 3; j++) {
643 for (
unsigned int i = 0; i < 3; i++) {
644 for (
unsigned int j = 0; j < I.
getWidth(); j++) {
648 for (
unsigned int i = 3; i < I.
getHeight() - 3; i++) {
649 for (
unsigned int j = 0; j < I.
getWidth(); j++) {
654 for (
unsigned int j = 0; j < I.
getWidth(); j++) {
665 for (
unsigned int i = 0; i < I.
getHeight(); i++) {
666 for (
unsigned int j = 0; j < (size - 1) / 2; j++) {
669 for (
unsigned int j = (size - 1) / 2; j < I.
getWidth() - (size - 1) / 2; j++) {
672 for (
unsigned int j = I.
getWidth() - (size - 1) / 2; j < I.
getWidth(); j++) {
681 for (
unsigned int i = 0; i < I.
getHeight(); i++) {
682 for (
unsigned int j = 0; j < (size - 1) / 2; j++) {
685 for (
unsigned int j = (size - 1) / 2; j < I.
getWidth() - (size - 1) / 2; j++) {
688 for (
unsigned int j = I.
getWidth() - (size - 1) / 2; j < I.
getWidth(); j++) {
699 for (
unsigned int i = 0; i < (size - 1) / 2; i++) {
700 for (
unsigned int j = 0; j < I.
getWidth(); j++) {
705 for (
unsigned int i = (size - 1) / 2; i < I.
getHeight() - (size - 1) / 2; i++) {
706 for (
unsigned int j = 0; j < I.
getWidth(); j++) {
712 for (
unsigned int j = 0; j < I.
getWidth(); j++) {
722 for (
unsigned int i = 0; i < (size - 1) / 2; i++) {
723 for (
unsigned int j = 0; j < I.
getWidth(); j++) {
727 for (
unsigned int i = (size - 1) / 2; i < I.
getHeight() - (size - 1) / 2; i++) {
728 for (
unsigned int j = 0; j < I.
getWidth(); j++) {
733 for (
unsigned int j = 0; j < I.
getWidth(); j++) {
749 const double *gaussianDerivativeKernel,
unsigned int size)
766 const double *gaussianDerivativeKernel,
unsigned int size)
777 #if defined(VISP_HAVE_OPENCV) && (VISP_HAVE_OPENCV_VERSION >= 0x030000)
778 cv::Mat imgsrc, imgdest;
780 cv::pyrDown(imgsrc, imgdest, cv::Size((
int)I.
getWidth() / 2, (
int)I.
getHeight() / 2));
782 #elif defined(VISP_HAVE_OPENCV) && (VISP_HAVE_OPENCV_VERSION >= 0x020408)
783 cv::Mat imgsrc, imgdest;
785 cv::pyrDown(imgsrc, imgdest, cvSize((
int)I.
getWidth() / 2, (
int)I.
getHeight() / 2));
787 #elif defined(VISP_HAVE_OPENCV) && (VISP_HAVE_OPENCV_VERSION >= 0x020100)
788 IplImage *imgsrc = NULL;
789 IplImage *imgdest = NULL;
790 imgsrc = cvCreateImage(cvSize((
int)I.
getWidth(), (
int)I.
getHeight()), IPL_DEPTH_8U, 1);
791 imgdest = cvCreateImage(cvSize((
int)I.
getWidth() / 2, (
int)I.
getHeight() / 2), IPL_DEPTH_8U, 1);
793 cvPyrDown(imgsrc, imgdest);
796 cvReleaseImage(&imgsrc);
797 cvReleaseImage(&imgdest);
810 for (
unsigned int i=0 ; i < I.
getHeight() ; i++)
813 for (
unsigned int j=1 ; j < ((I.
getWidth()+1.)/2.)-1 ; j++)
817 GI[i][(int)((I.
getWidth()+1.)/2.)-1]=I[i][2*((
int)((I.
getWidth()+1.)/2.)-1)];
823 for (
unsigned int i = 0; i < I.
getHeight(); i++) {
825 for (
unsigned int j = 1; j < w - 1; j++) {
828 GI[i][w - 1] = I[i][2 * w - 1];
838 for (
unsigned int j = 0; j < I.
getWidth(); j++) {
840 for (
unsigned int i = 1; i < ((I.
getHeight() + 1.) / 2.) - 1; i++) {
843 GI[(int)((I.
getHeight() + 1.) / 2.) - 1][j] = I[2 * ((
int)((I.
getHeight() + 1.) / 2.) - 1)][j];
850 for (
unsigned int j = 0; j < I.
getWidth(); j++) {
852 for (
unsigned int i = 1; i < h - 1; i++) {
855 GI[h - 1][j] = I[2 * h - 1][j];
874 vpMatrix SobelY(size * 2 + 1, size * 2 + 1);
890 static const double SobelY3x3[9] = {-1.0, -2.0, -1.0, 0.0, 0.0, 0.0, 1.0, 2.0, 1.0};
891 static const double SobelY5x5[25] = {-1.0, -4.0, -6.0, -4.0, -1.0, -2.0, -8.0, -12.0, -8.0, -2.0, 0.0, 0.0, 0.0,
892 0.0, 0.0, 2.0, 8.0, 12.0, 8.0, 2.0, 1.0, 4.0, 6.0, 4.0, 1.0};
893 static const double SobelY7x7[49] = {-1, -6, -15, -20, -15, -6, -1, -4, -24, -60, -80, -60, -24, -4, -5, -30, -75,
894 -100, -75, -30, -5, 0, 0, 0, 0, 0, 0, 0, 5, 30, 75, 100, 75, 30,
895 5, 4, 24, 60, 80, 60, 24, 4, 1, 6, 15, 20, 15, 6, 1};
896 const vpMatrix smoothingKernel(3, 3);
897 smoothingKernel[0][0] = 1.0;
898 smoothingKernel[0][1] = 2.0;
899 smoothingKernel[0][2] = 1.0;
900 smoothingKernel[1][0] = 2.0;
901 smoothingKernel[1][1] = 4.0;
902 smoothingKernel[1][2] = 2.0;
903 smoothingKernel[2][0] = 1.0;
904 smoothingKernel[2][1] = 2.0;
905 smoothingKernel[2][2] = 1.0;
912 const unsigned int kernel_size = size * 2 + 1;
913 if (kernel_size == 3) {
914 memcpy(
filter, SobelY3x3, kernel_size * kernel_size *
sizeof(
double));
917 if (kernel_size == 5) {
918 memcpy(
filter, SobelY5x5, kernel_size * kernel_size *
sizeof(
double));
921 if (kernel_size == 7) {
922 memcpy(
filter, SobelY7x7, kernel_size * kernel_size *
sizeof(
double));
928 for (
unsigned int i = 4; i <= size; i++) {
unsigned int getCols() const
Type * data
Address of the first element of the data array.
unsigned int size() const
Return the number of elements of the 2D array.
unsigned int getRows() const
Implementation of column vector and the associated operations.
error that can be emited by ViSP classes.
@ dimensionError
Bad dimension.
static void convert(const vpImage< unsigned char > &src, vpImage< vpRGBa > &dest)
Error that can be emited by the vpImage class and its derivates.
@ incorrectInitializationError
static unsigned char filterGaussXPyramidal(const vpImage< unsigned char > &I, unsigned int i, unsigned int j)
static void filter(const vpImage< double > &I, vpImage< double > &Iu, vpImage< double > &Iv, const vpMatrix &M, bool convolve=false)
static double derivativeFilterY(const vpImage< T > &I, unsigned int r, unsigned int c)
static double filterYTopBorderG(const vpImage< vpRGBa > &I, unsigned int r, unsigned int c, const double *filter, unsigned int size)
static void filterYB(const vpImage< vpRGBa > &I, vpImage< vpRGBa > &dIx, const double *filter, unsigned int size)
static double filterXLeftBorder(const vpImage< unsigned char > &I, unsigned int r, unsigned int c, const double *filter, unsigned int size)
static void filterY(const vpImage< unsigned char > &I, vpImage< double > &dIx, const double *filter, unsigned int size)
static double filterYBottomBorderB(const vpImage< vpRGBa > &I, unsigned int r, unsigned int c, const double *filter, unsigned int size)
static void getGradXGauss2D(const vpImage< unsigned char > &I, vpImage< double > &dIx, const double *gaussianKernel, const double *gaussianDerivativeKernel, unsigned int size)
static double filterYTopBorder(const vpImage< unsigned char > &I, unsigned int r, unsigned int c, const double *filter, unsigned int size)
static void getGaussianDerivativeKernel(double *filter, unsigned int size, double sigma=0., bool normalize=true)
static void getGradX(const vpImage< unsigned char > &I, vpImage< double > &dIx)
static double filterXRightBorderB(const vpImage< vpRGBa > &I, unsigned int r, unsigned int c, const double *filter, unsigned int size)
static double filterYBottomBorderR(const vpImage< vpRGBa > &I, unsigned int r, unsigned int c, const double *filter, unsigned int size)
static double filterYTopBorderB(const vpImage< vpRGBa > &I, unsigned int r, unsigned int c, const double *filter, unsigned int size)
static void filterXB(const vpImage< vpRGBa > &I, vpImage< vpRGBa > &dIx, const double *filter, unsigned int size)
static void filterX(const vpImage< unsigned char > &I, vpImage< double > &dIx, const double *filter, unsigned int size)
static void gaussianBlur(const vpImage< unsigned char > &I, vpImage< double > &GI, unsigned int size=7, double sigma=0., bool normalize=true)
static double filterXLeftBorderB(const vpImage< vpRGBa > &I, unsigned int r, unsigned int c, const double *filter, unsigned int size)
static void filterYR(const vpImage< vpRGBa > &I, vpImage< vpRGBa > &dIx, const double *filter, unsigned int size)
static void sepFilter(const vpImage< unsigned char > &I, vpImage< double > &If, const vpColVector &kernelH, const vpColVector &kernelV)
static double getSobelKernelX(double *filter, unsigned int size)
static double filterXRightBorder(const vpImage< unsigned char > &I, unsigned int r, unsigned int c, const double *filter, unsigned int size)
static double filterYBottomBorder(const vpImage< unsigned char > &I, unsigned int r, unsigned int c, const double *filter, unsigned int size)
static double derivativeFilterX(const vpImage< T > &I, unsigned int r, unsigned int c)
static double filterXLeftBorderR(const vpImage< vpRGBa > &I, unsigned int r, unsigned int c, const double *filter, unsigned int size)
static void getGaussianKernel(double *filter, unsigned int size, double sigma=0., bool normalize=true)
static double getSobelKernelY(double *filter, unsigned int size)
static double filterXLeftBorderG(const vpImage< vpRGBa > &I, unsigned int r, unsigned int c, const double *filter, unsigned int size)
static double filterXRightBorderR(const vpImage< vpRGBa > &I, unsigned int r, unsigned int c, const double *filter, unsigned int size)
static void getGradYGauss2D(const vpImage< unsigned char > &I, vpImage< double > &dIy, const double *gaussianKernel, const double *gaussianDerivativeKernel, unsigned int size)
static void filterXR(const vpImage< vpRGBa > &I, vpImage< vpRGBa > &dIx, const double *filter, unsigned int size)
static void getGaussXPyramidal(const vpImage< unsigned char > &I, vpImage< unsigned char > &GI)
static void canny(const vpImage< unsigned char > &I, vpImage< unsigned char > &Ic, unsigned int gaussianFilterSize, double thresholdCanny, unsigned int apertureSobel)
static double filterYTopBorderR(const vpImage< vpRGBa > &I, unsigned int r, unsigned int c, const double *filter, unsigned int size)
static void filterYG(const vpImage< vpRGBa > &I, vpImage< vpRGBa > &dIx, const double *filter, unsigned int size)
static void getGaussYPyramidal(const vpImage< unsigned char > &I, vpImage< unsigned char > &GI)
static double filterXRightBorderG(const vpImage< vpRGBa > &I, unsigned int r, unsigned int c, const double *filter, unsigned int size)
static void filterXG(const vpImage< vpRGBa > &I, vpImage< vpRGBa > &dIx, const double *filter, unsigned int size)
static void getGradY(const vpImage< unsigned char > &I, vpImage< double > &dIy)
static double filterYBottomBorderG(const vpImage< vpRGBa > &I, unsigned int r, unsigned int c, const double *filter, unsigned int size)
static unsigned char filterGaussYPyramidal(const vpImage< unsigned char > &I, unsigned int i, unsigned int j)
static void getGaussPyramidal(const vpImage< unsigned char > &I, vpImage< unsigned char > &GI)
void destroy()
Destructor : Memory de-allocation.
unsigned int getWidth() const
void resize(unsigned int h, unsigned int w)
resize the image : Image initialization
unsigned int getHeight() const
static double sqr(double x)
Implementation of a matrix and operations on matrices.
static vpMatrix conv2(const vpMatrix &M, const vpMatrix &kernel, const std::string &mode="full")