Go to the documentation of this file.00001
00019 #include "marker_detection.h"
00020 #include <ros/console.h>
00021 #include <opencv2/core/core.hpp>
00022 #include <opencv2/highgui/highgui.hpp>
00023
00024 namespace aruco_marker_recognition {
00025
00026 MarkerDetection::MarkerDetection(double marker_size) : marker_size_(marker_size) {
00027
00028 }
00029
00030 std::vector<aruco::Marker> MarkerDetection::detect(const cv::Mat &image, CameraId id, const ArucoMarkerRecognitionConfig &config) {
00031 aruco::MarkerDetector mDetector;
00032
00033
00034 mDetector.setMinMaxSize(config.minSize, config.maxSize);
00035 switch (config.thresholdMethod) {
00036 case 0:
00037 mDetector.setThresholdMethod(aruco::MarkerDetector::FIXED_THRES);
00038 break;
00039 case 1:
00040 mDetector.setThresholdMethod(aruco::MarkerDetector::ADPT_THRES);
00041 break;
00042 case 2:
00043 mDetector.setThresholdMethod(aruco::MarkerDetector::CANNY);
00044 break;
00045 }
00046 mDetector.setThresholdParams(config.minThreshold, config.maxThreshold);
00047
00048 std::vector<aruco::Marker> markers;
00049 if (id == CameraId::cam_left) {
00050 if (cam_params_left_.isValid()) {
00051 mDetector.detect(image, markers, cam_params_left_, marker_size_);
00052
00053 if (config.showThresholdImage) {
00054
00055
00056 }
00057 ROS_DEBUG_STREAM("Found " << markers.size() << " marker(s) in left camera image");
00058 } else {
00059 ROS_ERROR_STREAM("Left camera parameters (aruco) are not valid");
00060 }
00061 } else {
00062 if (cam_params_right_.isValid()) {
00063 mDetector.detect(image, markers, cam_params_right_, marker_size_);
00064 ROS_DEBUG_STREAM("Found " << markers.size() << " marker(s) in right camera image");
00065 } else {
00066 ROS_ERROR_STREAM("Right camera parameters (aruco) are not valid");
00067 }
00068 }
00069
00070 return markers;
00071 }
00072
00073 void MarkerDetection::setCameraParameters(const sensor_msgs::CameraInfo &cam_params_left, const sensor_msgs::CameraInfo &cam_params_right) {
00074 cv::Mat cameraMatrix(3, 3, CV_32FC1);
00075 cv::Mat distorsionCoeff(4, 1, CV_32FC1);
00076
00077 cv::Size size(cam_params_left.height, cam_params_left.width);
00078 for (int i=0; i<9; ++i) {
00079 cameraMatrix.at<float>(i%3, i-(i%3)*3) = cam_params_left.K[i];
00080 }
00081 if (cam_params_left.D.size() >= 4) {
00082 for (int i=0; i<4; ++i) {
00083 distorsionCoeff.at<float>(i, 0) = cam_params_left.D[i];
00084 }
00085 }
00086 cam_params_left_ = aruco::CameraParameters(cameraMatrix, distorsionCoeff, size);
00087
00088
00089 size = cv::Size(cam_params_right.height, cam_params_right.width);
00090 for (int i=0; i<9; ++i) {
00091 cameraMatrix.at<float>(i%3, i-(i%3)*3) = cam_params_right.K[i];
00092 }
00093 if (cam_params_right.D.size() >= 4) {
00094 for (int i=0; i<4; ++i) {
00095 distorsionCoeff.at<float>(i, 0) = cam_params_right.D[i];
00096 }
00097 }
00098 cam_params_right_ = aruco::CameraParameters(cameraMatrix, distorsionCoeff, size);
00099 }
00100
00101 }
00102