C++-采样函数GridSampling(采样提速必备)

Posted 翟天保Steven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++-采样函数GridSampling(采样提速必备)相关的知识,希望对你有一定的参考价值。

场景需求

       采样是在做大量数据计算时常用的优化方法,合理的采样方式可以使计算速度提高数十倍数百倍。比如原本1000*1000的图像数据要进行百次迭代计算,运用采样法提取100*100的图像数据进行分析,最少提速100倍,大大减少了不必要的计算,从而提高程序运行速度。该方法我通常用于面形拟合,来快速计算拟合系数,也常用于迭代计算;但是,一定要注意,合理的采样间隔很重要,不要一味追求速度,采样提速的同时也意味着有效数据的减少,对结果是有一定影响的,合理的设计才可以忽略此影响。

       话不多说,下方为具体实现函数和测试代码。

功能函数代码

/**
 * @brief GridSampling                     设置采样的位置点
 * @param size                             重采样的范围尺寸
 * @param rowinterval                      行间隔
 * @param colinterval                      列间隔
 * @return                                 重采样的mask
 */
cv::Mat GridSampling(const cv::Size& size, int rowinterval, int colinterval) 
{
	cv::Mat dst(size, CV_8UC1, cv::Scalar(0));
	//设置采样的位置点
	int Row = dst.rows;
	int Col = dst.cols;
	for (int row = 0; row < Row; row += rowinterval) {
		for (int col = 0; col < Col; col += colinterval) {
			dst.at<uchar>(row, col) = 255;
		}
	}
	return dst;
}

C++测试代码

#include <iostream>
#include <opencv.hpp>
using namespace std;
using namespace cv;
cv::Mat GridSampling(const cv::Size& size, int rowinterval, int colinterval);
int main()
{
	// 随机生成一个矩阵
	cv::Mat src(100,100,CV_32FC1);
	for (int i = 0; i < 100; ++i)
	{
		for (int j = 0; j < 100; ++j)
		{
			src.at<float>(i, j) = rand() % 255;
		}
	}

	// 创建掩膜mask
	cv::Mat mask = cv::Mat::zeros(src.size(), CV_8UC1);
	cv::circle(mask, cv::Point(50, 50), 40, 255, -1);

	// 创建采样区
	int sampInterval = 2; // 采样间隔为2
	cv::Mat samp = GridSampling(src.size(), sampInterval, sampInterval);
	cv::Mat samp_mask = samp.clone();
	samp_mask.setTo(0, ~mask);

	// 将采样区的数据放置在sampling中存储,以便后续计算
	std::vector<cv::Point> samplingidx_roi;
	cv::findNonZero(samp_mask, samplingidx_roi);
	int len = (int)samplingidx_roi.size();
	cv::Mat sampling(len, 1, CV_32FC1, 0.0f);
	auto tmp = samplingidx_roi.begin();
	for (int i = 0; i < len; ++i, ++tmp) {
		int x = tmp->x;
		int y = tmp->y;
		sampling.ptr<float>(i)[0] = src.ptr<float>(y)[x];
	}

	system("pause");
	return 0;
}

/**
 * @brief GridSampling                     设置采样的位置点
 * @param size                             重采样的范围尺寸
 * @param rowinterval                      行间隔
 * @param colinterval                      列间隔
 * @return                                 重采样的mask
 */
cv::Mat GridSampling(const cv::Size& size, int rowinterval, int colinterval) 
{
	cv::Mat dst(size, CV_8UC1, cv::Scalar(0));
	//设置采样的位置点
	int Row = dst.rows;
	int Col = dst.cols;
	for (int row = 0; row < Row; row += rowinterval) {
		for (int col = 0; col < Col; col += colinterval) {
			dst.at<uchar>(row, col) = 255;
		}
	}
	return dst;
}

测试效果

     

图1 采样区创建
图2 采样区掩膜处理
图3 采样数据

       在测试案例中,随机生成了一个100*100的数据矩阵,运用采样函数创建了采样区,再进行掩膜处理,将所需要计算的采样点对应的数据放置在sampling矩阵中,1257是采样点的个数,之后就可以进行一些矩阵计算来实现各种各样的功能。

       如果函数有什么可以改进完善的地方,非常欢迎大家指出,一同进步何乐而不为呢~

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

以上是关于C++-采样函数GridSampling(采样提速必备)的主要内容,如果未能解决你的问题,请参考以下文章

在 GBDK c 中使用采样音频播放时如何运行代码?

求用C语言实现FFT变换的程序(见下面)

音频重采样

R语言sample函数数据对象采样实战

R语言使用caret包中的createResample函数进行机器学习数据集采样数据集有放回的采样(bootstrapping)

PCL 滤波采样——体素采样