// ================= // || Worksheet 11 // || In this exercise, we are going be solving the 2d wave equation using smoother spatial derivatives. // d^2/dt^2 f(x,y,t) = - k (d^2/dx^2+d^2/dy^2) f(x,y,t) // ================= // see also, e.g. http://www.mtnmath.com/whatrh/node66.html #include "program.h" using namespace std; using namespace cv; int worksheettwelve(Mat& src) { Mat input = Mat::zeros(200,200, CV_32F ); // draw a little circle in the middle of our image. circle(input, Point(input.rows/2, input.cols/2), 25.0f, Scalar( 1.0, 1.0, 1.0 ),CV_FILLED); // a window to show our outputs cv::namedWindow( "current frame", WINDOW_AUTOSIZE ); int MAX_NUMBER_OF_FRAMES = 5000; // dissipation factor. float k = 0.003f; // this is of the initial data Mat prev_frame = input.clone() ; Mat prev_prev_frame = input.clone(); // this is going to be our Laplacian kernel. int krn_sz = 9; cv::Mat kernel = (cv::Mat::zeros(krn_sz, krn_sz, CV_32F)); float T = 1.0f; // set up the kernel for(int i =0; i (i,j) = (1.0/(T*T))*exp( - ((i-4)*(i-4) + (j-4)*(j-4))/T)*(-T + ((i-4)*(i-4) + (j-4)*(j-4))); } } cv::imshow( "current frame", kernel); cv::waitKey(); Mat colorized_frame; // repeat this for each of the frames. for (int n = 0; n < MAX_NUMBER_OF_FRAMES; n++) { // compute kernel convolution; Mat Lframe;// = kernel * prev_frame; cv::filter2D(prev_frame, Lframe, prev_frame.depth(), kernel); // f(t+1) = -f(t-1) + 2 * f(t) - k * L f(t) Mat frame = -prev_prev_frame + 2.0f*prev_frame + k * Lframe; // lets colorize our image too, so that it looks better. frame.convertTo(colorized_frame,CV_8UC1, 127,127); applyColorMap(colorized_frame, colorized_frame,COLORMAP_AUTUMN); // lets also make it 4 times the size, so we dont strain our eyes. resize(colorized_frame,colorized_frame,Size(colorized_frame.cols*4,colorized_frame.rows*4 ) ); // display the current frame. cv::imshow( "current frame", colorized_frame); //wait for 'esc' key press for 300ms. If 'esc' key is pressed, break loop if (waitKey(10) == 27) { cout << "esc key is pressed by user" << endl; break; } // need to update PREVIOUS two frames. !!!!! prev_prev_frame = prev_frame.clone(); prev_frame = frame.clone(); } return 0; }