ObjectDataAngular.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. //
  2. // Created by wrede on 19.05.16.
  3. //
  4. #include <math.h>
  5. #include "ObjectDataAngular.h"
  6. #include "../util/MyMath.h"
  7. namespace core
  8. {
  9. const std::string ObjectDataAngular::CONSTRAINT_ANGULAR_DIFFERENCE = "angular_difference";
  10. ObjectDataAngular::ObjectDataAngular(size_t frame_index,
  11. const cv::Point2d& position,
  12. double angle)
  13. : ObjectData2D(frame_index, position), angle_(angle), angular_weight_(1.0)
  14. {
  15. }
  16. ObjectDataAngular::ObjectDataAngular(size_t frame_index,
  17. const cv::Point2d& position,
  18. double angle,
  19. double temporal_weight,
  20. double spatial_weight,
  21. double angular_weight)
  22. : ObjectData2D(frame_index, position)
  23. {
  24. angle_ = angle;
  25. angular_weight_ = angular_weight;
  26. SetTemporalWeight(temporal_weight);
  27. SetSpatialWeight(spatial_weight);
  28. }
  29. void ObjectDataAngular::SetAngularWeight(double weight)
  30. {
  31. angular_weight_ = weight;
  32. }
  33. double ObjectDataAngular::GetAngle() const
  34. {
  35. return angle_;
  36. }
  37. double ObjectDataAngular::GetAngularWeight() const
  38. {
  39. return angular_weight_;
  40. }
  41. double ObjectDataAngular::CompareTo(ObjectDataPtr obj) const
  42. {
  43. ObjectDataAngularPtr obj_ang =
  44. std::static_pointer_cast<ObjectDataAngular>(obj);
  45. double d_ang = std::abs(obj_ang->angle_ - angle_);
  46. return ObjectData2D::CompareTo(obj) + d_ang * angular_weight_;
  47. }
  48. bool ObjectDataAngular::IsWithinConstraints(ObjectDataPtr obj,
  49. std::unordered_map<std::string, double> & constraints) const
  50. {
  51. if (!ObjectData2D::IsWithinConstraints(obj, constraints))
  52. return false;
  53. ObjectDataAngularPtr obj_ang =
  54. std::static_pointer_cast<ObjectDataAngular>(obj);
  55. if (constraints.count(CONSTRAINT_ANGULAR_DIFFERENCE) > 0) {
  56. double angular_difference = fabs(angle_ - obj_ang->angle_);
  57. if (angular_difference > constraints[CONSTRAINT_ANGULAR_DIFFERENCE]) {
  58. return false;
  59. }
  60. }
  61. return true;
  62. }
  63. ObjectDataPtr ObjectDataAngular::Interpolate(ObjectDataPtr obj,
  64. double fraction) const
  65. {
  66. ObjectData2DPtr obj_in =
  67. std::static_pointer_cast<ObjectData2D>(
  68. ObjectData2D::Interpolate(obj, fraction));
  69. ObjectDataAngularPtr obj_ang =
  70. std::static_pointer_cast<ObjectDataAngular>(obj);
  71. double angle = util::MyMath::Lerp(angle_, obj_ang->angle_, fraction);
  72. ObjectDataAngularPtr obj_out(
  73. new ObjectDataAngular(
  74. obj_in->GetFrameIndex(), obj_in->GetPosition(), angle));
  75. return obj_out;
  76. }
  77. void ObjectDataAngular::Visualize(cv::Mat& image, cv::Scalar& color, double alpha) const
  78. {
  79. double x = GetPosition().x * image.cols;
  80. double y = GetPosition().y * image.rows;
  81. int r = (int) (0.005 * (image.rows + image.cols) * 0.5);
  82. double a_x = x + cos(angle_) * r * 6.0;
  83. double a_y = y + sin(angle_) * r * 6.0;
  84. cv::circle(image, cv::Point2d(x, y), r, color);
  85. cv::line(image, cv::Point2d(x, y), cv::Point2d(a_x, a_y), color);
  86. }
  87. void ObjectDataAngular::Print(std::ostream& os) const
  88. {
  89. os << "ObjectDataAngular{"
  90. << "f:" << GetFrameIndex() << ", "
  91. << "x:" << GetPosition().x << ", "
  92. << "y:" << GetPosition().y << ", "
  93. << "a:" << GetAngle() << "}";
  94. }
  95. std::string ObjectDataAngular::ToString(char delimiter) const
  96. {
  97. return ObjectData2D::ToString(delimiter) + delimiter + std::to_string(angle_);
  98. }
  99. }