Quantcast
Channel: OpenCV Q&A Forum - Latest question feed
Viewing all articles
Browse latest Browse all 19555

Segmentation fault on cv::imshow function

$
0
0
Hello every one, here is my function "`optical_flow_using_schunck`". on line "`imshow("frame1", frame1)`" it throws "Segmentation fault (Core dumped)" error. Any idea?! int optical_flow_using_schunck(char * video_url) { int iteration_count = 20 ; double a = 0.001 ; namedWindow("frame1" , CV_WINDOW_AUTOSIZE) ; namedWindow("frame2" , CV_WINDOW_AUTOSIZE) ; cout << "Analyzing motion using Schunck approach for approximating optical flow..." << endl ; cout << "Reading video from " << video_url << endl ; VideoCapture vid (video_url); if(!vid.isOpened()) { cout << "An error has been occured. The video can not be opened!" << endl ; return -1 ; } Mat frame1, frame2 ; vid >> frame1 ; if(!frame1.empty()) vid >> frame2 ; cvtColor(frame1 , frame1 , CV_BGR2GRAY) ; cvtColor(frame2 , frame2 , CV_BGR2GRAY) ; pyrDown(frame1, frame1, Size(frame1.cols/2, frame1.rows/2)) ; pyrDown(frame2, frame2, Size(frame2.cols/2, frame2.rows/2)) ; cout <<"initializing velocity to zero" << endl ; int sz[] = {frame1.rows, frame1.cols}; Mat u(2, sz, CV_32FC1, Scalar::all(0)); Mat v(2, sz, CV_32FC1, Scalar::all(0)); Mat u_avg(2, sz, CV_32FC1, Scalar::all(0)); Mat v_avg(2, sz, CV_32FC1, Scalar::all(0)); Mat Ex(2, sz, CV_32FC1, Scalar::all(0)); Mat Ey(2, sz, CV_32FC1, Scalar::all(0)); Mat Et(2, sz, CV_32FC1, Scalar::all(0)); while(!frame2.empty()) { cout << "calculating Ex derivative..." << endl ; calculate_EX(frame1, frame2, &Ex) ; cout << "calculating Ey derivative..." << endl ; calculate_EY(frame1, frame2, &Ey) ; cout << "calculating Et derivative..." << endl ; calculate_ET(frame1, frame2, &Et) ; if(frame1.empty()) cout << "WOW!" << endl ; imshow("frame1" , frame1) ; imshow("frame2" , frame2) ; for(int iter = 0 ; iter < iteration_count ; iter ++) { cout << "iteration: " << iter << endl ; for(int i = 0 ; i < u.rows ; i ++) { for(int j = 0 ; j < u.cols ; j++) { // cout << "i: " << i << ", j:" << j << endl; double common_part = (Ex.at(i,j)*u_avg.at(i,j) + Ey.at(i,j) * v_avg.at(i,j) + Et.at(i,j) ) / (pow(a,2) + pow(Ex.at(i,j),2) + pow(Ey.at(i,j),2) ) ; double delta_u = ( Ex.at(i,j) * common_part) ; double delta_v = ( Ey.at(i,j) * common_part) ; u.at(i,j) = u_avg.at(i,j) - delta_u ; v.at(i,j) = u_avg.at(i,j) - delta_v ; } } // cout << "u_avg is being updated"<< endl ; update_veloc_avg(u, &u_avg) ; // cout << "u_avg has been updated"<< endl ; update_veloc_avg(v, &v_avg) ; // cout << "v_avg has been updated"<< endl ; // imshow("U_veloc" , u) ; // imshow("V_veloc" , v) ; // waitKey(0) ; } cout << "6" << endl ; frame2.copyTo(frame1(Rect(0, 0, frame2.cols, frame2.rows))); cout << "7" << endl ; vid >> frame2 ; cout << "8" << endl ; cvtColor(frame2 , frame2 , CV_BGR2GRAY) ; cout << "9" << endl ; pyrDown(frame2, frame2, Size(frame2.cols/2, frame2.rows/2)) ; cout << "10" << endl ; waitKey(0) ; } cout << "**************************************************\nSchunk ego motion estimation.\n\n\tTHE VIDEO FINISHED\n**************************************************\n" << endl ; } here are my other functions "`calculate_Ex`", "`calculate_Ey`" , "`calculate_Et`" and "`update_veloc_avg`" . void calculate_EX(Mat frame1, Mat frame2, Mat *E) { for(int i = 0 ; i < E->rows ; i++) { for(int j = 0 ; j < E->cols ; j++) { double res = 0 - (frame1.at(i,j) + frame2.at(i,j)) ; if(j < frame1.cols - 1) res += frame1.at(i,j+1) ; if(j < frame1.cols - 1 && i < frame1.rows - 1) res += frame1.at(i+1,j+1) ; if(i < frame1.rows - 1) res -= frame1.at(i+1,j) ; if(j < frame2.cols - 1) res += frame2.at(i,j+1) ; if(j < frame2.cols - 1 && i < frame2.rows - 1) res += frame2.at(i+1,j+1) ; if(i < frame2.rows - 1) res -= frame2.at(i+1,j) ; res *= 0.25 ; E->at(i,j) = res ; } } } void calculate_EY(Mat frame1, Mat frame2, Mat* E) { // int sz[] = {frame1.rows, frame1.cols}; // Mat E(2, sz, CV_32FC1, Scalar::all(0)); // Mat E = Mat::zeros(frame1.rows , frame1.cols , CV_32FC1) ; for(int i = 0 ; i < E->rows ; i++) { for(int j = 0 ; j < E->cols ; j++) { // cout << "EY: " << i << ", " << j << " in " << frame1.rows << ", " << frame1.cols << endl ; double res = 0 - (frame1.at(i,j) + frame2.at(i,j)) ; if(i < frame1.rows - 1) res += frame1.at(i+1,j) ; if(j < frame1.cols - 1 && i < frame1.rows - 1) res += frame1.at(i+1,j+1) ; if(j < frame1.cols - 1) res -= frame1.at(i,j+1) ; if(i < frame2.rows - 1) res += frame2.at(i+1,j) ; if(j < frame2.cols - 1 && i < frame2.rows - 1) res += frame2.at(i+1,j+1) ; if(j < frame2.cols - 1) res -= frame2.at(i,j+1) ; res *= 0.25 ; E->at(i,j) = res ; } } } void calculate_ET(Mat frame1, Mat frame2, Mat* E) { // int sz[] = {frame1.rows, frame1.cols}; // Mat E(2, sz, CV_32FC1, Scalar::all(0)); // Mat E = Mat::zeros(frame1.rows , frame1.cols , CV_32FC1) ; for(int i = 0 ; i < E->rows ; i++) { for(int j = 0 ; j < E->cols ; j++) { double res = frame2.at(i,j) - frame1.at(i,j) ; if(i < frame2.rows - 1) res += frame2.at(i+1,j) - frame1.at(i+1,j) ; if(j < frame2.cols - 1) res += frame2.at(i,j+1) - frame1.at(i,j+1) ; if(j < frame2.cols - 1 && i < frame2.rows - 1) res += frame2.at(i+1,j+1) - frame1.at(i+1,j+1) ; res *= 0.25 ; E->at(i,j) = res ; } } } void update_veloc_avg(Mat v, Mat* v_avg) { // int sz[] = {v.rows, v.cols}; // Mat v_avg(2, sz, CV_32FC1, Scalar::all(0)); // Mat v_avg = Mat::zeros(v.rows, v.cols, CV_32FC1) ; for(int i = 0 ; i < v_avg->rows ; i++) { for(int j = 0 ; j < v_avg->cols ; j++) { // cout << i << ", " << j << " in " << v.rows << ", " << v.cols << endl ; double res = 0 - v.at(i,j) ; double res1 = 0 , res2 = 0 ; if(i > 0) res1 += v.at(i-1,j) ; if(j < v.cols - 1) res1 += v.at(i,j+1) ; if(i < v.rows - 1) res1 += v.at(i+1,j) ; if(j > 0) res1 += v.at(i,j-1) ; if(i > 0 && j > 0) res2 += v.at(i-1,j-1) ; if(i > 0 && j < v.cols - 1) res2 += v.at(i-1,j+1) ; if((i < (v.rows -1)) && (j < (v.cols -1))) res2 += v.at(i+1,j+1) ; if(i < v.rows -1 && j > 0) res2 += v.at(i+1,j-1) ; res = res + ((double)1/6) * res1 + ((double)1/12) * res2 ; v_avg->at(i,j) = res ; } }

Viewing all articles
Browse latest Browse all 19555

Trending Articles