访问中介
http://blog.csdn.net/scottly1/article/details/42705271
http://photo.163.com/381223380@qq.com/#m=1&aid=248662080&p=1
http://www.opencv.org.cn/forum.php?mod=viewthread&tid=23388
http://breckon.eu/toby/demos/crossstereo/
http://max.book118.com/html/2014/0410/7500229.shtm
#include <opencv2/opencv_lib.h> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; #include <sstream> #include <string> template<typename T> string IntToString(T num) { stringstream ss; string s; ss << num; ss >> s; return s; } struct callparamter{ Point pt; string window_name; string trackbar_name; vector<Mat> src; vector<Mat> dst; Mat blurresult; Mat disp; float focus_dist; float k; float freal; float pixelsize; float T; int Rmax; int F; }; callparamter ptr; float GetDist(float f, float pixelsize, float T, int disp) { float z = f * T *1000 / pixelsize / disp; return z; } void getfiled(float &nerafield, float &farfield, float &sumfield, const float det, const float f, const float F, const float L) { nerafield = F*det*L*L; farfield = nerafield; nerafield = nerafield / (f*f + F*det*L); farfield = farfield / (f*f - F*det*L); sumfield = farfield + nerafield; } void BlurRidus(float nerafield, float farfield, float L,const float dst, float &R) { nerafield = L - nerafield; farfield = L + farfield; if (dst < farfield && dst >nerafield ) { R = 0; } } void GetBlurImg(const vector<Mat> &img, vector<Mat> &blurresult, const Mat &disp, const float focus_dist,const float k, const float freal, const float pixelsize, const float T, const int Rmax, const float F) { float u0 = focus_dist;//mm float det = 0.019; int a = 1; int feq = a * 50; int A = 43; float nerafield, farfield, sumfield; getfiled(nerafield,farfield,sumfield,det, feq, F, u0); int stepmax = (int)(Rmax/2)+1; int m = img[0].rows; int n = img[0].cols; int nchannels = img.size(); for (int c = 0; c< nchannels; ++c) { //Mat temp = img[c].clone(); //Mat disttemp = blurresult[c].clone(); for(int i = stepmax-1; i < m-stepmax; ++i) { for(int j = stepmax-1; j < n-stepmax; ++j) { int dispdiff = disp.at<uchar>(i,j); float u = GetDist(freal, pixelsize, T, dispdiff); if(u > 2000) { u = 2000; } float B = a/F *abs((u0*(u-a*A)/(u*(u0-a*A)) - 1)); BlurRidus(nerafield, farfield,u0, u, B); B = B*100; int R = (int)(k*log(B+1))*2 +1; int step = (int)(R/2); Mat sub = img[c](Range(i-step, i+step+1),Range(j-step, j+step+1)); blurresult[c].at<uchar>(i,j) = cv::sum(sub)[0]/(R*R); } } //blurresult[c] = disttemp.clone(); } } float GetMaxCoef(float umax) { float u0[1] = {0.2*1000}; float det = 0.019; float a = 1; float f = a * 50; float A = 43; float F = 1.0; float u = umax; u = u*1000; float R ; for(int i = 0; i< 1; ++i) { float nerafield, farfield, sumfield; getfiled(nerafield, farfield, sumfield,det, f, F, u0[i]); R = a/F *abs((u0[i]*(u-a*A)/(u*(u0[i]-a*A)) - 1)); BlurRidus(nerafield, farfield,u0[i], u,R); R *= 100; } int MaxCoefficient = (int)(R); return MaxCoefficient; } void BGblur_Demo(int F, void *param) { //callparamter *ptr = (callparamter*) param; GetBlurImg(ptr.src,ptr.dst, ptr.disp, ptr.focus_dist, ptr.k, ptr.freal, ptr.pixelsize, ptr.T,ptr.Rmax,ptr.F); merge(ptr.dst, ptr.blurresult); imshow(ptr.window_name, ptr.blurresult); ptr.F = getTrackbarPos(ptr.trackbar_name, ptr.window_name); cout << "F: "<< ptr.F << endl; } void on_mouse(int event,int x,int y,int flags,void *ustc) { static Point pre_pt = (-1,-1); static Point cur_pt = (-1,-1); char temp[16]; if (event == CV_EVENT_LBUTTONDOWN) { sprintf(temp,"(%d,%d)",x,y); pre_pt = Point(x,y); putText(ptr.blurresult,temp,pre_pt,FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,0,255),1,8); circle(ptr.blurresult,pre_pt,2,Scalar(255,0,0,0),CV_FILLED,CV_AA,0); imshow(ptr.window_name,ptr.blurresult); ptr.pt.x = x; ptr.pt.y = y; cout << "pos:" << ptr.pt.x << " " << ptr.pt.y << endl; } } void integral(unsigned char* inputMatrix, unsigned int* outputMatrix, int width, int height) { unsigned int *columnSum = new unsigned int[width]; // sum of each column // calculate integral of the first line for(int i=0;i<width;i++) { outputMatrix[i] = inputMatrix[i]; if(i>0) { outputMatrix[i] += outputMatrix[i-1]; } } for (int i=1;i<height;i++) { int offset = i*width; // first column of each line columnSum[0] +=inputMatrix[offset]; outputMatrix[offset] = columnSum[0]; // other columns for(int j=1;j<width;j++) { columnSum[j] += inputMatrix[offset+j]; outputMatrix[offset+j] = outputMatrix[offset+j-1] + columnSum[j]; } } delete []columnSum; } void main() { uchar a[5][5] = { {17 , 24 , 1 , 8, 15}, {23 , 5 , 7 , 14 , 16}, {4 , 6 , 13 , 20 , 22}, {10, 12 , 19 , 21, 3}, {11 , 18 , 25 , 2 , 9}, }; Mat src(5,5,CV_8UC1,&a); uchar *data = src.data; unsigned int *dst = new unsigned int[5*5]; integral(data, dst, 5,5); for (int i =0; i < 5; ++i) { for (int j = 0 ; j < 5; ++j) { cout << dst[i * 5 +j] << " "; } cout << endl; } // Mat integralimg(5,5,CV_32SC1, &dst); // cout << src <<endl; // cout << integralimg <<endl; delete []dst; } void main1() { Mat img = imread("left.jpg",1); string str = "dist.bmp"; Mat disp = imread(str,0); //track string window_name = "win"; string trackbar_name = "Fvalue"; int Fparamter = 1; int maxF = 5; float umax = 2.5; float Rmax = 21; float MaxCoefficient = GetMaxCoef(umax); float k = (Rmax-1)/ 2 /log(MaxCoefficient+1); float det = 0.019; int a = 1; int f = a * 50; int A = 43; float F = Fparamter; float u = umax; u = u*1000; float freal = 4.6; float pixelsize = 4.468; int m = img.rows; int n = img.cols; float T = 11* n / 1280.0; Mat blurresult = img.clone(); vector<Mat> src(3); split(img, src); vector<Mat> dst(3); split(blurresult, dst); //mouseclick setMouseCallback(ptr.window_name, on_mouse,0); int x = 440; int y = 272; int dispdiff = disp.at<uchar>(y,x); float focus_dist = GetDist(freal, pixelsize, T, dispdiff); ptr.window_name =window_name; ptr.trackbar_name = trackbar_name; ptr.src = src; ptr.focus_dist = focus_dist; ptr.F = Fparamter; ptr.k = k; ptr.pixelsize = pixelsize; ptr.Rmax = Rmax; ptr.freal = freal; ptr.T = T; ptr.disp = disp; ptr.dst = dst; ptr.blurresult = blurresult; namedWindow(window_name,1); createTrackbar( trackbar_name, window_name, &Fparamter, maxF, BGblur_Demo ); BGblur_Demo(Fparamter, (void*)(&ptr)); for(;;) { int c; c = waitKey( 20 ); if( (char)c == 27 ) { break; } } }