实施Lucas Kanade方法

时间:2016-09-19 19:10:17

标签: opencv matrix

我的代码执行有问题 我正在尝试做这项工作:

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "iostream"

using namespace cv;
using namespace std;


int main( )
{
    Mat src1,src2;
    namedWindow( "corner", CV_WINDOW_AUTOSIZE );
    namedWindow( "result", CV_WINDOW_AUTOSIZE );
    src1 = imread("RGB_32.png", CV_LOAD_IMAGE_COLOR);
    src2 = imread("RGB_33.png", CV_LOAD_IMAGE_COLOR);


//*********************************************************************************
    Mat im1,im2; 

    cvtColor(src1, im1, CV_RGB2GRAY);
    cvtColor(src2, im2, CV_RGB2GRAY);

//******************ReduceImageSizeAndDetectCorner**********************************

    Mat im2c, 
    tmp = im2;
    pyrDown(tmp,im2c,Size( tmp.cols/2, tmp.rows/2));

    Mat dst = Mat::zeros( im2c.size(), CV_32FC1 );
    int blockSize = 3;
    int apertureSize = 3;
    double c = 0.09; 
    cornerHarris(im2c,dst,blockSize, apertureSize, c, BORDER_DEFAULT);

    Mat  dst_norm, dst_norm_scaled;
    normalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );
    convertScaleAbs( dst_norm, dst_norm_scaled );

    int w=23,nb_pt=0,l=0, alpha=143; 
     /// Drawing a circle around corners 
    for( int j = 0+w; j < dst_norm.rows-w ; j++ ){
         for( int i = 0+w; i < dst_norm.cols-w; i++ ){
                    if( (int) dst_norm.at<float>(j,i) > alpha )
                    {
                        circle( im2c, Point( i, j ), 0.5,  Scalar(0,0,255), 4, 8, 0 );
                        nb_pt ++ ; 

                    }
            }
        }

    Mat C= Mat:: zeros(nb_pt,2,CV_32FC1) ; 

    for( int j = 0+w; j < dst_norm.rows-w ; j++ ){
         for( int i = 0+w; i < dst_norm.cols-w; i++ ){
                 if( (int) dst_norm.at<float>(j,i) > alpha ){
                C.at <float> (l,0)=j; 
                C.at <float> (l,1)=i;
                l++;    
                    }
            }
        }

    C=2*C; 

//******************ImplementLucas&KanadeMethod**************************************
Mat1f Cx,Cy; 
Mat Ix_m,Iy_m,It_m,It1,It2;


Cx = (Mat_<float>(2,2) << -1,1,-1,1);
Cy= (Mat_<float>(2,2) << -1,-1,1,1);
Mat Ct1 = (Mat_<float>(2,2) << -1,-1,-1,-1);
Mat Ct2 = Mat::ones( 2, 2, CV_8U );

filter2D(im1,Ix_m,-1,Cx,Point(-1,-1),0,BORDER_DEFAULT); 
filter2D(im1,Iy_m,-1,Cy,Point(-1,-1),0,BORDER_DEFAULT); 
filter2D(im1,It1,-1,Ct1,Point(-1,-1),0,BORDER_DEFAULT); 
filter2D(im1,It2,-1,Ct2,Point(-1,-1),0,BORDER_DEFAULT); 
add(It1,It2,It_m); 

//initialiser le flot
//Mat u = Mat::zeros( 1, nb_pt, CV_32FC1 );     
//Mat v = Mat::zeros( 1, nb_pt, CV_32FC1 ); 

Mat Ix,Ixd,Iy,Iyd,It,Itd,b,nu,A;  
int u,v ;  
cv::Scalar color(0,0,255); 
int size = 10 ; 
int thickness = 10 ; 

for (int k=0 ; k < nb_pt ; ++k) {  
    int j= C.at <float> (k,0); 
    int i= C.at <float> (k,1);
    Ix= Ix_m(Range(j-w,j+w),Range(i-w,i+w)); 
    Iy= Iy_m(Range(j-w,j+w),Range(i-w,i+w)); 
    It= It_m(Range(j-w,j+w),Range(i-w,i+w));
    redim(Ix,Ixd); 
    redim(Iy,Iyd); 
    redim(It,Itd); 
    multi(Itd,b);
    funct(Ixd,Iyd,A); 
    Mat inv = A.inv(DECOMP_SVD); 
    nu = inv * b ; 
    u= nu.at<float> (0,0); 
    v= nu.at<float> (0,1); 
    //cout << "u = "<< u << endl ;
    //cout << "v = "<< v << endl ;
    cvQuiver(src2,i,j,u,v,color, size, thickness); 
}
    imshow( "result", src2 );*/

waitKey(); 

}

我的for循环有问题。 k = 2时,我收到错误"core dumped"。但是,当我逐个运行代码时,也就是说我接受案例k=0然后k=1,2,...,它就可以了。

请帮忙吗? when k=2

0 个答案:

没有答案