标量的opencv矩阵除法产生非常大/小的数字

Posted

技术标签:

【中文标题】标量的opencv矩阵除法产生非常大/小的数字【英文标题】:opencv matrix division by scalar produces very large/small numbers 【发布时间】:2016-12-29 10:34:24 【问题描述】:

我拍摄 RGB 图像。我尝试将其转换为矢量(代码如下)。当我读取向量时,我得到非常大或非常小的值。我认为这与函数返回的向量有关,但我无法弄清楚。我得到如下值:2.36943e-38 2.36943e-38 -8256.25 -81920 等等

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>
#include <string>
#include <vector>


using namespace cv;
using namespace std;

vector<float> mat_to_vec(Mat M)
    vector<float> array_temp;

    for (int i=0;i<M.cols;i++)
    for(int j=0;j<M.rows;j++)
    
        array_temp.push_back(M.at<float>(j,i));
      

return array_temp;



int main(int argc, char** argv)


// read the image

Mat src=imread(argv[1],CV_LOAD_IMAGE_COLOR);

// separate the channels 

Mat bgr[3];   //destination array
split(src,bgr);//split source 

// convert to individual arrays and divide by 256
Mat temp_b=bgr[0]/256.0;
Mat temp_g=bgr[1]/256.0;
Mat temp_r=bgr[2]/256.0;

vector<float> array_b=mat_to_vec(temp_b);
vector<float> array_g=mat_to_vec(temp_g);
vector<float> array_r=mat_to_vec(temp_r);

// merge the arrays 

vector<float> array_rgb;
array_rgb.insert(array_rgb.end(), array_r.begin(), array_r.end());
array_rgb.insert(array_rgb.end(), array_g.begin(), array_g.end());
array_rgb.insert(array_rgb.end(), array_b.begin(), array_b.end());

for (int i=0; i<array_rgb.size();i++)
cout << array_rgb[i] << endl;

return 0;    

【问题讨论】:

【参考方案1】:

您需要将您的 src 图像转换为浮动元素类型的图像,使用 src.convertTo(src,CV_32FC1);

【讨论】:

你的意思是CV_32FC3? 它不会改变频道数量,但是是的,你是对的,CV_32FC3 会更好看。

以上是关于标量的opencv矩阵除法产生非常大/小的数字的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法防止opencv矩阵除法中的舍入

OpenCV矩阵元素除法给出全零结果

OpenCV中的MAT类矩阵的各种基本运算及示例代码(加减乘点乘点除乘方累加转置等)

Python的Numpy库中各种矩阵基本运算的示例代码(加减乘点乘点除乘方转置等)

在R中的大矩阵中添加连续的四个/ n个数字

使用 mex 将一个大矩阵从 Matlab 传递到 C:Matlab 崩溃