You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
1.7 KiB

// License: Apache 2.0. See LICENSE file in root directory.
// Copyright(c) 2019 Intel Corporation. All Rights Reserved.
#include <rs-vino/detected-object.h>
namespace
{
// Returns <intersection> / <union> of two rectangles ("source" and "destination").
// The higher the quotient (max 1), the more confidence we have that it's the same
// rectangle...
float calcIoU( cv::Rect const & src, cv::Rect const & dst )
{
cv::Rect i = src & dst;
cv::Rect u = src | dst;
return static_cast<float>(i.area()) / static_cast<float>(u.area());
}
}
namespace openvino_helpers
{
detected_object::detected_object(
size_t id,
std::string const & label,
cv::Rect const & location,
cv::Rect const & depth_location,
float intensity,
float depth
)
: _location( location )
, _depth_location( depth_location )
, _intensity( intensity )
, _depth( depth )
, _id( id )
, _label( label )
{
}
detected_object::ptr find_object( cv::Rect rect, detected_objects const & objects )
{
detected_object::ptr face_ptr;
// The more static the face locations, the higher we can set the maxIoU; if a face stays put
// but grows/shrinks (gets closer/farther), the IoU doesn't change much, but if it moves then
// the IoU gets small very fast.
float maxIoU = 0.35f;
for( auto && f : objects )
{
float iou = calcIoU( rect, f->get_location() );
if( iou > maxIoU )
{
face_ptr = f;
maxIoU = iou;
}
}
return face_ptr;
}
}