2012-12-04 11 views
5

Ich brauche eine Funktion zu implementieren, dass eine Zeichenfolge empfängt enthält die Bytes eines Bildes (empfangen über Boost-Socket-Verbindung) und wandelt die Informationen in einem OpenCV cv: : Mat.eine Reihe von Bytes zu cv :: Matte

Ich kenne auch die Breite und Höhe des Bildes und seine Größe in Bytes. Meine Funktion sieht so aus:

void createImageFromBytes(const std::string& name, std::pair<int,int> dimensions, const std::string& data) 
{ 
    int width,height; 
    width = dimensions.first; 
    height = dimensions.second; 
    //convert data to cv::Mat image 

    std::string filepng = DATA_PATH"/" + name +".png"; 
    imwrite(filepng, image); 
} 

Welches ist die beste Methode dafür? Hat OpenCV einen Konstruktor für Mat aus einem String?

Antwort

9

OpenCV Matte hat einen Konstruktor von vector<byte>, aber das ist nicht so intuitiv. Sie müssen aus Zeichenfolge konvertieren, diesen Weg Vektor zuerst:

std::vector<byte> vectordata(data.begin(),data.end()); 

Dann können Sie einen Lebenslauf erstellen :: Mat aus dem Vektor:

cv::Mat data_mat(vectordata,true); 

Sie müssen auch das Bild entschlüsseln (Check-Dokumentation welche Typen sind erlaubt, png, jpg, abhängig von der OpenCV Version)

cv::Mat image(cv::imdecode(data_mat,1)); //put 0 if you want greyscale 

Jetzt können Sie überprüfen, ob die resultierende Größe des Bildes das gleiche wie das ist versandt:

cout<<"Height: " << image.rows <<" Width: "<<image.cols<<endl; 
1

Wenn die Daten in der Zeichenfolge ist roh Pixel (eher als ein Jpeg/png etc.) können Sie den Lebenslauf :: Matte direkt

meine verbesserte Lösung von Jav_Rock schaffen
// assuming an RGB image in bytes    
cv::Mat mat(height,width,CV_8UC3,string.data()); 
+4

nicht zu pingelig sein, aber sind Höhe und Reihen nicht dasselbe? – trianta2

+0

Ich bekomme Fehler bei der Kompilierung und beklagt, dass es für diese Verwendung von cv :: Mat keinen passenden Konstruktor gibt. Möglicherweise Updates zu opencv, da Ihr Beitrag Ihre Lösung durchbrochen hat? –

0

Hier ist das Problem ist, dass nicht klar ist, Vektor (Byte-Typ in c ist nicht ++ definiert ist, habe ich nicht gefunden) zu verwenden Vektor statt, dass verwenden, ist hier ein Beispiel-Code

int func(char * pfile){ 
string strfile = pfile; 
std::vector<unsigned char> vectordata(strfile.begin(),strfile.end()); 
Mat data_mat(vectordata, true); 
Mat graySacleFrame = imdecode(data_mat, 0); //PGM image 
... 
}