关于Mat_和Mat,cv::Mat_类是一个“瘦身”的cv::Mat类。
在大多数情况下,使用cv::Mat就足够了,但是cv::Mat_会更方便在你进行大量元素的访问操作时,且在编译时你已经知道矩阵类型的情况下。
cv::Mat_<double> robot_cur_pose(1,6);
std::vector<double> cur_pose = { 9.69,-13.23,88.72,22.08,79.81,-6.04 };
for (int i = 0; i < 6; i++) {
// 下面两种方法都可以
//robot_cur_pose.at(0,i) = cur_pose[i];
robot_cur_pose(0, i) = cur_pose[i];
}
for (int i = 0; i < 6; i++) {
std::cout << robot_cur_pose(0, i) << " ";
}
下面这两行代码中,R_rect(0, 0, 3, 3)不是表示的是矩形的左上角坐标(0, 0),右下角坐标(3, 3)。
cv::Rect R_rect(0, 0, 3, 3);
cv::Rect T_rect(3, 0, 1, 3);
实际表示的是矩形左上角的坐标、矩形的宽度和高度。
cv::Rect rect(x, y, width, height);
目的:对于某些数据类型必须要用cv::Point3f来创建,但头文件中不希望引用opencv库,所以需要知道cv::Point3f是如何创建的,能不能改为C++标准的STL库。
typedef Point3_<int> Point3i;
typedef Point3_<float> Point3f;
typedef Point3_<double> Point3d;
举例①:
cv::Point3f v1(34.0f, 21.34f, 32.0f);
举例②:
https://www.thinbug.com/q/24860611
通过三个double类型的数x, y, z,到了别处使用时用这三个数进行Point3f的创建。
std::vector<cv::Point3f> points;
points.push_back(cv::Point3f(0.44,0.30,0.46));
x y z
Eigen::Matrix4f gnss_of_lidar;
...
// 有效赋值
Eigen::Matrix3f R=gnss_of_lidar.block(0,0,3,3).matrix();
Eigen::Quaternionf q(R);
https://blog.csdn.net/delovsam/article/details/104427530?spm=1001.2014.3001.5502