SORU
1 Aralık 2009, Salı


opencv çok kanallı elemanın erişim

OpenCV yeni c arayüzü kullanmayı öğrenmek için çalışıyorum.

Ne kadar çok kanallı bir matrisin erişim elemanları. örneğin:

Mat myMat(size(3, 3), CV_32FC2);

for (int i = 0; i < 3;   i)
{
    for (int j = 0; j < 3;   j)
    {
        //myMat_at_(i,j) = (i,j);
    }
}

Bunu yapmanın en kolay yolu nedir? Eski arayüz cvSet2D gibi bir şey
En efficiant yolu nedir? Eski arayüzü doğrudan işaretçileri kullanmaya benzer.

Teşekkür ederim

CEVAP
2 Aralık 2009, ÇARŞAMBA


typedef struct elem_ {
        float f1;
        float f2;
} elem;
elem data[9] = { 0.0f };
CvMat mat = cvMat(3, 3, CV_32FC2, data );

float f1 = CV_MAT_ELEM(mat, elem, row, col).f1;
float f2 = CV_MAT_ELEM(mat, elem, row, col).f2;

CV_MAT_ELEM(mat, elem, row, col).f1 = 1212.0f;
CV_MAT_ELEM(mat, elem, row, col).f2 = 326.0f;

OpenCV2.güncelleme : 0

  1. öğesi temsil etmek için bir tür seçin< / ^ br .

Mat (veya) CvMat 3 boyutu vardır: row, col, kanal.< / ^ br . Satır ve sütun belirterek matristeki bir eleman (veya) piksel ulaşabiliriz.< / ^ br .

CV_32FC2 element 32 bit 2 kanal ile kayan nokta değeri olduğu anlamına gelir.< / ^ br . Yani yukarıdaki kod elem CV_32FC2 kabul edilebilir bir gösterim.< / ^ br .

Senin gibi diğer beyan kullanabilirsiniz. Örneğin :< / ^ br .

typedef struct elem_ { float val[2];    } elem;
typedef struct elem_ { float x;float y; } elem;

OpenCV2.0 matris elemanı gibi göstermek için bazı yeni türleri ekler :< / ^ br .

template<typename _Tp, int cn> class CV_EXPORTS Vec // cxcore.hpp (208)

Vec<float,2> CV_32FC2 veya temsil etmek için kullanabiliriz :< / ^ br .

typedef Vec<float, 2> Vec2f; // cxcore.hpp (254)

Kaynak elemanı temsil edebilecek daha fazla türü için kod bakın.< / ^ br . Burada Vec2f kullanıyoruz

  1. elemanın erişim

Mat sınıf öğesine erişmek için en kolay ve efficiant yolu Mat::.< / ^ br . 4 aşırı yükleme vardır :

template<typename _Tp> _Tp& at(int y, int x);                // cxcore.hpp (868)
template<typename _Tp> const _Tp& at(int y, int x) const;    // cxcore.hpp (870)
template<typename _Tp> _Tp& at(Point pt);                    // cxcore.hpp (869)
template<typename _Tp> const _Tp& at(Point pt) const;        // cxcore.hpp (871)
// defineded in cxmat.hpp (454-468)

// we can access the element like this :
Mat m( Size(3,3) , CV_32FC2 );
Vec2f& elem = m.at<Vec2f>( row , col ); // or m.at<Vec2f>( Point(col,row) );
elem[0] = 1212.0f;
elem[1] = 326.0f;
float c1 = m.at<Vec2f>( row , col )[0]; // or m.at<Vec2f>( Point(col,row) );
float c2 = m.at<Vec2f>( row , col )[1];
m.at<Vec2f>( row, col )[0] = 1986.0f;
m.at<Vec2f>( row, col )[1] = 326.0f;
  1. eski arayüzü ile etkileşim

Mat 2 dönüştürme fonksiyonları sağlar:< / ^ br .

// converts header to CvMat; no data is copied     // cxcore.hpp (829)
operator CvMat() const;                            // defined in cxmat.hpp
// converts header to IplImage; no data is copied
operator IplImage() const;

// we can interact a Mat object with old interface :
Mat new_matrix( ... );
CvMat old_matrix = new_matrix;  // be careful about its lifetime
CV_MAT_ELEM(old_mat, elem, row, col).f1 = 1212.0f;

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • curioustravelers

    curioustrave

    12 AĞUSTOS 2006
  • jedimasterkyle

    jedimasterky

    11 ŞUBAT 2006
  • Samvith V Rao

    Samvith V Ra

    20 EKİM 2006