35 #include "opencv2/opencv.hpp" 36 #include <opencv2/highgui/highgui.hpp> 41 int main(
int argc,
char **argv) {
42 ros::init(argc, argv,
"arPoseEstimation");
50 idFiducialDetectionSubscriber_(n_,
"idFiducials", 100),
51 ellipseFiducialDetectionSubscriber_(n_,
"ellipseFiducials", 100),
52 sync_(idFiducialDetectionSubscriber_, ellipseFiducialDetectionSubscriber_, 10){
63 const marker_msgs::FiducialDetection::ConstPtr &msgEllipseFiducialDetection){
67 float camera_matrix_data[9];
68 for (
int i = 0; i < 9; i++)
69 camera_matrix_data[i] = msgIdFiducialDetection->camera_k[i];
70 cv::Mat camera_k = cv::Mat(3, 3, CV_32F, camera_matrix_data);
72 float distortion_coefficients_data[5];
73 for (
int i = 0; i < 5; i++)
74 distortion_coefficients_data[i] = msgIdFiducialDetection->camera_d[i];
75 cv::Mat camera_d = cv::Mat(1, 5, CV_32F, distortion_coefficients_data);
77 std::vector<MarkerFiducials> idFiducials;
78 for (
auto &fiducial:msgIdFiducialDetection->fiducial) {
81 for (
auto &object_point:fiducial.object_points)
82 mFiducial.
object_points.push_back(cv::Point3f(object_point.x, object_point.y, object_point.z));
84 for (
auto &image_point:fiducial.image_points)
85 mFiducial.
image_points.push_back(cv::Point2f(image_point.x, image_point.y));
87 idFiducials.push_back(mFiducial);
90 std::vector<MarkerFiducials> ellipseFiducials;
91 for (
auto &fiducial:msgEllipseFiducialDetection->fiducial) {
94 for (
auto &object_point:fiducial.object_points)
95 mFiducial.
object_points.push_back(cv::Point3f(object_point.x, object_point.y, object_point.z));
97 for (
auto &image_point:fiducial.image_points)
98 mFiducial.
image_points.push_back(cv::Point2f(image_point.x, image_point.y));
100 ellipseFiducials.push_back(mFiducial);
105 std::vector<MarkerPose> markerPoses;
107 estimator.
estimatePose(idFiducials, camera_k, camera_d, ellipseFiducials, markerPoses);
114 cv::Mat debugImage = cv::Mat(480, 640, CV_32FC3, cv::Scalar(255, 255, 255));
116 for (
auto &markerPose:markerPoses) {
117 cv::Mat objectPoints(4, 3, CV_32FC1);
118 float axis_size = 0.08f;
119 objectPoints.at<
float >(0, 0) = 0;
120 objectPoints.at<
float >(0, 1) = 0;
121 objectPoints.at<
float >(0, 2) = 0;
122 objectPoints.at<
float >(1, 0) = axis_size;
123 objectPoints.at<
float >(1, 1) = 0;
124 objectPoints.at<
float >(1, 2) = 0;
125 objectPoints.at<
float >(2, 0) = 0;
126 objectPoints.at<
float >(2, 1) = axis_size;
127 objectPoints.at<
float >(2, 2) = 0;
128 objectPoints.at<
float >(3, 0) = 0;
129 objectPoints.at<
float >(3, 1) = 0;
130 objectPoints.at<
float >(3, 2) = axis_size;
132 std::vector<cv::Point2f> imagePoints;
133 cv::projectPoints(objectPoints, markerPose.getRVec(), markerPose.getTVec(), camera_k, camera_d, imagePoints);
136 cv::line(debugImage, imagePoints[0], imagePoints[1], cv::Scalar(0, 0, 255, 255), 1, CV_AA);
137 cv::line(debugImage, imagePoints[0], imagePoints[2], cv::Scalar(0, 255, 0, 255), 1, CV_AA);
138 cv::line(debugImage, imagePoints[0], imagePoints[3], cv::Scalar(255, 0, 0, 255), 1, CV_AA);
161 std::vector<MarkerPose> idMarkerPoses;
163 std::vector<MarkerFiducials> markers;
164 for (
auto &fiducial:msgIdFiducialDetection->fiducial) {
167 for (
auto &object_point:fiducial.object_points)
168 marker.
object_points.push_back(cv::Point3f(object_point.x, object_point.y, object_point.z));
170 for (
auto &image_point:fiducial.image_points)
171 marker.
image_points.push_back(cv::Point2f(image_point.x, image_point.y));
173 markers.push_back(marker);
178 idPoseEstimation.
estimatePose(markers, camera_k, camera_d, idMarkerPoses);
180 for (
auto &markerPose:idMarkerPoses) {
181 ROS_INFO(
"marker[%d]", markerPose.ids[0]);
184 std::vector<cv::Point3f> objectPoints;
185 objectPoints.push_back(cv::Point3f(0.0
f, 0.0
f, 0.0
f));
186 objectPoints.push_back(cv::Point3f(0.055
f, 0.0
f, 0.0
f));
187 objectPoints.push_back(cv::Point3f(0.00
f, 0.055
f, 0.0
f));
188 objectPoints.push_back(cv::Point3f(-0.055
f, 0.0
f, 0.0
f));
189 objectPoints.push_back(cv::Point3f(0.00
f, -0.055
f, 0.0
f));
191 std::vector<cv::Point2f> imagePoints;
192 cv::projectPoints(objectPoints, markerPose.getRVec(), markerPose.getTVec(), camera_k, camera_d, imagePoints);
194 cv::line(debugImage, imagePoints[0], imagePoints[1], cv::Scalar(0, 0, 255, 255), 1, CV_AA);
195 cv::line(debugImage, imagePoints[0], imagePoints[2], cv::Scalar(0, 0, 255, 255), 1, CV_AA);
196 cv::line(debugImage, imagePoints[0], imagePoints[3], cv::Scalar(0, 0, 255, 255), 1, CV_AA);
197 cv::line(debugImage, imagePoints[0], imagePoints[4], cv::Scalar(0, 0, 255, 255), 1, CV_AA);
202 int circleRadius = 5;
203 cv::circle(debugImage, imagePoints[1], circleRadius, cv::Scalar(0, 0, 255, 255), 1, CV_AA);
204 cv::circle(debugImage, imagePoints[2], circleRadius, cv::Scalar(0, 0, 255, 255), 1, CV_AA);
205 cv::circle(debugImage, imagePoints[3], circleRadius, cv::Scalar(0, 0, 255, 255), 1, CV_AA);
206 cv::circle(debugImage, imagePoints[4], circleRadius, cv::Scalar(0, 0, 255, 255), 1, CV_AA);
237 for (
auto &fiducial:msgEllipseFiducialDetection->fiducial) {
238 cv::circle(debugImage, cv::Point2f(fiducial.image_points[0].x, fiducial.image_points[0].y), 5, cv::Scalar(0, 0, 0, 255), 1, CV_AA);
241 cv::imshow(
"combomarker_node_debug", debugImage);
256 m.at<
float>(0, 0), m.at<
float>(0, 1), m.at<
float>(0, 2),
257 m.at<
float>(1, 0), m.at<
float>(1, 1), m.at<
float>(1, 2),
258 m.at<
float>(2, 0), m.at<
float>(2, 1), m.at<
float>(2, 2)
261 char markerLabel[64];
262 if (markerPose.
ids.size() > 0) {
263 sprintf(markerLabel,
"t%i", markerPose.
ids[0]);
265 sprintf(markerLabel,
"t?");
271 marker_msgs::MarkerDetection msg;
274 msg.distance_min = 0;
275 msg.distance_max = 8;
276 msg.distance_max_id = 5;
277 msg.view_direction.x = 0;
278 msg.view_direction.y = 0;
279 msg.view_direction.z = 0;
280 msg.view_direction.w = 1;
281 msg.fov_horizontal = 6;
282 msg.fov_vertical = 0;
284 msg.markers = marker_msgs::MarkerDetection::_markers_type();
286 for (
auto &markerPose:markerPoses) {
294 marker_msgs::Marker marker;
296 marker.ids = markerPose.ids;
297 marker.ids_confidence = markerPose.ids_confidence;
300 msg.markers.push_back(marker);
void publish(const boost::shared_ptr< M > &message) const
void publishMarkers(const std_msgs::Header &header, std::vector< MarkerPose > &markerPoses)
void estimatePose(std::vector< MarkerFiducials > &idFiducials, cv::Mat &camera_k, cv::Mat &camera_d, std::vector< MarkerFiducials > &ellipseFiducials, std::vector< MarkerPose > &markerPoses)
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
message_filters::TimeSynchronizer< marker_msgs::FiducialDetection, marker_msgs::FiducialDetection > sync_
void synchronizedFiducialsCallback(const marker_msgs::FiducialDetection::ConstPtr &msgIdFiducialDetection, const marker_msgs::FiducialDetection::ConstPtr &msgEllipseFiducialDetection)
ROSCPP_DECL void spin(Spinner &spinner)
Connection registerCallback(C &callback)
PoseEstimationComboMarkerNode(ros::NodeHandle &n)
static tf::StampedTransform markerPoseToStampedTransform(MarkerPose &markerPose, const std_msgs::Header &header)
int main(int argc, char **argv)
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
void estimatePose(std::vector< MarkerFiducials > &markers, cv::Mat &camera_k, cv::Mat &camera_d, std::vector< MarkerPose > &markerPoses)
std::vector< cv::Point3f > object_points
static void poseTFToMsg(const Pose &bt, geometry_msgs::Pose &msg)
tf::TransformBroadcaster transformBroadcaster_
std::vector< cv::Point2f > image_points
ros::Publisher pub_markers_
~PoseEstimationComboMarkerNode()