it-swarm.com.de

Drucken Sie die Werte einer (Mat) -Matrix in OpenCV C++ aus

Ich möchte die Werte einer Matrix in OpenCV mit cout auf die Konsole übertragen. Ich habe schnell gelernt, dass ich das Typsystem von OpenvCV und die C++ - Vorlagen nicht gut genug verstehe, um diese einfache Aufgabe auszuführen.

Würde ein Leser bitte ein kleines Funktions- oder Code-Snippet posten, das eine Matte druckt?

Grüße, Aaron

PS: Code, der die neuere C++ Mat-Schnittstelle im Gegensatz zur älteren CvMat-Schnittstelle verwendet, ist bevorzugt.

53
ahoffer

Siehe die erste Antwort auf Zugriff auf ein Matrixelement im Objekt "Mat" (nicht das CvMat-Objekt) in OpenCV C++
.... Schleife dann alle Elemente in cout << M.at<double>(0,0); durch und nicht nur 0,0

Oder noch besser mit der neuen C++ - Schnittstelle (Dank an SSteve

cv::Mat M;

cout << "M = "<< endl << " "  << M << endl << endl;
79
Martin Beckett

Ich denke, die Verwendung von matrix.at<type>(x,y) ist nicht der beste Weg, um durch ein Mat-Objekt zu iterieren! Wenn ich mich richtig erinnere, matrix.at<type>(x,y) wird jedes Mal, wenn Sie es aufrufen, eine Iteration durchlaufen (ich könnte mich jedoch irren) würde vorschlagen, cv::MatIterator_ zu verwenden

cv::Mat someMat(1, 4, CV_64F, &someData);;
cv::MatIterator_<double> _it = someMat.begin<double>();
for(;_it!=someMat.end<double>(); _it++){
    std::cout << *_it << std::endl;
}
3
Dima Maligin
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

#include <iostream>
#include <iomanip>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    double data[4] = {-0.0000000077898273846583732, -0.03749374753019832, -0.0374787251930463, -0.000000000077893623846343843};
    Mat src = Mat(1, 4, CV_64F, &data);
    for(int i=0; i<4; i++)
        cout << setprecision(3) << src.at<double>(0,i) << endl;

    return 0;
}
3
Dmoonleo

Wenn Sie opencv3 verwenden, können Sie Mat wie python numpy style drucken:

Mat xTrainData = (Mat_<float>(5,2) << 1, 1, 1, 1, 2, 2, 2, 2, 2, 2);

cout << "xTrainData (python)  = " << endl << format(xTrainData, Formatter::FMT_PYTHON) << endl << endl;

Ausgabe wie unten, Sie können sie besser lesen, siehe hier für weitere Informationen.

 enter image description here

In den meisten Fällen ist es jedoch nicht erforderlich, alle Daten in Mat auszugeben. Sie können die Ausgabe nach einem Zeilenbereich wie 0 bis 2 Zeilen durchführen:

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

#include <iostream>
#include <iomanip>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    //row: 6, column: 3,unsigned one channel
    Mat image1(6, 3, CV_8UC1, 5);

    // output row: 0 ~ 2
    cout << "image1 row: 0~2 = "<< endl << " "  << image1.rowRange(0, 2) << endl << endl;

    //row: 8, column: 2,unsigned three channel
    Mat image2(8, 2, CV_8UC3, Scalar(1, 2, 3));

    // output row: 0 ~ 2
    cout << "image2 row: 0~2 = "<< endl << " "  << image2.rowRange(0, 2) << endl << endl;

    return 0;
}

Ausgabe wie folgt:

 enter image description here

0
Jayhello