これは国境のキーポイントと関係があると思います。検出器はキーポイントを検出しますが、SURF記述子が一貫した値を返すには、周囲のピクセルのブロック内のピクセルデータが必要です。これは、境界ピクセルでは使用できません。次のスニペットを使用して、キーポイントが検出された後、記述子が計算される前に境界点を削除できます。20以上のborderSizeを使用することをお勧めします。
removeBorderKeypoints( vector<cv::KeyPoint>& keypoints, const cv::Size imageSize, const boost::int32_t borderSize )
{
if( borderSize > 0)
{
keypoints.erase( remove_if(keypoints.begin(), keypoints.end(),
RoiPredicatePic((float)borderSize, (float)borderSize,
(float)(imageSize.width - borderSize),
(float)(imageSize.height - borderSize))),
keypoints.end() );
}
}
RoiPredicatePicが実装されている場所:
struct RoiPredicatePic
{
RoiPredicatePic(float _minX, float _minY, float _maxX, float _maxY)
: minX(_minX), minY(_minY), maxX(_maxX), maxY(_maxY)
{}
bool operator()( const cv::KeyPoint& keyPt) const
{
cv::Point2f pt = keyPt.pt;
return (pt.x < minX) || (pt.x >= maxX) || (pt.y < minY) || (pt.y >= maxY);
}
float minX, minY, maxX, maxY;
};
また、近似最近傍インデックスは、画像のペア間で特徴を一致させるための最良の方法ではありません。他のもっと単純なマッチャーを試してみることをお勧めします。