#362, CvMoments fields now exposed, smoke tested by test_moments
This commit is contained in:
parent
1e5f012e7f
commit
6ebdcb879b
@ -92,11 +92,6 @@ typedef IplImage ROIplImage;
|
|||||||
typedef const CvMat ROCvMat;
|
typedef const CvMat ROCvMat;
|
||||||
typedef PyObject PyCallableObject;
|
typedef PyObject PyCallableObject;
|
||||||
|
|
||||||
struct cvmoments_t {
|
|
||||||
PyObject_HEAD
|
|
||||||
CvMoments a;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct cvfont_t {
|
struct cvfont_t {
|
||||||
PyObject_HEAD
|
PyObject_HEAD
|
||||||
CvFont a;
|
CvFont a;
|
||||||
@ -962,21 +957,6 @@ static void memtrack_specials(void)
|
|||||||
|
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
|
|
||||||
/* cvmoments */
|
|
||||||
|
|
||||||
static PyTypeObject cvmoments_Type = {
|
|
||||||
PyObject_HEAD_INIT(&PyType_Type)
|
|
||||||
0, /*size*/
|
|
||||||
MODULESTR".cvmoments", /*name*/
|
|
||||||
sizeof(cvmoments_t), /*basicsize*/
|
|
||||||
};
|
|
||||||
|
|
||||||
static void cvmoments_specials(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/************************************************************************/
|
|
||||||
|
|
||||||
/* cvmemstorage */
|
/* cvmemstorage */
|
||||||
|
|
||||||
static void cvmemstorage_dealloc(PyObject *self)
|
static void cvmemstorage_dealloc(PyObject *self)
|
||||||
@ -2058,17 +2038,6 @@ static int convert_to_floatPTRPTR(PyObject *o, float*** dst, const char *name =
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int convert_to_CvMomentsPTR(PyObject *o, CvMoments** dst, const char *name = "no_name")
|
|
||||||
{
|
|
||||||
if (PyType_IsSubtype(o->ob_type, &cvmoments_Type)) {
|
|
||||||
(*dst) = &(((cvmoments_t*)o)->a);
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
(*dst) = (CvMoments*)NULL;
|
|
||||||
return failmsg("Expected CvMoments for argument '%s'", name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int convert_to_CvFontPTR(PyObject *o, CvFont** dst, const char *name = "no_name")
|
static int convert_to_CvFontPTR(PyObject *o, CvFont** dst, const char *name = "no_name")
|
||||||
{
|
{
|
||||||
if (PyType_IsSubtype(o->ob_type, &cvfont_Type)) {
|
if (PyType_IsSubtype(o->ob_type, &cvfont_Type)) {
|
||||||
@ -2547,13 +2516,6 @@ static PyObject *FROM_CvRNG(CvRNG r)
|
|||||||
return (PyObject*)m;
|
return (PyObject*)m;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *FROM_CvMoments(CvMoments r)
|
|
||||||
{
|
|
||||||
cvmoments_t *m = PyObject_NEW(cvmoments_t, &cvmoments_Type);
|
|
||||||
m->a = r;
|
|
||||||
return (PyObject*)m;
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *FROM_CvContourTreePTR(CvContourTree *r)
|
static PyObject *FROM_CvContourTreePTR(CvContourTree *r)
|
||||||
{
|
{
|
||||||
cvcontourtree_t *m = PyObject_NEW(cvcontourtree_t, &cvcontourtree_Type);
|
cvcontourtree_t *m = PyObject_NEW(cvcontourtree_t, &cvcontourtree_Type);
|
||||||
@ -3615,6 +3577,13 @@ static PyObject *temp_test(PyObject *self, PyObject *args)
|
|||||||
printf("count=%d\n", count);
|
printf("count=%d\n", count);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
CvMat *src = cvCreateMat(512, 512, CV_8UC3);
|
||||||
|
CvMat *dst = cvCreateMat(512, 512, CV_8UC3);
|
||||||
|
cvPyrMeanShiftFiltering(src, dst, 5, 5);
|
||||||
|
return FROM_CvMat(src);
|
||||||
|
#endif
|
||||||
|
|
||||||
return PyFloat_FromDouble(0.0);
|
return PyFloat_FromDouble(0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3845,7 +3814,6 @@ void initcv()
|
|||||||
MKTYPE(cvmat);
|
MKTYPE(cvmat);
|
||||||
MKTYPE(cvmatnd);
|
MKTYPE(cvmatnd);
|
||||||
MKTYPE(cvmemstorage);
|
MKTYPE(cvmemstorage);
|
||||||
MKTYPE(cvmoments);
|
|
||||||
MKTYPE(cvsubdiv2dedge);
|
MKTYPE(cvsubdiv2dedge);
|
||||||
MKTYPE(cvrng);
|
MKTYPE(cvrng);
|
||||||
MKTYPE(cvseq);
|
MKTYPE(cvseq);
|
||||||
|
@ -346,7 +346,68 @@ for l in open("%s/defs" % sys.argv[1]):
|
|||||||
|
|
||||||
# gen_c[3] is the code, gen_c[4] initializers
|
# gen_c[3] is the code, gen_c[4] initializers
|
||||||
|
|
||||||
s = Template("""
|
gensimple = Template("""
|
||||||
|
/*
|
||||||
|
${cvtype} is the OpenCV C struct
|
||||||
|
${ourname}_t is the Python object
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct ${ourname}_t {
|
||||||
|
PyObject_HEAD
|
||||||
|
${cvtype} v;
|
||||||
|
};
|
||||||
|
|
||||||
|
static PyObject *${ourname}_repr(PyObject *self)
|
||||||
|
{
|
||||||
|
${ourname}_t *p = (${ourname}_t*)self;
|
||||||
|
char str[1000];
|
||||||
|
sprintf(str, "<${ourname} %p>", p);
|
||||||
|
return PyString_FromString(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
${getset_funcs}
|
||||||
|
|
||||||
|
static PyGetSetDef ${ourname}_getseters[] = {
|
||||||
|
|
||||||
|
${getset_inits}
|
||||||
|
{NULL} /* Sentinel */
|
||||||
|
};
|
||||||
|
|
||||||
|
static PyTypeObject ${ourname}_Type = {
|
||||||
|
PyObject_HEAD_INIT(&PyType_Type)
|
||||||
|
0, /*size*/
|
||||||
|
MODULESTR".${ourname}", /*name*/
|
||||||
|
sizeof(${ourname}_t), /*basicsize*/
|
||||||
|
};
|
||||||
|
|
||||||
|
static void ${ourname}_specials(void)
|
||||||
|
{
|
||||||
|
${ourname}_Type.tp_repr = ${ourname}_repr;
|
||||||
|
${ourname}_Type.tp_getset = ${ourname}_getseters;
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *FROM_${cvtype}(${cvtype} r)
|
||||||
|
{
|
||||||
|
${ourname}_t *m = PyObject_NEW(${ourname}_t, &${ourname}_Type);
|
||||||
|
m->v = r;
|
||||||
|
return (PyObject*)m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int convert_to_${cvtype}PTR(PyObject *o, ${cvtype}** dst, const char *name = "no_name")
|
||||||
|
{
|
||||||
|
${allownull}
|
||||||
|
if (PyType_IsSubtype(o->ob_type, &${ourname}_Type)) {
|
||||||
|
*dst = &(((${ourname}_t*)o)->v);
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
(*dst) = (${cvtype}*)NULL;
|
||||||
|
return failmsg("Expected ${cvtype} for argument '%s'", name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
""")
|
||||||
|
|
||||||
|
genptr = Template("""
|
||||||
/*
|
/*
|
||||||
${cvtype} is the OpenCV C struct
|
${cvtype} is the OpenCV C struct
|
||||||
${ourname}_t is the Python object
|
${ourname}_t is the Python object
|
||||||
@ -368,7 +429,7 @@ static PyObject *${ourname}_repr(PyObject *self)
|
|||||||
{
|
{
|
||||||
${ourname}_t *p = (${ourname}_t*)self;
|
${ourname}_t *p = (${ourname}_t*)self;
|
||||||
char str[1000];
|
char str[1000];
|
||||||
sprintf(str, "<${ourname} %p>", p->v);
|
sprintf(str, "<${ourname} %p>", p);
|
||||||
return PyString_FromString(str);
|
return PyString_FromString(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -418,7 +479,7 @@ static int convert_to_${cvtype}PTR(PyObject *o, ${cvtype}** dst, const char *nam
|
|||||||
getset_func_template = Template("""
|
getset_func_template = Template("""
|
||||||
static PyObject *${ourname}_get_${member}(${ourname}_t *p, void *closure)
|
static PyObject *${ourname}_get_${member}(${ourname}_t *p, void *closure)
|
||||||
{
|
{
|
||||||
return ${rconverter}(p->v->${member});
|
return ${rconverter}(p->v${accessor}${member});
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ${ourname}_set_${member}(${ourname}_t *p, PyObject *value, void *closure)
|
static int ${ourname}_set_${member}(${ourname}_t *p, PyObject *value, void *closure)
|
||||||
@ -433,7 +494,7 @@ static int ${ourname}_set_${member}(${ourname}_t *p, PyObject *value, void *clos
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
p->v->${member} = ${converter}(value);
|
p->v${accessor}${member} = ${converter}(value);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -494,6 +555,26 @@ objects = [
|
|||||||
"gain" : 'mr',
|
"gain" : 'mr',
|
||||||
"error_cov_post" : 'mr',
|
"error_cov_post" : 'mr',
|
||||||
}),
|
}),
|
||||||
|
( 'CvMoments', ['copy'], {
|
||||||
|
"m00" : 'f',
|
||||||
|
"m10" : 'f',
|
||||||
|
"m01" : 'f',
|
||||||
|
"m20" : 'f',
|
||||||
|
"m11" : 'f',
|
||||||
|
"m02" : 'f',
|
||||||
|
"m30" : 'f',
|
||||||
|
"m21" : 'f',
|
||||||
|
"m12" : 'f',
|
||||||
|
"m03" : 'f',
|
||||||
|
"mu20" : 'f',
|
||||||
|
"mu11" : 'f',
|
||||||
|
"mu02" : 'f',
|
||||||
|
"mu30" : 'f',
|
||||||
|
"mu21" : 'f',
|
||||||
|
"mu12" : 'f',
|
||||||
|
"mu03" : 'f',
|
||||||
|
"inv_sqrt_m00" : 'f',
|
||||||
|
}),
|
||||||
]
|
]
|
||||||
|
|
||||||
checkers = {
|
checkers = {
|
||||||
@ -528,7 +609,11 @@ for (t, flags, members) in objects:
|
|||||||
map = {'cvtype' : t,
|
map = {'cvtype' : t,
|
||||||
'ourname' : t.replace('Cv', '')}
|
'ourname' : t.replace('Cv', '')}
|
||||||
# gsf is all the generated code for the member accessors
|
# gsf is all the generated code for the member accessors
|
||||||
gsf = "".join([getset_func_template.substitute(map, member = m, checker = checkers[t], converter = converters[t], rconverter = rconverters[t], typename = typenames[t]) for (m, t) in members.items()])
|
if 'copy' in flags:
|
||||||
|
a = '.'
|
||||||
|
else:
|
||||||
|
a = '->'
|
||||||
|
gsf = "".join([getset_func_template.substitute(map, accessor = a, member = m, checker = checkers[t], converter = converters[t], rconverter = rconverters[t], typename = typenames[t]) for (m, t) in members.items()])
|
||||||
# gsi is the generated code for the initializer for each accessor
|
# gsi is the generated code for the initializer for each accessor
|
||||||
gsi = "".join([getset_init_template.substitute(map, member = m) for (m, t) in members.items()])
|
gsi = "".join([getset_init_template.substitute(map, member = m) for (m, t) in members.items()])
|
||||||
# s is the template that pulls everything together
|
# s is the template that pulls everything together
|
||||||
@ -536,7 +621,10 @@ for (t, flags, members) in objects:
|
|||||||
nullcode = """if (o == Py_None) { *dst = (%s*)NULL; return 1; }""" % map['cvtype']
|
nullcode = """if (o == Py_None) { *dst = (%s*)NULL; return 1; }""" % map['cvtype']
|
||||||
else:
|
else:
|
||||||
nullcode = ""
|
nullcode = ""
|
||||||
print >>gen_c[3], s.substitute(map, getset_funcs = gsf, getset_inits = gsi, allownull = nullcode)
|
if 'copy' in flags:
|
||||||
|
print >>gen_c[3], gensimple.substitute(map, getset_funcs = gsf, getset_inits = gsi, allownull = nullcode)
|
||||||
|
else:
|
||||||
|
print >>gen_c[3], genptr.substitute(map, getset_funcs = gsf, getset_inits = gsi, allownull = nullcode)
|
||||||
print >>gen_c[4], "MKTYPE(%s);" % map['ourname']
|
print >>gen_c[4], "MKTYPE(%s);" % map['ourname']
|
||||||
|
|
||||||
for f in gen_c:
|
for f in gen_c:
|
||||||
|
@ -698,6 +698,19 @@ class FunctionTests(OpenCVTests):
|
|||||||
r = cv.MinMaxLoc(scribble)
|
r = cv.MinMaxLoc(scribble)
|
||||||
self.assert_(r == (0, 255, tuple(reversed(lo)), tuple(reversed(hi))))
|
self.assert_(r == (0, 255, tuple(reversed(lo)), tuple(reversed(hi))))
|
||||||
|
|
||||||
|
def xxx_test_PyrMeanShiftFiltering(self): # XXX - ticket #306
|
||||||
|
if 0:
|
||||||
|
src = self.get_sample("samples/c/lena.jpg", cv.CV_LOAD_IMAGE_COLOR)
|
||||||
|
dst = cv.CloneMat(src)
|
||||||
|
cv.PyrMeanShiftFiltering(src, dst, 5, 5)
|
||||||
|
print src, dst
|
||||||
|
self.snap(src)
|
||||||
|
else:
|
||||||
|
r = cv.temp_test()
|
||||||
|
print r
|
||||||
|
print len(r.tostring())
|
||||||
|
self.snap(r)
|
||||||
|
|
||||||
def test_Reshape(self):
|
def test_Reshape(self):
|
||||||
# 97 rows
|
# 97 rows
|
||||||
# 12 cols
|
# 12 cols
|
||||||
@ -1774,6 +1787,10 @@ class AreaTests(OpenCVTests):
|
|||||||
def test_moments(self):
|
def test_moments(self):
|
||||||
im = self.get_sample("samples/c/lena.jpg", 0)
|
im = self.get_sample("samples/c/lena.jpg", 0)
|
||||||
mo = cv.Moments(im)
|
mo = cv.Moments(im)
|
||||||
|
for fld in ["m00", "m10", "m01", "m20", "m11", "m02", "m30", "m21", "m12", "m03", "mu20", "mu11", "mu02", "mu30", "mu21", "mu12", "mu03", "inv_sqrt_m00"]:
|
||||||
|
self.assert_(isinstance(getattr(mo, fld), float))
|
||||||
|
print getattr(mo, fld)
|
||||||
|
|
||||||
orders = []
|
orders = []
|
||||||
for x_order in range(4):
|
for x_order in range(4):
|
||||||
for y_order in range(4 - x_order):
|
for y_order in range(4 - x_order):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user