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

简介: 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 采样数据


图3 采样数据

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


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


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

相关文章
|
10天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
22天前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
41 6
|
22天前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
18 0
C++ 多线程之线程管理函数
|
26天前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
22 3
|
26天前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
97 1
|
26天前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
21 1
|
26天前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
31 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
2月前
|
编译器 C++
【C++核心】函数的应用和提高详解
这篇文章详细讲解了C++函数的定义、调用、值传递、常见样式、声明、分文件编写以及函数提高的内容,包括函数默认参数、占位参数、重载等高级用法。
22 3
|
3月前
|
编译器 C++ 容器
【C++】String常见函数用法
【C++】String常见函数用法
|
3月前
|
C++
c++常见函数及技巧
C++编程中的一些常见函数和技巧,包括生成随机数的方法、制表技巧、获取数字的个位、十位、百位数的方法、字符串命名技巧、避免代码修改错误的技巧、暂停和等待用户信号的技巧、清屏命令、以及避免编译错误和逻辑错误的建议。
29 6