{"action":"created","comment":{"url":"https://api.github.com/repos/ethz-asl/image_undistort/pulls/comments/90641452","pull_request_review_id":11159068,"id":90641452,"diff_hunk":"@@ -0,0 +1,265 @@\n+#include \"image_undistort/stereo_undistort.h\"\n+#include \"image_undistort/camera_parameters.h\"\n+\n+namespace image_undistort {\n+\n+// needed so that topic filters can be initalized in the constructor\n+int StereoUndistort::getQueueSize() {\n+  int queue_size;\n+  nh_private_.param(\"queue_size\", queue_size, kQueueSize);\n+  if (queue_size < 1) {\n+    ROS_ERROR(\"Queue size must be >= 1, setting to 1\");\n+    queue_size = 1;\n+  }\n+  return queue_size;\n+}\n+\n+StereoUndistort::StereoUndistort(const ros::NodeHandle& nh,\n+                                 const ros::NodeHandle& nh_private)\n+    : nh_(nh),\n+      nh_private_(nh_private),\n+      it_(nh_),\n+      queue_size_(getQueueSize()),\n+      left_image_sub_(it_, \"raw/left/image\", queue_size_),\n+      right_image_sub_(it_, \"raw/right/image\", queue_size_),\n+      left_undistorter_ptr_(nullptr),\n+      right_undistorter_ptr_(nullptr),\n+      frame_counter_(0) {\n+  // set parameters from ros\n+  nh_private_.param(\"input_camera_info_from_ros_params\",\n+                    input_camera_info_from_ros_params_,\n+                    kDefaultInputCameraInfoFromROSParams);\n+\n+  nh_private_.param(\"rename_radtan_plumb_bob\", rename_radtan_plumb_bob_,\n+                    kDefaultRenameRadtanPlumbBob);\n+\n+  nh_private_.param(\"queue_size\", queue_size_, kQueueSize);\n+  if (queue_size_ < 1) {\n+    ROS_ERROR(\"Queue size must be >= 1, setting to 1\");\n+    queue_size_ = 1;\n+  }\n+\n+  double scale;\n+  nh_private_.param(\"scale\", scale, kDefaultScale);\n+\n+  stereo_camera_parameters_ptr_ =\n+      std::make_shared<StereoCameraParameters>(scale);\n+\n+  nh_private_.param(\"process_every_nth_frame\", process_every_nth_frame_,\n+                    kDefaultProcessEveryNthFrame);\n+  nh_private_.param(\"output_image_type\", output_image_type_,\n+                    kDefaultOutputImageType);\n+  // check output type string is correctly formatted\n+  if (!output_image_type_.empty()) {\n+    try {\n+      cv_bridge::getCvType(output_image_type_);\n+    } catch (const cv_bridge::Exception& e) {\n+      ROS_ERROR_STREAM(\n+          \"cv_bridge error while setting output_image_type, output will match \"\n+          \"input type. \"\n+          << e.what());\n+      output_image_type_ = \"\";\n+    }\n+  }\n+\n+  nh_private_.param(\"publish_tf\", publish_tf_, kDefaultPublishTF);\n+  nh_private_.param(\"output_frame\", output_frame_, kDefaultOutputFrame);\n+\n+  // setup publishers\n+  left_camera_info_output_pub_ = nh_.advertise<sensor_msgs::CameraInfo>(\n+      \"rect/left/camera_info\", queue_size_);\n+  right_camera_info_output_pub_ = nh_.advertise<sensor_msgs::CameraInfo>(\n+      \"rect/right/camera_info\", queue_size_);\n+  left_image_pub_ = it_.advertise(\"rect/left/image\", queue_size_);\n+  right_image_pub_ = it_.advertise(\"rect/right/image\", queue_size_);\n+\n+  // setup subscribers (must be done last as it appears image filters allow a\n+  // subscriber to be called as soon as it is created, even if this constructor\n+  // is not finished)\n+  if (input_camera_info_from_ros_params_) {\n+    std::string left_camera_namespace, right_camera_namespace;\n+    nh_private_.param(\"left_camera_namespace\", left_camera_namespace,\n+                      kDefaultLeftCameraNamespace);\n+    nh_private_.param(\"right_camera_namespace\", right_camera_namespace,\n+                      kDefaultRightCameraNamespace);\n+    if (!stereo_camera_parameters_ptr_->setInputCameraParameters(\n+            nh_private_, left_camera_namespace, true) ||\n+        !stereo_camera_parameters_ptr_->setInputCameraParameters(\n+            nh_private_, right_camera_namespace, false)) {\n+      ROS_FATAL(\"Loading of input camera parameters failed, exiting\");\n+      ros::shutdown();\n+      exit(EXIT_FAILURE);\n+    }\n+\n+    left_camera_info_input_pub_ = nh_.advertise<sensor_msgs::CameraInfo>(\n+        \"raw/left/camera_info\", queue_size_);\n+    right_camera_info_input_pub_ = nh_.advertise<sensor_msgs::CameraInfo>(\n+        \"raw/right/camera_info\", queue_size_);\n+\n+    image_sync_ptr_ =\n+        std::make_shared<message_filters::Synchronizer<ImageSyncPolicy>>(\n+            ImageSyncPolicy(queue_size_), left_image_sub_, right_image_sub_);\n+    image_sync_ptr_->registerCallback(\n+        boost::bind(&StereoUndistort::imagesCallback, this, _1, _2));\n+\n+  } else {\n+    left_camera_info_sub_ptr_ =\n+        std::make_shared<message_filters::Subscriber<sensor_msgs::CameraInfo>>(\n+            nh_, \"raw/left/camera_info\", queue_size_);\n+    right_camera_info_sub_ptr_ =\n+        std::make_shared<message_filters::Subscriber<sensor_msgs::CameraInfo>>(\n+            nh_, \"raw/right/camera_info\", queue_size_);\n+\n+    camera_sync_ptr_ =\n+        std::make_shared<message_filters::Synchronizer<CameraSyncPolicy>>(\n+            CameraSyncPolicy(queue_size_), left_image_sub_, right_image_sub_,\n+            *left_camera_info_sub_ptr_, *right_camera_info_sub_ptr_);\n+    camera_sync_ptr_->registerCallback(\n+        boost::bind(&StereoUndistort::camerasCallback, this, _1, _2, _3, _4));\n+  }\n+}\n+\n+void StereoUndistort::updateUndistorter(bool left) {\n+  std::shared_ptr<Undistorter>* undistorter_ptr_ptr;\n+  CameraParametersPair camera_parameters_pair;\n+\n+  if (left) {\n+    undistorter_ptr_ptr = &left_undistorter_ptr_;\n+    camera_parameters_pair = stereo_camera_parameters_ptr_->getLeft();\n+  } else {\n+    undistorter_ptr_ptr = &right_undistorter_ptr_;\n+    camera_parameters_pair = stereo_camera_parameters_ptr_->getRight();\n+  }\n+\n+  // if undistorter not built or built using old data update it\n+  if (!(*undistorter_ptr_ptr) ||\n+      ((*undistorter_ptr_ptr)->getCameraParametersPair() !=\n+       camera_parameters_pair)) {\n+    try {\n+      *undistorter_ptr_ptr =\n+          std::make_shared<Undistorter>(camera_parameters_pair);\n+    } catch (std::runtime_error e) {\n+      ROS_ERROR(\"%s\", e.what());\n+      return;\n+    }\n+  }\n+}\n+\n+void StereoUndistort::sendCameraInfo(const std_msgs::Header& header,\n+                                     const bool left, const bool input) {\n+  sensor_msgs::CameraInfo camera_info;\n+  camera_info.header = header;\n+  try {\n+    stereo_camera_parameters_ptr_->generateCameraInfoMessage(left, input,\n+                                                             &camera_info);\n+  } catch (std::runtime_error e) {\n+    ROS_ERROR(\"%s\", e.what());\n+    return;\n+  }\n+\n+  if (rename_radtan_plumb_bob_ && camera_info.distortion_model == \"radtan\") {\n+    camera_info.distortion_model = \"plumb_bob\";\n+  }\n+\n+  if (left) {\n+    if (input) {\n+      left_camera_info_input_pub_.publish(camera_info);\n+    } else {\n+      left_camera_info_output_pub_.publish(camera_info);\n+    }\n+  } else {\n+    if (input) {\n+      right_camera_info_input_pub_.publish(camera_info);\n+    } else {\n+      right_camera_info_output_pub_.publish(camera_info);\n+    }\n+  }\n+}\n+\n+void StereoUndistort::processAndSendImage(\n+    const sensor_msgs::ImageConstPtr& image_msg_in, const bool left) {\n+  cv_bridge::CvImageConstPtr image_in_ptr =\n+      cv_bridge::toCvShare(image_msg_in, output_image_type_);\n+  cv_bridge::CvImagePtr image_out_ptr(\n+      new cv_bridge::CvImage(image_in_ptr->header, image_in_ptr->encoding));\n+\n+  updateUndistorter(left);\n+\n+  image_out_ptr->header.frame_id = output_frame_;\n+\n+  if (left) {\n+    left_undistorter_ptr_->undistortImage(image_in_ptr->image,\n+                                          &(image_out_ptr->image));\n+    left_image_pub_.publish(*(image_out_ptr->toImageMsg()));\n+\n+    if (publish_tf_) {\n+      Eigen::Matrix4d T =\n+          stereo_camera_parameters_ptr_->getLeft()\n+              .getInputPtr()","path":"src/stereo_undistort.cpp","position":198,"original_position":198,"commit_id":"579b607f5d4d7eb2bf0b9b66b37f2a7a03863f6f","original_commit_id":"579b607f5d4d7eb2bf0b9b66b37f2a7a03863f6f","user":{"login":"helenol","id":5616392,"avatar_url":"https://avatars.githubusercontent.com/u/5616392?v=3","gravatar_id":"","url":"https://api.github.com/users/helenol","html_url":"https://github.com/helenol","followers_url":"https://api.github.com/users/helenol/followers","following_url":"https://api.github.com/users/helenol/following{/other_user}","gists_url":"https://api.github.com/users/helenol/gists{/gist_id}","starred_url":"https://api.github.com/users/helenol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/helenol/subscriptions","organizations_url":"https://api.github.com/users/helenol/orgs","repos_url":"https://api.github.com/users/helenol/repos","events_url":"https://api.github.com/users/helenol/events{/privacy}","received_events_url":"https://api.github.com/users/helenol/received_events","type":"User","site_admin":false},"body":"weird format, I guess autoformat though.","created_at":"2016-12-02T13:28:52Z","updated_at":"2016-12-02T13:31:40Z","html_url":"https://github.com/ethz-asl/image_undistort/pull/9#discussion_r90641452","pull_request_url":"https://api.github.com/repos/ethz-asl/image_undistort/pulls/9","_links":{"self":{"href":"https://api.github.com/repos/ethz-asl/image_undistort/pulls/comments/90641452"},"html":{"href":"https://github.com/ethz-asl/image_undistort/pull/9#discussion_r90641452"},"pull_request":{"href":"https://api.github.com/repos/ethz-asl/image_undistort/pulls/9"}}},"pull_request":{"url":"https://api.github.com/repos/ethz-asl/image_undistort/pulls/9","id":96251678,"html_url":"https://github.com/ethz-asl/image_undistort/pull/9","diff_url":"https://github.com/ethz-asl/image_undistort/pull/9.diff","patch_url":"https://github.com/ethz-asl/image_undistort/pull/9.patch","issue_url":"https://api.github.com/repos/ethz-asl/image_undistort/issues/9","number":9,"state":"open","locked":false,"title":"Feature/stereo undistorter","user":{"login":"ZacharyTaylor","id":730680,"avatar_url":"https://avatars.githubusercontent.com/u/730680?v=3","gravatar_id":"","url":"https://api.github.com/users/ZacharyTaylor","html_url":"https://github.com/ZacharyTaylor","followers_url":"https://api.github.com/users/ZacharyTaylor/followers","following_url":"https://api.github.com/users/ZacharyTaylor/following{/other_user}","gists_url":"https://api.github.com/users/ZacharyTaylor/gists{/gist_id}","starred_url":"https://api.github.com/users/ZacharyTaylor/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ZacharyTaylor/subscriptions","organizations_url":"https://api.github.com/users/ZacharyTaylor/orgs","repos_url":"https://api.github.com/users/ZacharyTaylor/repos","events_url":"https://api.github.com/users/ZacharyTaylor/events{/privacy}","received_events_url":"https://api.github.com/users/ZacharyTaylor/received_events","type":"User","site_admin":false},"body":"Two changes,\r\n1) Force stereo calibration to have left camera at the origin as the ros disparity code blindly assumes this.\r\n\r\n2) Added a dedicated stereo undistorter node. This allows syncing between the images as well as temporal downsampling.","created_at":"2016-12-02T10:04:30Z","updated_at":"2016-12-02T13:31:40Z","closed_at":null,"merged_at":null,"merge_commit_sha":"56e468109872c242e2e3738f005f4b7090cfa687","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/ethz-asl/image_undistort/pulls/9/commits","review_comments_url":"https://api.github.com/repos/ethz-asl/image_undistort/pulls/9/comments","review_comment_url":"https://api.github.com/repos/ethz-asl/image_undistort/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ethz-asl/image_undistort/issues/9/comments","statuses_url":"https://api.github.com/repos/ethz-asl/image_undistort/statuses/579b607f5d4d7eb2bf0b9b66b37f2a7a03863f6f","head":{"label":"ethz-asl:feature/stereo_undistorter","ref":"feature/stereo_undistorter","sha":"579b607f5d4d7eb2bf0b9b66b37f2a7a03863f6f","user":{"login":"ethz-asl","id":475362,"avatar_url":"https://avatars.githubusercontent.com/u/475362?v=3","gravatar_id":"","url":"https://api.github.com/users/ethz-asl","html_url":"https://github.com/ethz-asl","followers_url":"https://api.github.com/users/ethz-asl/followers","following_url":"https://api.github.com/users/ethz-asl/following{/other_user}","gists_url":"https://api.github.com/users/ethz-asl/gists{/gist_id}","starred_url":"https://api.github.com/users/ethz-asl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ethz-asl/subscriptions","organizations_url":"https://api.github.com/users/ethz-asl/orgs","repos_url":"https://api.github.com/users/ethz-asl/repos","events_url":"https://api.github.com/users/ethz-asl/events{/privacy}","received_events_url":"https://api.github.com/users/ethz-asl/received_events","type":"Organization","site_admin":false},"repo":{"id":61016415,"name":"image_undistort","full_name":"ethz-asl/image_undistort","owner":{"login":"ethz-asl","id":475362,"avatar_url":"https://avatars.githubusercontent.com/u/475362?v=3","gravatar_id":"","url":"https://api.github.com/users/ethz-asl","html_url":"https://github.com/ethz-asl","followers_url":"https://api.github.com/users/ethz-asl/followers","following_url":"https://api.github.com/users/ethz-asl/following{/other_user}","gists_url":"https://api.github.com/users/ethz-asl/gists{/gist_id}","starred_url":"https://api.github.com/users/ethz-asl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ethz-asl/subscriptions","organizations_url":"https://api.github.com/users/ethz-asl/orgs","repos_url":"https://api.github.com/users/ethz-asl/repos","events_url":"https://api.github.com/users/ethz-asl/events{/privacy}","received_events_url":"https://api.github.com/users/ethz-asl/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ethz-asl/image_undistort","description":"A compact package for undistorting images directly from kalibr calibration files. Can also perform dense stereo estimation","fork":false,"url":"https://api.github.com/repos/ethz-asl/image_undistort","forks_url":"https://api.github.com/repos/ethz-asl/image_undistort/forks","keys_url":"https://api.github.com/repos/ethz-asl/image_undistort/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ethz-asl/image_undistort/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ethz-asl/image_undistort/teams","hooks_url":"https://api.github.com/repos/ethz-asl/image_undistort/hooks","issue_events_url":"https://api.github.com/repos/ethz-asl/image_undistort/issues/events{/number}","events_url":"https://api.github.com/repos/ethz-asl/image_undistort/events","assignees_url":"https://api.github.com/repos/ethz-asl/image_undistort/assignees{/user}","branches_url":"https://api.github.com/repos/ethz-asl/image_undistort/branches{/branch}","tags_url":"https://api.github.com/repos/ethz-asl/image_undistort/tags","blobs_url":"https://api.github.com/repos/ethz-asl/image_undistort/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ethz-asl/image_undistort/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ethz-asl/image_undistort/git/refs{/sha}","trees_url":"https://api.github.com/repos/ethz-asl/image_undistort/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ethz-asl/image_undistort/statuses/{sha}","languages_url":"https://api.github.com/repos/ethz-asl/image_undistort/languages","stargazers_url":"https://api.github.com/repos/ethz-asl/image_undistort/stargazers","contributors_url":"https://api.github.com/repos/ethz-asl/image_undistort/contributors","subscribers_url":"https://api.github.com/repos/ethz-asl/image_undistort/subscribers","subscription_url":"https://api.github.com/repos/ethz-asl/image_undistort/subscription","commits_url":"https://api.github.com/repos/ethz-asl/image_undistort/commits{/sha}","git_commits_url":"https://api.github.com/repos/ethz-asl/image_undistort/git/commits{/sha}","comments_url":"https://api.github.com/repos/ethz-asl/image_undistort/comments{/number}","issue_comment_url":"https://api.github.com/repos/ethz-asl/image_undistort/issues/comments{/number}","contents_url":"https://api.github.com/repos/ethz-asl/image_undistort/contents/{+path}","compare_url":"https://api.github.com/repos/ethz-asl/image_undistort/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ethz-asl/image_undistort/merges","archive_url":"https://api.github.com/repos/ethz-asl/image_undistort/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ethz-asl/image_undistort/downloads","issues_url":"https://api.github.com/repos/ethz-asl/image_undistort/issues{/number}","pulls_url":"https://api.github.com/repos/ethz-asl/image_undistort/pulls{/number}","milestones_url":"https://api.github.com/repos/ethz-asl/image_undistort/milestones{/number}","notifications_url":"https://api.github.com/repos/ethz-asl/image_undistort/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ethz-asl/image_undistort/labels{/name}","releases_url":"https://api.github.com/repos/ethz-asl/image_undistort/releases{/id}","deployments_url":"https://api.github.com/repos/ethz-asl/image_undistort/deployments","created_at":"2016-06-13T07:32:39Z","updated_at":"2016-11-18T16:17:44Z","pushed_at":"2016-12-02T11:03:06Z","git_url":"git://github.com/ethz-asl/image_undistort.git","ssh_url":"git@github.com:ethz-asl/image_undistort.git","clone_url":"https://github.com/ethz-asl/image_undistort.git","svn_url":"https://github.com/ethz-asl/image_undistort","homepage":"","size":113,"stargazers_count":2,"watchers_count":2,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":3,"forks":2,"open_issues":3,"watchers":2,"default_branch":"master"}},"base":{"label":"ethz-asl:master","ref":"master","sha":"5af7ff05ab0514badfe22afc425de521ee88c8f2","user":{"login":"ethz-asl","id":475362,"avatar_url":"https://avatars.githubusercontent.com/u/475362?v=3","gravatar_id":"","url":"https://api.github.com/users/ethz-asl","html_url":"https://github.com/ethz-asl","followers_url":"https://api.github.com/users/ethz-asl/followers","following_url":"https://api.github.com/users/ethz-asl/following{/other_user}","gists_url":"https://api.github.com/users/ethz-asl/gists{/gist_id}","starred_url":"https://api.github.com/users/ethz-asl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ethz-asl/subscriptions","organizations_url":"https://api.github.com/users/ethz-asl/orgs","repos_url":"https://api.github.com/users/ethz-asl/repos","events_url":"https://api.github.com/users/ethz-asl/events{/privacy}","received_events_url":"https://api.github.com/users/ethz-asl/received_events","type":"Organization","site_admin":false},"repo":{"id":61016415,"name":"image_undistort","full_name":"ethz-asl/image_undistort","owner":{"login":"ethz-asl","id":475362,"avatar_url":"https://avatars.githubusercontent.com/u/475362?v=3","gravatar_id":"","url":"https://api.github.com/users/ethz-asl","html_url":"https://github.com/ethz-asl","followers_url":"https://api.github.com/users/ethz-asl/followers","following_url":"https://api.github.com/users/ethz-asl/following{/other_user}","gists_url":"https://api.github.com/users/ethz-asl/gists{/gist_id}","starred_url":"https://api.github.com/users/ethz-asl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ethz-asl/subscriptions","organizations_url":"https://api.github.com/users/ethz-asl/orgs","repos_url":"https://api.github.com/users/ethz-asl/repos","events_url":"https://api.github.com/users/ethz-asl/events{/privacy}","received_events_url":"https://api.github.com/users/ethz-asl/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ethz-asl/image_undistort","description":"A compact package for undistorting images directly from kalibr calibration files. Can also perform dense stereo estimation","fork":false,"url":"https://api.github.com/repos/ethz-asl/image_undistort","forks_url":"https://api.github.com/repos/ethz-asl/image_undistort/forks","keys_url":"https://api.github.com/repos/ethz-asl/image_undistort/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ethz-asl/image_undistort/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ethz-asl/image_undistort/teams","hooks_url":"https://api.github.com/repos/ethz-asl/image_undistort/hooks","issue_events_url":"https://api.github.com/repos/ethz-asl/image_undistort/issues/events{/number}","events_url":"https://api.github.com/repos/ethz-asl/image_undistort/events","assignees_url":"https://api.github.com/repos/ethz-asl/image_undistort/assignees{/user}","branches_url":"https://api.github.com/repos/ethz-asl/image_undistort/branches{/branch}","tags_url":"https://api.github.com/repos/ethz-asl/image_undistort/tags","blobs_url":"https://api.github.com/repos/ethz-asl/image_undistort/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ethz-asl/image_undistort/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ethz-asl/image_undistort/git/refs{/sha}","trees_url":"https://api.github.com/repos/ethz-asl/image_undistort/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ethz-asl/image_undistort/statuses/{sha}","languages_url":"https://api.github.com/repos/ethz-asl/image_undistort/languages","stargazers_url":"https://api.github.com/repos/ethz-asl/image_undistort/stargazers","contributors_url":"https://api.github.com/repos/ethz-asl/image_undistort/contributors","subscribers_url":"https://api.github.com/repos/ethz-asl/image_undistort/subscribers","subscription_url":"https://api.github.com/repos/ethz-asl/image_undistort/subscription","commits_url":"https://api.github.com/repos/ethz-asl/image_undistort/commits{/sha}","git_commits_url":"https://api.github.com/repos/ethz-asl/image_undistort/git/commits{/sha}","comments_url":"https://api.github.com/repos/ethz-asl/image_undistort/comments{/number}","issue_comment_url":"https://api.github.com/repos/ethz-asl/image_undistort/issues/comments{/number}","contents_url":"https://api.github.com/repos/ethz-asl/image_undistort/contents/{+path}","compare_url":"https://api.github.com/repos/ethz-asl/image_undistort/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ethz-asl/image_undistort/merges","archive_url":"https://api.github.com/repos/ethz-asl/image_undistort/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ethz-asl/image_undistort/downloads","issues_url":"https://api.github.com/repos/ethz-asl/image_undistort/issues{/number}","pulls_url":"https://api.github.com/repos/ethz-asl/image_undistort/pulls{/number}","milestones_url":"https://api.github.com/repos/ethz-asl/image_undistort/milestones{/number}","notifications_url":"https://api.github.com/repos/ethz-asl/image_undistort/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ethz-asl/image_undistort/labels{/name}","releases_url":"https://api.github.com/repos/ethz-asl/image_undistort/releases{/id}","deployments_url":"https://api.github.com/repos/ethz-asl/image_undistort/deployments","created_at":"2016-06-13T07:32:39Z","updated_at":"2016-11-18T16:17:44Z","pushed_at":"2016-12-02T11:03:06Z","git_url":"git://github.com/ethz-asl/image_undistort.git","ssh_url":"git@github.com:ethz-asl/image_undistort.git","clone_url":"https://github.com/ethz-asl/image_undistort.git","svn_url":"https://github.com/ethz-asl/image_undistort","homepage":"","size":113,"stargazers_count":2,"watchers_count":2,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":3,"forks":2,"open_issues":3,"watchers":2,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ethz-asl/image_undistort/pulls/9"},"html":{"href":"https://github.com/ethz-asl/image_undistort/pull/9"},"issue":{"href":"https://api.github.com/repos/ethz-asl/image_undistort/issues/9"},"comments":{"href":"https://api.github.com/repos/ethz-asl/image_undistort/issues/9/comments"},"review_comments":{"href":"https://api.github.com/repos/ethz-asl/image_undistort/pulls/9/comments"},"review_comment":{"href":"https://api.github.com/repos/ethz-asl/image_undistort/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ethz-asl/image_undistort/pulls/9/commits"},"statuses":{"href":"https://api.github.com/repos/ethz-asl/image_undistort/statuses/579b607f5d4d7eb2bf0b9b66b37f2a7a03863f6f"}}}}
{"actor":{"display_login":"helenol"}}