C++-实现matlab的meshgird(OpenCV)

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

场景需求

       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矩阵一致。

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

© 版权声明
THE END
喜欢就支持一下吧
点赞909 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容