Вызов к method_two выдаст исключение для того, чтобы не принимать сам параметр, время выполнения Python автоматически передаст его.
, Если Вы хотите создать статический метод в классе Python, украсьте его staticmethod decorator
.
Class Test(Object):
@staticmethod
def method_two():
print "Called method_two"
Test.method_two()
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.0
Мат (или CvMat) имеет 3 измерения: строка, столбец, канал.
Мы можем получить доступ к одному элементу (или пикселю) в матрице, указав строку и столбец.
CV_32FC2
означает, что элемент представляет собой 32-битное значение с плавающей запятой с 2 каналами.
Итак, elem в приведенном выше коде является одним из приемлемых представлений CV_32FC2
.
Вы можете использовать другие представления, которые вам нравятся. Например:
typedef struct elem_ { float val[2]; } elem;
typedef struct elem_ { float x;float y; } elem;
OpenCV2.0 добавляет несколько новых типов для представления элемента в матрице, например:
template<typename _Tp, int cn> class CV_EXPORTS Vec // cxcore.hpp (208)
Таким образом, мы можем использовать Vec
для представления CV_32FC2
] или используйте:
typedef Vec<float, 2> Vec2f; // cxcore.hpp (254)
См. исходный код, чтобы получить больше типов, которые могут представлять ваш элемент.
Здесь мы используем Vec2f
Самый простой и эффективный способ получить доступ к элементу в классе Mat - это Mat :: at.
Имеет 4 перегрузки:
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;
Mat предоставляет 2 функции преобразования:
// 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;
Vic, вы должны использовать Vec3b вместо Vec3i:
for (int i=0; i<image.rows; i++)
{
for (int j=0; j<image.cols; j++)
{
if (someArray[i][j] == 0)
{
image.at<Vec3b>(i,j)[0] = 0;
image.at<Vec3b>(i,j)[1] = 0;
image.at<Vec3b>(i,j)[2] = 0;
}
}
}