我想知道将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,所以有聪明的方法来做。然后也许相机信息也存在我从未见过的东西。 谢谢你的时间。
答案 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());
}