aruco_ros_utils.cpp
Go to the documentation of this file.
2 #include <ros/console.h>
3 #include <ros/assert.h>
4 #include <iostream>
6 #include <opencv2/calib3d.hpp>
7 #include <cv_bridge/cv_bridge.h>
8 
9 aruco::CameraParameters aruco_ros::rosCameraInfo2ArucoCamParams(const sensor_msgs::CameraInfo& cam_info,
10  bool useRectifiedParameters)
11 {
12  cv::Mat cameraMatrix(3, 4, CV_64FC1, 0.0);
13  cv::Mat distorsionCoeff(4, 1, CV_64FC1);
14  cv::Size size(cam_info.width, cam_info.height);
15 
16  if (useRectifiedParameters)
17  {
18  cameraMatrix.setTo(0);
19  cameraMatrix.at<double>(0, 0) = cam_info.P[0];
20  cameraMatrix.at<double>(0, 1) = cam_info.P[1];
21  cameraMatrix.at<double>(0, 2) = cam_info.P[2];
22  cameraMatrix.at<double>(0, 3) = cam_info.P[3];
23  cameraMatrix.at<double>(1, 0) = cam_info.P[4];
24  cameraMatrix.at<double>(1, 1) = cam_info.P[5];
25  cameraMatrix.at<double>(1, 2) = cam_info.P[6];
26  cameraMatrix.at<double>(1, 3) = cam_info.P[7];
27  cameraMatrix.at<double>(2, 0) = cam_info.P[8];
28  cameraMatrix.at<double>(2, 1) = cam_info.P[9];
29  cameraMatrix.at<double>(2, 2) = cam_info.P[10];
30  cameraMatrix.at<double>(2, 3) = cam_info.P[11];
31 
32  for (int i = 0; i < 4; ++i)
33  distorsionCoeff.at<double>(i, 0) = 0;
34  }
35  else
36  {
37  cv::Mat cameraMatrixFromK(3, 3, CV_64FC1, 0.0);
38  for (int i = 0; i < 9; ++i)
39  cameraMatrixFromK.at<double>(i % 3, i - (i % 3) * 3) = cam_info.K[i];
40  cameraMatrixFromK.copyTo(cameraMatrix(cv::Rect(0, 0, 3, 3)));
41 
42 
43  if (cam_info.D.size() == 4)
44  {
45  for (int i = 0; i < 4; ++i)
46  distorsionCoeff.at<double>(i, 0) = cam_info.D[i];
47  }
48  else
49  {
50  ROS_WARN("length of camera_info D vector is not 4, assuming zero distortion...");
51  for (int i = 0; i < 4; ++i)
52  distorsionCoeff.at<double>(i, 0) = 0;
53  }
54  }
55 
56  return aruco::CameraParameters(cameraMatrix, distorsionCoeff, size);
57 }
58 
60 {
61  tf2::Transform tf2_tf = arucoMarker2Tf2(marker);
62  return tf::Transform(
64  tf2_tf.getRotation().y(),
65  tf2_tf.getRotation().z(),
66  tf2_tf.getRotation().w())),
67  tf::Vector3(tf2_tf.getOrigin().x(),
68  tf2_tf.getOrigin().y(),
69  tf2_tf.getOrigin().z()));
70 }
72 {
73  cv::Mat rot(3, 3, CV_64FC1);
74  cv::Mat Rvec64;
75  marker.Rvec.convertTo(Rvec64, CV_64FC1);
76  cv::Rodrigues(Rvec64, rot);
77  cv::Mat tran64;
78  marker.Tvec.convertTo(tran64, CV_64FC1);
79 
80  tf2::Matrix3x3 tf_rot(rot.at<double>(0, 0), rot.at<double>(0, 1), rot.at<double>(0, 2), rot.at<double>(1, 0),
81  rot.at<double>(1, 1), rot.at<double>(1, 2), rot.at<double>(2, 0), rot.at<double>(2, 1),
82  rot.at<double>(2, 2));
83 
84  tf2::Vector3 tf_orig(tran64.at<double>(0, 0), tran64.at<double>(1, 0), tran64.at<double>(2, 0));
85 
86  return tf2::Transform(tf_rot, tf_orig);
87 }
88 
89 
90 std::vector<aruco::Marker> aruco_ros::detectMarkers(const cv::Mat &img, const aruco::CameraParameters &cam_params, float marker_size, aruco::MarkerDetector *detector, bool normalize_ilumination, bool correct_fisheye)
91 {
92  std::vector<aruco::Marker> markers;
93  try
94  {
95  if (normalize_ilumination)
96  {
97  ROS_WARN("normalizeImageIllumination is unimplemented!");
98  // cv::Mat inImageNorm;
99  // pal_vision_util::dctNormalization(inImage, inImageNorm,
100  // dctComponentsToRemove); inImage = inImageNorm;
101  }
102 
103  // detection results will go into "markers"
104  markers.clear();
105  // ok, let's detect
106  if (detector)
107  {
108  detector->detect(img, markers, cam_params, marker_size, false, correct_fisheye);
109  }
110  else
111  {
112  aruco::MarkerDetector default_detector;
113  default_detector.detect(img, markers, cam_params, marker_size, false, correct_fisheye);
114  }
115  return markers;
116  }
117  catch (cv_bridge::Exception& e)
118  {
119  ROS_ERROR("cv_bridge exception: %s", e.what());
120  return markers;
121  }
122 }
123 
124 
125 visualization_msgs::Marker aruco_ros::visMarkerFromPose(const geometry_msgs::PoseStamped &pose, double marker_size, int marker_id)
126 {
127  visualization_msgs::Marker visMarker;
128  visMarker.header = pose.header;
129  visMarker.id = marker_id;
130  visMarker.type = visualization_msgs::Marker::CUBE;
131  visMarker.action = visualization_msgs::Marker::ADD;
132  visMarker.pose = pose.pose;
133  visMarker.scale.x = marker_size;
134  visMarker.scale.y = marker_size;
135  visMarker.scale.z = 0.001;
136  visMarker.color.r = 1.0;
137  visMarker.color.g = 0;
138  visMarker.color.b = 0;
139  visMarker.color.a = 1.0;
140  visMarker.lifetime = ros::Duration(3.0);
141  return visMarker;
142 }
aruco_ros::arucoMarker2Tf2
tf2::Transform arucoMarker2Tf2(const aruco::Marker &marker)
Definition: aruco_ros_utils.cpp:71
tf::Matrix3x3
aruco_ros_utils.h
aruco::CameraParameters
aruco::Marker::Rvec
cv::Mat Rvec
tf2::Transform::getOrigin
TF2SIMD_FORCE_INLINE Vector3 & getOrigin()
cv_bridge::Exception
aruco_ros::detectMarkers
std::vector< aruco::Marker > detectMarkers(const cv::Mat &img, const aruco::CameraParameters &cam_params, float marker_size, aruco::MarkerDetector *detector=nullptr, bool normalize_ilumination=false, bool correct_fisheye=false)
Definition: aruco_ros_utils.cpp:90
aruco::MarkerDetector::detect
std::vector< aruco::Marker > detect(const cv::Mat &input)
console.h
tf2::Transform
tf2::Transform::getRotation
Quaternion getRotation() const
aruco_ros::rosCameraInfo2ArucoCamParams
aruco::CameraParameters rosCameraInfo2ArucoCamParams(const sensor_msgs::CameraInfo &cam_info, bool useRectifiedParameters)
rosCameraInfo2ArucoCamParams gets the camera intrinsics from a CameraInfo message and copies them to ...
Definition: aruco_ros_utils.cpp:9
ROS_WARN
#define ROS_WARN(...)
aruco::Marker
aruco_ros::arucoMarker2Tf
tf::Transform arucoMarker2Tf(const aruco::Marker &marker)
Definition: aruco_ros_utils.cpp:59
tf::Transform
transform_datatypes.h
aruco::MarkerDetector
marker_size
double marker_size
Definition: simple_double.cpp:68
markers
std::vector< aruco::Marker > markers
Definition: simple_double.cpp:57
cv_bridge.h
ROS_ERROR
#define ROS_ERROR(...)
tf2::Matrix3x3
assert.h
ros::Duration
tf::Quaternion
aruco::Marker::Tvec
cv::Mat Tvec
aruco_ros::visMarkerFromPose
visualization_msgs::Marker visMarkerFromPose(const geometry_msgs::PoseStamped &pose, double marker_size, int marker_id=1)
Definition: aruco_ros_utils.cpp:125


aruco_ros
Author(s): Rafael Muñoz Salinas , Bence Magyar
autogenerated on Sat Sep 23 2023 02:26:51