使用opencv,c ++的桑普森距离

Posted

技术标签:

【中文标题】使用opencv,c ++的桑普森距离【英文标题】:Sampson Distance using opencv, c++ 【发布时间】:2016-06-17 16:09:54 【问题描述】:

我正在尝试计算Sampson distance,即从一个点到它对应的极线的距离,稍后我将用作误差度量。我正在使用opencv 3.1c++windows-10 visual studio 14

但是函数 sampsonDistance 会导致代码崩溃:

Point3f point1 = Point3f(keypoints_1[good_matches[iP].queryIdx].pt.x, keypoints_1[good_matches[iP].queryIdx].pt.y, 1.0);
Point3f point2 = Point3f(keypoints_2[good_matches[iP].trainIdx].pt.x, keypoints_2[good_matches[iP].trainIdx].pt.y, 1.0);            

Mat pt1(point1);
Mat pt2(point2);

double sampsonD = sampsonDistance(pt1, pt2, Flist[iF])

我收到错误消息:

OpenCV Error: Assertion failed (_pt1.type() == CV_64F && _pt1.type() == CV_64F && _F.type() == CV_64F) in cv::sampsonDistance, file D:\opencv\sources\modules\calib3d\src\fundam.cpp, line 1043

文档说:

double cv::sampsonDistance  ( InputArray  pt1,  
InputArray  pt2,  
InputArray  F  
) 

如何使用这个函数,我不太了解输入数组的用法,在上面我将一个 3d 点转换为我认为存储为 cv::Mat 的 2D 齐次坐标。基本矩阵存储在 3x3 cv::Mat 中。

【问题讨论】:

【参考方案1】:

从错误信息来看,点和基本矩阵必须是CV_64F(双精度型)。

对于积分,应该是:

Point3d point1 = Point3d(keypoints_1[good_matches[iP].queryIdx].pt.x, keypoints_1[good_matches[iP].queryIdx].pt.y, 1.0);
Point3d point2 = Point3d(keypoints_2[good_matches[iP].trainIdx].pt.x, keypoints_2[good_matches[iP].trainIdx].pt.y, 1.0);

【讨论】:

谢谢,似乎解决了它。

以上是关于使用opencv,c ++的桑普森距离的主要内容,如果未能解决你的问题,请参考以下文章

使用opencv与c ++和c

OpenCV入门(C++/Python)- 使用OpenCV读取和编写视频

[opencv]使用g++编译opencv程序演示

OpenCV 1.x 后端

c ++ opencv在窗口上显示图像

学习使用OpenCV的目标跟踪技术(C ++ / Python)