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

场景需求

采样是在做大量数据计算时常用的优化方法,合理的采样方式可以使计算速度提高数十倍数百倍。比如原本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;}}// 创建掩膜maskcv::Mat mask = cv::Mat::zeros(src.size(), CV_8UC1);cv::circle(mask, cv::Point(50, 50), 40, 255, -1);// 创建采样区int sampInterval = 2; // 采样间隔为2cv::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(采样提速必备)相关推荐

  1. matlab中采样函数,matlab采样相关函数用法详解

    matlab采样函数(降采样,过采样,减采样函数)用法详解 dyaddown 功能:对时间序列进行二元采样,每隔一个元素提取一个元素,得到一个降采样时间序列. 格式: 1.y = dyaddown(x ...

  2. R语言dplyr包sample_n函数、sample_frac函数数据采样实战

    R语言dplyr包sample_n函数.sample_frac函数数据采样实战 目录 R语言dplyr包sample_n函数.sample_frac函数数据采样实战 #导入dplyr包

  3. 【Android 高性能音频】AAudio 音频流 数据回调细节 ( 数据回调函数优先级 | 数据回调函数 | 采样率 | 采样数 | 缓冲区调整 | 线程不安全 )

    文章目录 I . 数据回调函数优先级 II . 数据回调函数 相关内容 III . 采样率 处理细节 IV . 数据回调函数 每次 采样个数 numFrames V . 数据回调函数 缓冲区 ( AA ...

  4. VTK:采样函数用法实战

    VTK:采样函数用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkContourFilter.h&g ...

  5. 【Pytorch】interpolate==>上下采样函数

    def interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None):r"&quo ...

  6. 【PyTorch 】interpolate()==>上下采样函数

    def interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None, recompute_s ...

  7. numpy学习笔记之随机采样函数

    numpy的随机采样函数 np.random.choice(a, size=None,replace=None, p=None) 功能:Generates a random sample from a ...

  8. python实现采样函数_PR Sampling Ⅰ: 蒙特卡洛采样、重要性采样及python实现

    刘浚嘉:PR:机器人学的概率方法学习路径​zhuanlan.zhihu.com PR 采样分章 第一节:蒙特卡洛采样.重要性采样 引言 还记得我们之前学过的贝叶斯推断吗?刘浚嘉:PR Ⅱ:贝叶斯估计/ ...

  9. 深入理解采样定理 + Matlab 仿真 Sa 函数的采样与恢复

    建议配合国宝老师的视频食用. 信号与线性系统分析 吴大正 郭宝龙 文章目录 (1) 采样的说明 1. 为什么要取样 2. 什么是取样 (2) 采样定理 1. 为什么要有奈奎斯特频率 2. 什么是采样定 ...

最新文章

  1. ASP.NET2.0轻松搞定统计图表【月儿原创】
  2. OKR管理和绩效考核有什么不一样呢?
  3. tomcat的log日志乱码解决方案
  4. 正确使用 SharePoint 对象避免内存泄漏(续)
  5. 5-2 决策树算法预测销量高低代码
  6. halcon/c++接口基础 之 HALCON图像变量类
  7. Oracle数据库链路
  8. 地址省市县三级联动------数据库设计
  9. Fritzing软件绘制Arduino面包板接线图传感器模块库文件170
  10. android连iphone热点超时,苹果手机开热点安卓手机连不了为什么
  11. excel组合汇总_Excel汇总20151102
  12. 三种最常用的期货交易系统,99%的人都不知道
  13. MathType公式编辑器中怎么输入千分号
  14. 初识Web与HTML
  15. AToken全观:情人节妹子收了520个BTC,成吨狗粮灌到饱
  16. Python实战笔记-常用知识点
  17. 制作WINRE恢复光盘
  18. html5图片按钮播放,html 播放 按钮
  19. 简单的员工信息管理系统
  20. 泸州职业技术学院计算机单招试题,泸州职业技术学院普通类9+3单招考试技能测试考纲...

热门文章

  1. 《中国人工智能学会通讯》——11.34 基于近似动态规划的优化控制研究及 在电力系统中的应用...
  2. Golang Import使用入门
  3. 【IOS】ios8推送消息注册
  4. 【2012百度之星资格赛】J:百度的新大厦
  5. 8-18 高可用读写分离
  6. 技嘉 b360m d3h-cf efi_技嘉Geforce RTX 3080 GAMING OC 10G评测:性能入魔,方为魔鹰_显卡...
  7. Java 和C# 最大的不同是对底层的控制能力不同
  8. oracle number +1,number number(1)
  9. endnote大客户版_Endnote软件的使用,有图有干货!
  10. QObject::startTimer: Timers cannot be started from another thread