场景需求
matlab的meshgird是图像处理时常用的函数,用于生成网格采样点,在3D图形绘制中起了非常关键的作用。C++中运用OpenCV也可以实现同样的效果。
功能函数代码
/** * @brief UnitCart 生成网格采样点 * @param squaresize 生成网格区域的尺寸 * @param x 生成的x矩阵 * @param y 生成的y矩阵 */ void UnitCart(int squaresize, cv::Mat& x, cv::Mat& y) { CV_Assert(squaresize % 2 == 1); x.create(squaresize, squaresize, CV_32FC1); y.create(squaresize, squaresize, CV_32FC1); //设置边界 x.col(0).setTo(-1.0); x.col(squaresize - 1).setTo(1.0f); y.row(0).setTo(1.0); y.row(squaresize - 1).setTo(-1.0f); float delta = 2.0f / (squaresize - 1.0f); //两个元素的间隔 //计算其他位置的值 for (int i = 1; i < squaresize - 1; ++i) { x.col(i) = -1.0f + i * delta; y.row(i) = 1.0f - i * delta; } }
C++测试代码
#include<iostream> #include<opencv2/opencv.hpp> #include<ctime> using namespace std; using namespace cv; void UnitCart(int squaresize, cv::Mat& x, cv::Mat& y); int main(void) { cv::Mat x, y; int size = 1001; UnitCart(size, x, y); imshow("x", x); imshow("y", y); waitKey(0); system("pause"); return 0; } void UnitCart(int squaresize, cv::Mat& x, cv::Mat& y) { CV_Assert(squaresize % 2 == 1); x.create(squaresize, squaresize, CV_32FC1); y.create(squaresize, squaresize, CV_32FC1); //设置边界 x.col(0).setTo(-1.0); x.col(squaresize - 1).setTo(1.0f); y.row(0).setTo(1.0); y.row(squaresize - 1).setTo(-1.0f); float delta = 2.0f / (squaresize - 1.0f); //两个元素的间隔 //计算其他位置的值 for (int i = 1; i < squaresize - 1; ++i) { x.col(i) = -1.0f + i * delta; y.row(i) = 1.0f - i * delta; } }
测试效果
图1 效果图
图2 matlab效果图
如上图所示,C++所写的代码同matlab中meshgird生成的x和y矩阵一致。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!