2012-11-12 10 views
6

Şu anda OpenCV/C++ 'un çok garip davranışıyla mücadele ediyorum. Bu i yapıyorum budur:Farklı sonuçlar, kod formatını değiştirerek yapılardaki bir vektörde bulunan çift değişkenlerin ortalamasını hesaplar mı?

1 Güncellendi: Burada daha fazla bilgi:

Ben piksel kümesi için degrade yönünü hesaplamak ve bir benlik double alanında saklayabilirsiniz struct ilan etti. Yapı elemanları bir vektörde saklanır. Şimdi

myfunct0() { 
    myfunct1(); //adds element to the my_struct_vector 
    (...) 
    int n = 0; 
    double total_ori = 0.0; 
    for (uint i = 0; i < my_struct_vector.size(); ++i) { 
     total_ori += my_struct_vector[i].grad_orientation; 
     n++; 
    } 

    azimuth = (total_ori/n); 
    cout << "Average: " << azimuth * 180/M_PI << endl; // print out in degrees 
} 

:

myfunct1() { 
    (...) 
    c.grad_orientation = (sum_ori/highgrads.size()) + M_PI; // +M_PI because i just want to rotate the angle around 180°. 
    (...) 
    my_struct_vector.push_back(c); 
} 

sonradan c birkaç bir vektör saklanır ve bu gibi bakarak benim vektör her yapı-eleman saklanan her grad_orientation ortalamasını tahmin etmek istiyorum var komik bölüm: Bunu belirli koşullar altında yaparsam, cout, 215.963'u yazdırır. En sık karşılaştığım sonuç budur (Bu sonuç EXACTLY). Bazı durumlarda, yukarıda belirtilen bu matrisleri eklersem veya (evet, gerçekten) grad_orientation numaralı yapıyı kod satırında daha yüksek bir satırda taşırsam 223.442 olsun. Yani kodda iki sonuç arasındaki farkın aşağıdaki sadece geçerli:

struct my_struct { 

std::vector<cv::Point> contour_shadow; 
std::vector<cv::Point> contour_light; 
cv::RotatedRect rect; 
cv::Point pf; 
cv::Point pc; 
double grad_orientation; // this line moved one column down, beneath "grad_flag" results in a differing result. 
bool grad_flag; 
double grad_magnitude; 

};

Yazdırılan sonuçlar yalnızca sütunun yapının bildiriminde değil, aynı zamanda kodumun farklı bölümlerini değiştirdiğimde de bağlıdır.

Bu, çift duyarlılıkla ilgili bir şey olabilir, ancak kod sütunlarını hareket ettirirsem neden değiştirilir?

+0

Bazı arabellek taşması gibi görünüyor. Görüntü değişkenlerinizi bildiren kodu görmeden söylemek zor, ve bunların gerçekleştirilmesi ile işlev çağrıları arasında üstlerinde gerçekleştirilen işlemler. – Rook

+0

, döngüyü nasıl yaptığınızı inceler. bitirme kriterleri craters.size(), ama sonra my_struct [i] ?? Bunun yerine kraterler beklerdim. Başka bir ipucu, iyi bir hata ayıklayıcı kullanmaktır, başka bir nota – Rolle

+0

hiçbir zaman sorun bulacaksınız, "düzenlemek" sizin ilk sorun için tamamen ilgisiz gibi görünüyor ve opencv ile ilgili bir şey yok gibi görünüyor. muhtemelen dizi sınırları veya benzeri – Rolle

cevap

0

Tamam, bu konuda bana yardımcı olduğu için Rolle'a teşekkürler. Umarım cevabını işaretlemek için kendi sorumu cevaplamak yeterli olur mu?
Sorun aslında yapılandırılmamış bellek ve yapının içinde bir bool bayrağı (sonra yanlış bir kararda) kullanıyordu (sıfır değilse, sıfır, sıfır). Oldukça açık olan şeyler, ama koddaki satırların değişmesi (yapının dışına bile!) Yanlış (ama bir şekilde rastgele olmayan) değerlere yol açmıştır.

Bakın burada Are members of a C++ struct initialized to 0 by default?

İlgili konular