#include "opencv2/video/tracking.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/videoio/videoio.hpp" #include "opencv2/highgui/highgui.hpp" #include #include #include using namespace cv; using namespace std; class ImageInfoCV : public UMat{ public : ImageInfoCV(int r,int l,int t):UMat(r,l,t) {}; std::vector GradientDericheX(std::vector< ImageInfoCV *>, double alphaDerive,double alphaMoyenne); std::vector GradientDericheY(std::vector< ImageInfoCV *>, double alphaDerive,double alphaMoyenne); }; std::vector ImageInfoCV::GradientDericheX(std::vector< ImageInfoCV *>, double alphaDerive,double alphaMoyenne)//double alphaDerive,double alphaMoyenne) { std::vector r; Mat im1(size(),CV_32FC(channels())); ImageInfoCV *imRes=new ImageInfoCV(rows,cols,CV_32FC(channels())); cv::Mat mThis = getMat(cv::ACCESS_RW); cv::Mat m2 = imRes->getMat(cv::ACCESS_RW); float *f1,*f2; long i,j,nb; long tailleSequence=(rows>cols)?rows:cols; double *g1=new double[tailleSequence],*g2=new double[tailleSequence]; double p=alphaDerive; double k=pow(1-exp(-p),2.0)/(1+2*p*exp(-p)-exp(-2*p)); double kp=pow(1-exp(-p),2.0)/exp(-p); double a1=1,a2=0; double a3=0,a4=0; double a5=0,a6=kp*exp(-p),a7=-kp*exp(-p),a8=0; double b1=0,b3=2*exp(-p); double b2=0,b4=-2*exp(-p); kp=pow(1-exp(-p),2.0)/exp(-p); a1=0,a2=kp*exp(-p),a3=-kp*exp(-p),a4=0; b1=2*exp(-p); b2=-exp(-2*p); switch(depth()){ case CV_8U : { unsigned char *c1; for (nb=0;nb=0;i--,c1-=cols) g2[i] = a3*c1[cols] +a4* c1[2*cols]+ b1*g2[i+1]+b2*g2[i+2]; for (i=0;i=0;i--,c1-=cols) g2[i] = a3*c1[cols] +a4* c1[2*cols]+ b1*g2[i+1]+b2*g2[i+2]; c1 = ((unsigned short*)mThis.ptr(0))+nb+j; for (i=0;i=0;j--,f1--) g2[j] = a7*f1[1]+a8*f1[2]+b3*g2[j+1]+b4*g2[j+2]; for (j=0;j ImageInfoCV::GradientDericheY(std::vector< ImageInfoCV *>, double alphaDerive,double alphaMoyenne) { std::vector r; /* http://www.esiee.fr/~coupriem/Algo/algoima.html */ Mat im1(size(),CV_32FC(channels())); ImageInfoCV *imRes=new ImageInfoCV(rows,cols,CV_32FC(channels())); cv::Mat mThis = getMat(cv::ACCESS_RW); cv::Mat im2 = imRes->getMat(cv::ACCESS_RW); float *f1,*f2; long i,j,nb; long tailleSequence=(rows>cols)?rows:cols; double *g1=new double[tailleSequence],*g2=new double[tailleSequence]; double p=alphaDerive; double k=pow(1-exp(-p),2.0)/(1+2*p*exp(-p)-exp(-2*p)); double kp=pow(1-exp(-p),2.0)/exp(-p); double a1=1,a2=0; double a3=0,a4=0; double a5=0,a6=kp*exp(-p),a7=-kp*exp(-p),a8=0; double b1=0,b3=2*exp(-p); double b2=0,b4=-2*exp(-p); kp=pow(1-exp(-p),2.0)/exp(-p); a1=0,a2=kp*exp(-p),a3=-kp*exp(-p),a4=0; b1=2*exp(-p); b2=-exp(-2*p); switch(depth()){ case CV_8U : case CV_8S : { unsigned char *c1; for (nb=0;nb=0;j--,c1--) g2[j] = a3*c1[1]+a4*c1[2]+b1*g2[j+1]+b2*g2[j+2]; for (j=0;j=0;j--,c1--) g2[j] = a3*c1[1]+a4*c1[2]+b1*g2[j+1]+b2*g2[j+2]; for (j=0;j=0;i--,f1-=cols) g2[i] = a7*f1[cols] +a8* f1[2*cols]+ b3*g2[i+1]+b4*g2[i+2]; for (i=0;i v; v = mm.GradientDericheX(v,1,1); double minVal,maxVal; minMaxLoc(*v[0],&minVal,&maxVal); v[0]->convertTo(m, CV_8U, 255/(maxVal-minVal),-255*minVal/(maxVal-minVal) ) ; imshow("Gx", m); waitKey(); return 0; };