2016-12-29 1 views
0

Ich nehme ein RGB-Bild. Ich versuche, es in einen Vektor umzuwandeln (Code ist wie unten). Wenn ich den Vektor lese, bekomme ich sehr große oder sehr kleine Werte. Ich denke, das hat etwas mit dem Vektor zu tun, der von der Funktion zurückgegeben wird, aber ich kann es nicht herausfinden. Ich erhalte Werte wie: 2.36943e-38 2.36943e-38 -8.256,25 -81.920 usw.Opencv Matrix Division von Skalar produziert sehr große/kleine Zahlen

#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;  
} 

Antwort

1

Sie benötigen src Bild umwandeln zu schweben Elementtyp Bild, Verwendung src.convertTo (src, CV_32FC1) ;

+0

meinst du CV_32FC3? – user27665

+0

Es wird nicht die Anzahl der Kanäle ändern, aber ja, Sie haben Recht, CV_32FC3 wird besser aussehen. –