2011-11-01 21 views
46

Chcę zrzucić wartości macierzy w OpenCV do konsoli przy użyciu cout. Szybko nauczyłem się, że nie rozumiem systemu typu OpenvCV ani szablonów C++ wystarczająco dobrze, aby wykonać to proste zadanie.Wydrukuj wartości macierzy (Mat) w OpenCV C++

Czy czytelnik powinien opublikować (lub wskazać mi) małą funkcję lub fragment kodu, który drukuje matę?

Pozdrawiam, Aaron

PS: kod, który wykorzystuje interfejs C++ nowszą Mat w przeciwieństwie do starszego interfejsu CvMat jest preferencyjny.

Odpowiedz

68

Zobacz pierwszy odpowiedź Accesing a matrix element in the "Mat" object (not the CvMat object) in OpenCV C++
wtedy właśnie pętli nad wszystkimi elementami w cout << M.at<double>(0,0); zamiast tylko 0,0

Albo jeszcze lepiej z new C++ interface (dzięki SSteve)

cv::Mat M; 

cout << "M = "<< endl << " " << M << endl << endl; 
+1

także patrz [tej sekcji w poradniku] (http://opencv.itseez.com/doc/tutorials/core/mat%20-%20the%20basic%20image%20container /mat%20-%20the%20basic%20image%20container.html#print-out-formatting) – SSteve

+1

Brilliant. Powinienem był popchnąć Matę do walki przede wszystkim, żeby zobaczyć, czy ktoś zaimplementował <<. Jeszcze trochę eksperymentów i zaufania mi się opłaca. – ahoffer

+0

Właśnie zadałem [pytanie na ten temat] (http://stackoverflow.com/questions/10011797/opencv-2-1-where-isostream-operator-for-cvmat). Czy operator ostream << jest dostępny w wersji 2.1 i gdzie jest to udokumentowane? – juanchopanza

3
#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

Myślę, że używanie matrix.at<type>(x,y) nie jest najlepszym sposobem na iterację przez obiekt Mat! Jeśli dobrze pamiętam, matrix.at<type>(x,y) będzie iterować od początku macierzy za każdym razem, gdy ją wywołasz (może się jednak mylę). sugeruję pomocą cv::MatIterator_

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