Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用最小值和最大值缩放Mat中的每个单元格_C++_Opencv - Fatal编程技术网

C++ 使用最小值和最大值缩放Mat中的每个单元格

C++ 使用最小值和最大值缩放Mat中的每个单元格,c++,opencv,C++,Opencv,我找不出一个函数来使用给定的范围缩放cv::Mat中的所有单元格。这似乎是一个非常有用的函数,还是我应该手动迭代矩阵来实现它 我实际上想做的是为CvSVM扩展训练数据。每一列都有各自的原因范围。没有内置函数来实现这一点,但可以通过在每一列上应用参数NORM\u MINMAX轻松实现 参见示例,其中,数据是原始数据,缩放是缩放输出,其中每个列在范围[0,1]内独立标准化: #include <opencv2/opencv.hpp> #include <iostream> u

我找不出一个函数来使用给定的范围缩放cv::Mat中的所有单元格。这似乎是一个非常有用的函数,还是我应该手动迭代矩阵来实现它


我实际上想做的是为CvSVM扩展训练数据。每一列都有各自的原因范围。

没有内置函数来实现这一点,但可以通过在每一列上应用参数
NORM\u MINMAX
轻松实现

参见示例,其中,
数据
是原始数据,
缩放
是缩放输出,其中每个列在范围
[0,1]
内独立标准化:

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main()
{
    Mat1f data = (Mat1f(3, 4) << 0.1f,  2.f,  30.f,   500.f,
                                 0.55f, 22.f, 330.f,  5500.f,
                                 1.f,   12.f, 3030.f, 50500.f);

    float out_min = 0.f;
    float out_max = 1.f;

    Mat1f scaled(data.rows, data.cols, 0.f);
    for (int c = 0; c < data.cols; ++c)
    {
        normalize(data.col(c), scaled.col(c), out_min, out_max, NORM_MINMAX);
    }

    cout << scaled << endl;

    // Scaled data:

    // 0.0  0.0  0.0  0.0
    // 0.5  1.0  0.1  0.1
    // 1.0  0.5  1.0  1.0

    return 0;
}
#包括
#包括
使用名称空间std;
使用名称空间cv;
int main()
{

Mat1f data=(Mat1f(3,4)这可以通过调用
normType=NORM\u INF
来完成

例如:

cv::Mat data = (cv::Mat_<float>(2, 4) << 1.f, 2.f, 3.f, 4.f,
                                         5.f, 6.f, 7.f, 8.f);
cv::Mat res;
cv::normalize(data, res, 1, 0, cv::NORM_INF); // scale to [0,1]
std::cout << res;

编辑:与Miki的方法类似,如果希望每列的范围不同,则需要在每列上进行编辑

假设您要将其缩放到第列的
[0,i]

cv::Mat data = (cv::Mat_<float>(2, 4) << 1.f, 2.f, 3.f, 4.f,
                                         5.f, 6.f, 7.f, 8.f);
cv::Mat res(data.size(), data.type());
for (int i = 0; i < data.cols; ++i) {
    cv::normalize(data.col(i), res.col(i), i+1, 0, cv::NORM_INF); // scale to [0,i+1]
}
std::cout << res;
cv::Mat data = (cv::Mat_<float>(2, 4) << 1.f, 2.f, 3.f, 4.f,
                                         5.f, 6.f, 7.f, 8.f);
cv::Mat res(data.size(), data.type());
for (int i = 0; i < data.cols; ++i) {
    cv::normalize(data.col(i), res.col(i), i+1, 0, cv::NORM_INF); // scale to [0,i+1]
}
std::cout << res;
[0.2, 0.66666669, 1.2857143, 2;
   1,          2,         3, 4]