如何将 sensor_msgs/CameraInfo 分配给 cv::Mat

How to assign the sensor_msgs/CameraInfo to cv::Mat

我想知道分配 const sensor_msgs::CameraInfoConstPtr& camInfo_msg, to cv::Mat 最聪明的方法是什么。

假设我希望使用参数 Intrinsic camera matrix float64[9] K into 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 to cv::Mat I use the cv_bridge 的图像时,有一种聪明的方法可以做到这一点。那么也许在相机信息中也存在我从未见过的东西。 谢谢你的时间。

我发现的最简单和最紧凑的方法是创建一个 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());
}