如何将sensor_msgs / CameraInfo设置为cv :: Mat

时间:2018-01-29 13:17:52

标签: opencv sensor ros msg

我想知道将const sensor_msgs::CameraInfoConstPtr& camInfo_msg分配给cv::Mat的最明智方法是什么。

假设我希望将 ntrinsic camera matrix float64 [9] K 中的参数用于 cv :: Mat intrK。

我编写了以下代码,它工作正常,但我不知道这是否是最好的方法。我想知道其他人如何解决这个问题。

void Class::Callback(const sensor_msgs::CameraInfoConstPtr& camInfo_msg){
  // receive the parameters
 sensor_msgs::CameraInfoPtr cameraInfoMsg = boost::make_shared<sensor_msgs::CameraInfo>(*camInfo_msg);
  // copy parameters
 cv::Mat intrK = cv::Mat::zeros(3, 3, CV_64FC1);
 std::vector<double> v_intrK;
  // initialize cv::Mat of correct size and vector
 v_intrK.assign((cameraInfoLMsg->K).begin(), (cameraInfoLMsg->K).end());
  // assign parameters to vector
 for (std::size_t i = 0; i < intrK.rows; i++)
   for (std::size_t j = 0; j < intrK.cols; j++)
     intrK.at<double>(i, j) = v_intrK[i*3+j];
  // assign vector to cv::Mat

我问这个问题,因为当我将图像从const sensor_msgs::ImageConstPtr& img_msg分配给cv :: Mat时,我使用cv_bridge,所以有聪明的方法来做。然后也许相机信息也存在我从未见过的东西。 谢谢你的时间。

1 个答案:

答案 0 :(得分:1)

我发现最简单,最紧凑的方法是创建一个指向与cv::Mat相同数据的sensor_msgs::CameraInfo::K。您可以使用以下代码实现此目标:

void Class::Callback(const sensor_msgs::CameraInfoConstPtr& camInfo_msg) {
  cv::Mat intrK(3, 3, CV_64FC1, (void *) camInfo_msg->K.data());
}