SiftGPU 和 opencv::FundamentalMat
SiftGPU and opencv::FundamentalMat
我正在尝试使用 cv::FindFundamentalMat
但是当我尝试获取第 4 个参数时(应该是:
Output array of N elements, every element of which is set to 0 for outliers and to 1 for the other points. The array is computed only in the RANSAC and LMedS methods. For other methods, it is set to all 1’s.
)
它只给我 0。
我正在使用 siftGPU 生成函数中使用的关键点 (x,y)。
我的代码:
/*
... 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;
std::vector<cv::Point2f> points2;
for (int i = 0; i < size; 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);
然后,
std::cout << std::endl << fund << std::endl;
for (int j = 0; j < results.size(); ++j) {
std::cout << (int)results[j];
}
基金是:
0, -0.001, 0.6
0, 0, -0.3
-0.4, 0.2, 0
并且结果仅由 0 组成。
我可能是在自欺欺人,因为 findFundamentalMat 说:
Array of N points from the first image. The point coordinates should be floating-point (single or double precision).
因为我的母语不是英语,所以我可能遗漏了一些东西...我的 (x,y) 就像 (350.0, 560.0)(即浮点数)。但是我是否必须在 [0,1] 之间对它们进行归一化,这就是浮点数的意思?
还是我遗漏了什么?
谢谢!
(EDIT : 我试图标准化我的点(除以各个图像的高度和宽度,但结果仍然是 0)
答案很简单:我必须为模板使用好的格式并很好地转换它。
所以 :
((int)results.at<uchar>(i, 0) == 1)
有效:)
如果对某人有帮助。
我正在尝试使用 cv::FindFundamentalMat
但是当我尝试获取第 4 个参数时(应该是:
Output array of N elements, every element of which is set to 0 for outliers and to 1 for the other points. The array is computed only in the RANSAC and LMedS methods. For other methods, it is set to all 1’s. )
它只给我 0。
我正在使用 siftGPU 生成函数中使用的关键点 (x,y)。
我的代码:
/*
... 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;
std::vector<cv::Point2f> points2;
for (int i = 0; i < size; 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);
然后,
std::cout << std::endl << fund << std::endl;
for (int j = 0; j < results.size(); ++j) {
std::cout << (int)results[j];
}
基金是:
0, -0.001, 0.6
0, 0, -0.3
-0.4, 0.2, 0
并且结果仅由 0 组成。
我可能是在自欺欺人,因为 findFundamentalMat 说:
Array of N points from the first image. The point coordinates should be floating-point (single or double precision).
因为我的母语不是英语,所以我可能遗漏了一些东西...我的 (x,y) 就像 (350.0, 560.0)(即浮点数)。但是我是否必须在 [0,1] 之间对它们进行归一化,这就是浮点数的意思?
还是我遗漏了什么?
谢谢!
(EDIT : 我试图标准化我的点(除以各个图像的高度和宽度,但结果仍然是 0)
答案很简单:我必须为模板使用好的格式并很好地转换它。
所以 :
((int)results.at<uchar>(i, 0) == 1)
有效:)
如果对某人有帮助。