2016-04-14 18 views
1

Yani ben var bir üç küresel Mat (Benimle ayı), ben çift ile doldurmak isteyen, ben de varOpenCV C++ Mat ÇILGINLIĞI

böylece baskı yöntemi ile nesne Main.hpp

Main class { 
... 
Mat FIXED; 
Mat one; 
Mat two; 
... 
} 

ve benim main.cpp i ince herhangi matris girişi her şeyi saklar için

void Main::printMat(Mat mat) { 
    int rows = mat.rows; 
    int cols = mat.cols; 
    for (int j = 0, j < cols; j++) { 
     for (int i = 0, i < rows; i++) { 
      printf("%lf ", mat.at<double>(i,j)); 
     } 
     printf("\n"); 
    } 
} 

Yani var.

printMat(one); <--this works 

BU İNCE İŞLERİ, ama sonra SONRA

two = FIXED.clone(); 

BU BOZMA yap, ben NEDEN YARDIM

printMat(one); <--this doesnt work 

i .clone dışarı yorum yaparsanız NO IDEA(), aynı boyutta boş bir matris yapar ve FIXED'e kaydetmezse çalışır.

+1

Tüm matrisler 'CV_64FC1' türündendir? Aksi takdirde bu muhtemelen kırılacaktır. Main’ın bir örneğinden 'printMat’ı çağırmamanız gerekir mi? BTW, baskı matrisleri için 'mat << endl; 'cout'unu kullanabilirsiniz. – Miki

+0

Varsayılan olarak 1 Kanal için emin değilsiniz. Her neyse benim hatam oldu ve cevap yazdım. Çaylak hatası referenc vs değer hatası, ama kolayca kafa karıştırıcı sanırım. – Vroosh

+0

Matrisini neden yazdırırken neden dönüştürdüğünüzü anlamıyorum (kodunuz bir satırdaki her sütunun değerlerini yazdırır, sonra satırsonu satırına geçer ve bir sonraki satıra gider) veya neden "cout" kullanmıyorsunuz, ancak aynı görevi daha okunaklı (IMHO) bir şeyle tamamlayın: 'için (int j = 0, j 'da (i, j)); printf ("\ n"); } ' –

cevap

1

Bu konuda mücadele eden herkes için neden tek diziyi oluşturuyordum.

Yani ben başlangıçta

cout << someMat << endl; 

çünkü bana garip numaralar

çıkıyor orada hata şu, bana i saklanan Normal değerler vermelidir veriyordu bir baskı yöntemini yaptı.

Mat'ı, bir dizi [satır] [col] içinden geçirerek

void foo() { 
    one = Mat(Array.rows, Array.cols, CV_64F, Array); 
} 

void bar() { 
printMat(one)//error happens here 
} 

main (...) { 
    foo(); 
    bar(); 
} 

Kurucu, Dizinin referansı ve NOT değerini kullanır ve yöntemi terk ettiğimde, bu küçük belleği Çöp toplayıcısına kaybederim.

Bahsettiğim hattan sonra kırıldığı gerçeği sadece bir tesadüftür. (Bu farklı bir yöntem vardı ve bu noktada GC temizlemeye karar verdi)

+2

C++ 'da çöp toplayıcı yok, D – Miki

+0

ahaha düzeltmek için çekinmeyin, bu C++ şeyler çok benim ligimden çıktı – Vroosh

+0

Yapamam. İlgili tüm kodu göstermediğiniz için sorunun nerede olduğunu bile bilmiyorum.Bir düzeltme bulduğunuzdan soruyu silebilirsiniz, ancak başkalarının bundan nasıl yararlanabileceği hakkında bir bilgi yok. – Miki