opencv surf 对象检测单应边界框

opencv surf Object detection Homography bounding box

Why are we adding Point2f( img_object.cols, 0) to every point in the scene_corners

perspectiveTransform( obj_corners, scene_corners, H);
// Draw lines between the corners (the mapped object in the scene -image_2 )
line( img_matches, scene_corners[0] + Point2f( img_object.cols, 0),  scene_corners[1] + Point2f( img_object.cols, 0), Scalar(0, 255, 0), 4 );
line( img_matches, scene_corners[1] + Point2f( img_object.cols, 0), scene_corners[2] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );
line( img_matches, scene_corners[2] + Point2f( img_object.cols, 0), scene_corners[3] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );
line( img_matches, scene_corners[3] + Point2f( img_object.cols, 0), scene_corners[0] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );`

按照Opencv的surf代码,边界多边形不符合预期:

物体在场景中的方向和距离的限制是多少才能有效识别?

here is the output image

第一个问题: 由于 img_object 被填充到场景图像的左侧,因此场景图像中具有 (x, y) 的像素变为 (x+img_object.cols, y)。因此,您需要添加该偏移量以创建正确的边界框。

关于你的第二个问题:算法的方位和距离的局限性不好说。这取决于很多因素:对象特征、图像分辨率、图像质量等。

在您的案例中,您提到边界多边形与预期不符。但是您期望的边界多边形是什么?我注意到的一件事是您的对象图像并不完全平坦。如果从一个角度看物体图像,生成的单应性看起来很自然。 (如果对象图像是平面的,我认为生成的边界多边形应该具有与该笔记本边缘平行的边界)