38 #include <visp3/core/vpImageFilter.h>
39 #include <visp3/core/vpImageConvert.h>
40 #if defined(VISP_HAVE_OPENCV) && (VISP_HAVE_OPENCV_VERSION >= 0x020408)
41 # include <opencv2/imgproc/imgproc.hpp>
42 #elif defined(VISP_HAVE_OPENCV) && (VISP_HAVE_OPENCV_VERSION >= 0x020101)
43 # include <opencv2/imgproc/imgproc_c.h>
44 #elif defined(VISP_HAVE_OPENCV)
62 unsigned int size = M.
getRows() ;
63 unsigned int half_size = size/2 ;
69 for (
unsigned int i=half_size ; i < I.
getHeight()-half_size ; i++)
71 for (
unsigned int j=half_size ; j < I.
getWidth()-half_size ; j++)
75 for(
unsigned int a = 0 ; a < size ; a++ )
76 for(
unsigned int b = 0 ; b < size ; b++ )
78 double val = I[i-half_size+a][j-half_size+b] ;
79 conv_x += M[a][b] * val ;
103 unsigned int size = M.
getRows() ;
104 unsigned int half_size = size/2 ;
111 for (
unsigned int v=half_size ; v < I.
getHeight()-half_size ; v++)
113 for (
unsigned int u=half_size ; u < I.
getWidth()-half_size ; u++)
118 for(
unsigned int a = 0 ; a < size ; a++ )
119 for(
unsigned int b = 0 ; b < size ; b++ )
121 double val = I[v-half_size+a][u-half_size+b] ;
122 conv_u += M[a][b] * val ;
123 conv_v += M[b][a] * val ;
132 #if defined(VISP_HAVE_OPENCV) && (VISP_HAVE_OPENCV_VERSION >= 0x020100)
176 const unsigned int gaussianFilterSize,
177 const double thresholdCanny,
178 const unsigned int apertureSobel)
180 #if (VISP_HAVE_OPENCV_VERSION < 0x020408)
181 IplImage* img_ipl = NULL;
184 edges_ipl = cvCreateImage(cvSize(img_ipl->width, img_ipl->height), img_ipl->depth, img_ipl->nChannels);
186 cvSmooth(img_ipl, img_ipl, CV_GAUSSIAN, (
int)gaussianFilterSize, (
int)gaussianFilterSize, 0, 0);
187 cvCanny(img_ipl, edges_ipl, thresholdCanny, thresholdCanny, (
int)apertureSobel);
190 cvReleaseImage(&img_ipl);
191 cvReleaseImage(&edges_ipl);
193 cv::Mat img_cvmat, edges_cvmat;
195 cv::GaussianBlur(img_cvmat, img_cvmat, cv::Size((
int)gaussianFilterSize, (
int)gaussianFilterSize), 0, 0);
196 cv::Canny(img_cvmat, edges_cvmat, thresholdCanny, thresholdCanny, (
int)apertureSobel);
227 for (
unsigned int i=0 ; i < I.
getHeight() ; i++)
229 for (
unsigned int j=0 ; j < (size-1)/2 ; j++)
234 for (
unsigned int j=(size-1)/2 ; j < I.
getWidth()-(size-1)/2 ; j++)
248 for (
unsigned int i=0 ; i < I.
getHeight() ; i++)
250 for (
unsigned int j=0 ; j < (size-1)/2 ; j++)
255 for (
unsigned int j=(size-1)/2 ; j < I.
getWidth()-(size-1)/2 ; j++)
269 for (
unsigned int i=0 ; i < (size-1)/2 ; i++)
271 for (
unsigned int j=0 ; j < I.
getWidth() ; j++)
276 for (
unsigned int i=(size-1)/2 ; i < I.
getHeight()-(size-1)/2 ; i++)
278 for (
unsigned int j=0 ; j < I.
getWidth() ; j++)
285 for (
unsigned int j=0 ; j < I.
getWidth() ; j++)
294 for (
unsigned int i=0 ; i < (size-1)/2 ; i++)
296 for (
unsigned int j=0 ; j < I.
getWidth() ; j++)
301 for (
unsigned int i=(size-1)/2 ; i < I.
getHeight()-(size-1)/2 ; i++)
303 for (
unsigned int j=0 ; j < I.
getWidth() ; j++)
310 for (
unsigned int j=0 ; j < I.
getWidth() ; j++)
328 double *fg=
new double[(size+1)/2] ;
348 double *fg=
new double[(size+1)/2] ;
370 "Bad Gaussian filter size"));
373 sigma = (size-1)/6.0;
375 int middle = (int)(size-1)/2;
377 for(
int i=0; i<= middle; i++)
379 filter[i] = (1./(sigma*sqrt(2.*M_PI)))*exp(-(i*i)/(2.*sigma2));
384 for(
int i=1; i<=middle; i++)
390 for(
int i=0; i<=middle; i++)
392 filter[i] = filter[i]/sum;
410 "Bad Gaussian filter size"));
413 sigma = (size-1)/6.0;
415 int middle = (int)(size-1)/2;
418 for(
int i=1; i<= middle; i++)
420 filter[i] = -(1./(sigma*sqrt(2.*M_PI)))*(exp(-((i+1)*(i+1))/(2.*sigma2))-exp(-((i-1)*(i-1))/(2.*sigma2)))/2.;
425 for(
int i=1; i<=middle; i++)
427 sum += 2.*(1./(sigma*sqrt(2.*M_PI)))*exp(-(i*i)/(2.*sigma2));
429 sum += (1./(sigma*sqrt(2.*M_PI))) ;
431 for(
int i=1; i<=middle; i++)
433 filter[i] = filter[i]/sum;
443 for (
unsigned int i=0 ; i < I.
getHeight() ; i++)
445 for (
unsigned int j=0 ; j < 3 ; j++)
449 for (
unsigned int j=3 ; j < I.
getWidth()-3 ; j++)
464 for (
unsigned int i=0 ; i < 3 ; i++)
466 for (
unsigned int j=0 ; j < I.
getWidth() ; j++)
471 for (
unsigned int i=3 ; i < I.
getHeight()-3 ; i++)
473 for (
unsigned int j=0 ; j < I.
getWidth() ; j++)
480 for (
unsigned int j=0 ; j < I.
getWidth() ; j++)
491 for (
unsigned int i=0 ; i < I.
getHeight() ; i++)
493 for (
unsigned int j=0 ; j < (size-1)/2 ; j++)
497 for (
unsigned int j=(size-1)/2 ; j < I.
getWidth()-(size-1)/2 ; j++)
511 for (
unsigned int i=0 ; i < I.
getHeight() ; i++)
513 for (
unsigned int j=0 ; j < (size-1)/2 ; j++)
517 for (
unsigned int j=(size-1)/2 ; j < I.
getWidth()-(size-1)/2 ; j++)
532 for (
unsigned int i=0 ; i < (size-1)/2 ; i++)
534 for (
unsigned int j=0 ; j < I.
getWidth() ; j++)
540 for (
unsigned int i=(size-1)/2 ; i < I.
getHeight()-(size-1)/2 ; i++)
542 for (
unsigned int j=0 ; j < I.
getWidth() ; j++)
550 for (
unsigned int j=0 ; j < I.
getWidth() ; j++)
561 for (
unsigned int i=0 ; i < (size-1)/2 ; i++)
563 for (
unsigned int j=0 ; j < I.
getWidth() ; j++)
568 for (
unsigned int i=(size-1)/2 ; i < I.
getHeight()-(size-1)/2 ; i++)
570 for (
unsigned int j=0 ; j < I.
getWidth() ; j++)
577 for (
unsigned int j=0 ; j < I.
getWidth() ; j++)
618 #if defined(VISP_HAVE_OPENCV) && (VISP_HAVE_OPENCV_VERSION >= 0x030000)
619 cv::Mat imgsrc, imgdest;
621 cv::pyrDown( imgsrc, imgdest, cv::Size((
int)I.
getWidth()/2,(int)I.
getHeight()/2));
623 #elif defined(VISP_HAVE_OPENCV) && (VISP_HAVE_OPENCV_VERSION >= 0x020408)
624 cv::Mat imgsrc, imgdest;
628 #elif defined(VISP_HAVE_OPENCV) && (VISP_HAVE_OPENCV_VERSION >= 0x020100)
629 IplImage* imgsrc = NULL;
630 IplImage* imgdest = NULL;
631 imgsrc = cvCreateImage(cvSize((
int)I.
getWidth(),(int)I.
getHeight()), IPL_DEPTH_8U, 1);
632 imgdest = cvCreateImage(cvSize((
int)I.
getWidth()/2,(int)I.
getHeight()/2), IPL_DEPTH_8U, 1);
634 cvPyrDown( imgsrc, imgdest);
637 cvReleaseImage(&imgsrc);
638 cvReleaseImage(&imgdest);
651 for (
unsigned int i=0 ; i < I.
getHeight() ; i++)
654 for (
unsigned int j=1 ; j < ((I.
getWidth()+1.)/2.)-1 ; j++)
658 GI[i][(int)((I.
getWidth()+1.)/2.)-1]=I[i][2*((int)((I.
getWidth()+1.)/2.)-1)];
664 for (
unsigned int i=0 ; i < I.
getHeight() ; i++)
667 for (
unsigned int j=1 ; j < w-1 ; j++)
671 GI[i][w-1]=I[i][2*w-1];
681 for (
unsigned int j=0 ; j < I.
getWidth() ; j++)
684 for (
unsigned int i=1 ; i < ((I.
getHeight()+1.)/2.)-1 ; i++)
695 for (
unsigned int j=0 ; j < I.
getWidth() ; j++)
698 for (
unsigned int i=1 ; i < h-1 ; i++)
702 GI[h-1][j]=I[2*h-1][j];
static void getGaussPyramidal(const vpImage< unsigned char > &I, vpImage< unsigned char > &GI)
Implementation of a matrix and operations on matrices.
static double filterXLeftBorder(const vpImage< unsigned char > &I, unsigned int r, unsigned int c, const double *filter, unsigned int size)
unsigned int getWidth() const
static void convert(const vpImage< unsigned char > &src, vpImage< vpRGBa > &dest)
static void getGradX(const vpImage< unsigned char > &I, vpImage< double > &dIx)
static void getGaussYPyramidal(const vpImage< unsigned char > &I, vpImage< unsigned char > &GI)
static void getGradY(const vpImage< unsigned char > &I, vpImage< double > &dIy)
static double derivativeFilterY(const vpImage< T > &I, const unsigned int r, const unsigned int c)
static void getGaussianKernel(double *filter, unsigned int size, double sigma=0., bool normalize=true)
static unsigned char filterGaussYPyramidal(const vpImage< unsigned char > &I, unsigned int i, unsigned int j)
static void getGradYGauss2D(const vpImage< unsigned char > &I, vpImage< double > &dIy, const double *gaussianKernel, const double *gaussianDerivativeKernel, unsigned int size)
Error that can be emited by the vpImage class and its derivates.
static void getGradXGauss2D(const vpImage< unsigned char > &I, vpImage< double > &dIx, const double *gaussianKernel, const double *gaussianDerivativeKernel, unsigned int size)
static void filterY(const vpImage< unsigned char > &I, vpImage< double > &dIx, const double *filter, unsigned int size)
static void getGaussXPyramidal(const vpImage< unsigned char > &I, vpImage< unsigned char > &GI)
static void filter(const vpImage< double > &I, vpImage< double > &Iu, vpImage< double > &Iv, const vpMatrix &M)
static double sqr(double x)
static void gaussianBlur(const vpImage< unsigned char > &I, vpImage< double > &GI, unsigned int size=7, double sigma=0., bool normalize=true)
static double filterYTopBorder(const vpImage< unsigned char > &I, unsigned int r, unsigned int c, const 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)
void resize(const unsigned int h, const unsigned int w)
set the size of the image without initializing it.
unsigned int getRows() const
Return the number of rows of the 2D array.
static void filterX(const vpImage< unsigned char > &I, vpImage< double > &dIx, const double *filter, unsigned int size)
static void getGaussianDerivativeKernel(double *filter, unsigned int size, double sigma=0., bool normalize=true)
static double filterYBottomBorder(const vpImage< unsigned char > &I, unsigned int r, unsigned int c, const double *filter, unsigned int size)
static unsigned char filterGaussXPyramidal(const vpImage< unsigned char > &I, unsigned int i, unsigned int j)
unsigned int getHeight() const
static void canny(const vpImage< unsigned char > &I, vpImage< unsigned char > &Ic, const unsigned int gaussianFilterSize, const double thresholdCanny, const unsigned int apertureSobel)
static double derivativeFilterX(const vpImage< T > &I, const unsigned int r, const unsigned int c)