Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

findFundamentalMatrix and SiftGPU

Hi all!
I'm trying to find the Fundamental Matrix with the findFundamentalMat function. I generate keypoints (x,y) with Sift-GPU.

The matrix I generate is

    0,    0,   0.6   
    0,    0,  -0.3  
 -0.4,  0.2,     0

(Can it be even possible that my diagonal is composed of 0's?) If I use a std::vector<uchar> to look at outliers and inliers, it gives me only 0's (outliers), even if I change the used algorithm.

What I give to the function is 2 vectors composed with (x,y) of all correspondance. (x,y are for example (540, 355)).

/*
... Use siftgpu 
*/
std::vector<int(*)[2]> match_bufs; //Contain (x,y) from the 2 images that are paired
SiftGPU::SiftKeypoint & key1 = keys[match_bufs[i][0]];
SiftGPU::SiftKeypoint & key2 = keys[match_bufs[i][1]];


float x_l, y_l, x_r, y_r; //(x,y of left and right images)
x_l = key1.x; y_l = key1.y;
x_r = key2.x; y_r = key2.y;

vec1.push_back(x_l); vec1.push_back(y_l);
vec2.push_back(x_r); vec2.push_back(y_r); 
std::vector<uchar> results;
int size = vec1.size();
results.resize(size);

std::vector<cv::Point2f> points1(size);
std::vector<cv::Point2f> points2(size);
for (int i = 0; i < size; ++i) {
    points1.push_back(cv::Point2f(vec1[i], vec1[i + 1]));
    points2.push_back(cv::Point2f(vec2[i], vec2[i + 1]));
}

cv::Mat fund = cv::findFundamentalMat(points1, points2, CV_FM_RANSAC, 3, 0.99, results);

I tried to normalize them to make them between [0,1] but it doesn't work neither.
Do I am missing something? Is there something I don't understand in the use of this function? /:

Thanks a lot!

findFundamentalMatrix and SiftGPU

Hi all!
I'm trying to find the Fundamental Matrix with the findFundamentalMat function. I generate keypoints (x,y) with Sift-GPU.

The matrix I generate is

    0,    0,   0.6   
    0,    0,  -0.3  
 -0.4,  0.2,     0

(Can it be even possible that my diagonal is composed of 0's?) If I use a std::vector<uchar> to look at outliers and inliers, it gives me only 0's (outliers), even if I change the used algorithm.

What I give to the function is 2 vectors composed with (x,y) of all correspondance. (x,y are for example (540, 355)).

/*
... Use siftgpu 
*/
std::vector<int(*)[2]> match_bufs; //Contain (x,y) from the 2 images that are paired
SiftGPU::SiftKeypoint & key1 = keys[match_bufs[i][0]];
SiftGPU::SiftKeypoint & key2 = keys[match_bufs[i][1]];


float x_l, y_l, x_r, y_r; //(x,y of left and right images)
x_l = key1.x; y_l = key1.y;
x_r = key2.x; y_r = key2.y;

vec1.push_back(x_l); vec1.push_back(y_l);
vec2.push_back(x_r); vec2.push_back(y_r); 
std::vector<uchar> results;
int size = vec1.size();
results.resize(size);

std::vector<cv::Point2f> points1(size);
points1; //corrected
std::vector<cv::Point2f> points2(size);
points2;
for (int i = 0; i < size; ++i) i+=2) {
    points1.push_back(cv::Point2f(vec1[i], vec1[i + 1]));
    points2.push_back(cv::Point2f(vec2[i], vec2[i + 1]));
}

cv::Mat fund = cv::findFundamentalMat(points1, points2, CV_FM_RANSAC, 3, 0.99, results);

I tried to normalize them to make them between [0,1] but it doesn't work neither.
Do I am missing something? Is there something I don't understand in the use of this function? /:

Thanks a lot!