Merge pull request #12678 from cv3d:cleanup/python/enums

pull/12653/head
Alexander Alekhin 6 years ago
commit 83efde6243
  1. 6
      modules/core/misc/python/pyopencv_core.hpp
  2. 3
      modules/core/misc/python/pyopencv_umat.hpp
  3. 15
      modules/features2d/misc/python/pyopencv_features2d.hpp
  4. 5
      modules/objdetect/misc/python/pyopencv_objdetect.hpp
  5. 1
      modules/python/src2/cv2.cpp
  6. 37
      modules/python/src2/gen2.py
  7. 5
      modules/stitching/misc/python/pyopencv_stitching.hpp
  8. 27
      modules/videoio/misc/python/pyopencv_videoio.hpp

@ -15,16 +15,10 @@ CV_PY_TO_CLASS(cuda::HostMem);
CV_PY_TO_CLASS_PTR(cuda::GpuMat); CV_PY_TO_CLASS_PTR(cuda::GpuMat);
CV_PY_TO_CLASS_PTR(cuda::GpuMat::Allocator); CV_PY_TO_CLASS_PTR(cuda::GpuMat::Allocator);
CV_PY_TO_ENUM(cuda::Event::CreateFlags);
CV_PY_TO_ENUM(cuda::HostMem::AllocType);
CV_PY_TO_ENUM(cuda::FeatureSet);
CV_PY_FROM_CLASS(cuda::GpuMat); CV_PY_FROM_CLASS(cuda::GpuMat);
CV_PY_FROM_CLASS(cuda::Stream); CV_PY_FROM_CLASS(cuda::Stream);
CV_PY_FROM_CLASS(cuda::HostMem); CV_PY_FROM_CLASS(cuda::HostMem);
CV_PY_FROM_CLASS_PTR(cuda::GpuMat::Allocator); CV_PY_FROM_CLASS_PTR(cuda::GpuMat::Allocator);
CV_PY_FROM_ENUM(cuda::DeviceInfo::ComputeMode);
#endif #endif

@ -6,9 +6,6 @@ typedef std::vector<Range> vector_Range;
CV_PY_TO_CLASS(UMat); CV_PY_TO_CLASS(UMat);
CV_PY_FROM_CLASS(UMat); CV_PY_FROM_CLASS(UMat);
CV_PY_TO_ENUM(UMatUsageFlags);
CV_PY_FROM_ENUM(AccessFlag);
CV_PY_TO_ENUM(AccessFlag);
static bool cv_mappable_to(const Ptr<Mat>& src, Ptr<UMat>& dst) static bool cv_mappable_to(const Ptr<Mat>& src, Ptr<UMat>& dst)
{ {

@ -6,19 +6,4 @@ typedef FastFeatureDetector::DetectorType FastFeatureDetector_DetectorType;
typedef DescriptorMatcher::MatcherType DescriptorMatcher_MatcherType; typedef DescriptorMatcher::MatcherType DescriptorMatcher_MatcherType;
typedef KAZE::DiffusivityType KAZE_DiffusivityType; typedef KAZE::DiffusivityType KAZE_DiffusivityType;
typedef ORB::ScoreType ORB_ScoreType; typedef ORB::ScoreType ORB_ScoreType;
CV_PY_FROM_ENUM(AKAZE::DescriptorType);
CV_PY_TO_ENUM(AKAZE::DescriptorType);
CV_PY_FROM_ENUM(AgastFeatureDetector::DetectorType);
CV_PY_TO_ENUM(AgastFeatureDetector::DetectorType);
CV_PY_FROM_ENUM(DrawMatchesFlags);
CV_PY_TO_ENUM(DrawMatchesFlags);
CV_PY_FROM_ENUM(FastFeatureDetector::DetectorType);
CV_PY_TO_ENUM(FastFeatureDetector::DetectorType);
CV_PY_FROM_ENUM(DescriptorMatcher::MatcherType);
CV_PY_TO_ENUM(DescriptorMatcher::MatcherType);
CV_PY_FROM_ENUM(KAZE::DiffusivityType);
CV_PY_TO_ENUM(KAZE::DiffusivityType);
CV_PY_FROM_ENUM(ORB::ScoreType);
CV_PY_TO_ENUM(ORB::ScoreType);
#endif #endif

@ -5,9 +5,4 @@
typedef HOGDescriptor::HistogramNormType HOGDescriptor_HistogramNormType; typedef HOGDescriptor::HistogramNormType HOGDescriptor_HistogramNormType;
typedef HOGDescriptor::DescriptorStorageFormat HOGDescriptor_DescriptorStorageFormat; typedef HOGDescriptor::DescriptorStorageFormat HOGDescriptor_DescriptorStorageFormat;
CV_PY_FROM_ENUM(HOGDescriptor::HistogramNormType);
CV_PY_TO_ENUM(HOGDescriptor::HistogramNormType);
CV_PY_FROM_ENUM(HOGDescriptor::DescriptorStorageFormat);
CV_PY_TO_ENUM(HOGDescriptor::DescriptorStorageFormat);
#endif #endif

@ -1669,6 +1669,7 @@ static int convert_to_char(PyObject *o, char *dst, const char *name = "no_name")
# pragma GCC diagnostic ignored "-Wmissing-field-initializers" # pragma GCC diagnostic ignored "-Wmissing-field-initializers"
#endif #endif
#include "pyopencv_generated_enums.h"
#include "pyopencv_custom_headers.h" #include "pyopencv_custom_headers.h"
#include "pyopencv_generated_types.h" #include "pyopencv_generated_types.h"
#include "pyopencv_generated_funcs.h" #include "pyopencv_generated_funcs.h"

@ -691,7 +691,7 @@ class FuncInfo(object):
defval0 = "0" defval0 = "0"
tp1 = tp.replace("*", "_ptr") tp1 = tp.replace("*", "_ptr")
tp_candidates = [a.tp, normalize_class_name(self.namespace + "." + a.tp)] tp_candidates = [a.tp, normalize_class_name(self.namespace + "." + a.tp)]
if any(tp in codegen.enumTypes for tp in tp_candidates): if any(tp in codegen.enums.keys() for tp in tp_candidates):
defval0 = "static_cast<%s>(%d)" % (a.tp, 0) defval0 = "static_cast<%s>(%d)" % (a.tp, 0)
amapping = simple_argtype_mapping.get(tp, (tp, "O", defval0)) amapping = simple_argtype_mapping.get(tp, (tp, "O", defval0))
@ -866,8 +866,9 @@ class PythonWrapperGenerator(object):
self.classes = {} self.classes = {}
self.namespaces = {} self.namespaces = {}
self.consts = {} self.consts = {}
self.enumTypes = [] self.enums = {}
self.code_include = StringIO() self.code_include = StringIO()
self.code_enums = StringIO()
self.code_types = StringIO() self.code_types = StringIO()
self.code_funcs = StringIO() self.code_funcs = StringIO()
self.code_type_reg = StringIO() self.code_type_reg = StringIO()
@ -925,11 +926,11 @@ class PythonWrapperGenerator(object):
#print(cname + ' => ' + str(py_name) + ' (value=' + value + ')') #print(cname + ' => ' + str(py_name) + ' (value=' + value + ')')
def add_enum(self, name, decl): def add_enum(self, name, decl):
enumType = normalize_class_name(name) wname = normalize_class_name(name)
if enumType.endswith("<unnamed>"): if wname.endswith("<unnamed>"):
enumType = None wname = None
else: else:
self.enumTypes.append(enumType) self.enums[wname] = name
const_decls = decl[3] const_decls = decl[3]
for decl in const_decls: for decl in const_decls:
@ -1020,6 +1021,21 @@ class PythonWrapperGenerator(object):
self.code_ns_reg.write(' init_submodule(root, MODULESTR"%s", methods_%s, consts_%s);\n' % (ns_name[2:], wname, wname)) self.code_ns_reg.write(' init_submodule(root, MODULESTR"%s", methods_%s, consts_%s);\n' % (ns_name[2:], wname, wname))
self.code_ns_reg.write('};\n') self.code_ns_reg.write('};\n')
def gen_enum_reg(self, enum_name):
name_seg = enum_name.split(".")
is_enum_class = False
if len(name_seg) >= 2 and name_seg[-1] == name_seg[-2]:
enum_name = ".".join(name_seg[:-1])
is_enum_class = True
wname = normalize_class_name(enum_name)
cname = enum_name.replace(".", "::")
code = ""
if re.sub(r"^cv\.", "", enum_name) != wname:
code += "typedef {0} {1};\n".format(cname, wname)
code += "CV_PY_FROM_ENUM({0});\nCV_PY_TO_ENUM({0});\n\n".format(wname)
self.code_enums.write(code)
def save(self, path, name, buf): def save(self, path, name, buf):
with open(path + "/" + name, "wt") as f: with open(path + "/" + name, "wt") as f:
@ -1134,7 +1150,13 @@ class PythonWrapperGenerator(object):
self.gen_namespace(ns_name) self.gen_namespace(ns_name)
self.gen_namespaces_reg() self.gen_namespaces_reg()
# step 4: generate the code for constants # step 4: generate the code for enum types
enumlist = list(self.enums.values())
enumlist.sort()
for name in enumlist:
self.gen_enum_reg(name)
# step 5: generate the code for constants
constlist = list(self.consts.items()) constlist = list(self.consts.items())
constlist.sort() constlist.sort()
for name, constinfo in constlist: for name, constinfo in constlist:
@ -1143,6 +1165,7 @@ class PythonWrapperGenerator(object):
# That's it. Now save all the files # That's it. Now save all the files
self.save(output_path, "pyopencv_generated_include.h", self.code_include) self.save(output_path, "pyopencv_generated_include.h", self.code_include)
self.save(output_path, "pyopencv_generated_funcs.h", self.code_funcs) self.save(output_path, "pyopencv_generated_funcs.h", self.code_funcs)
self.save(output_path, "pyopencv_generated_enums.h", self.code_enums)
self.save(output_path, "pyopencv_generated_types.h", self.code_types) self.save(output_path, "pyopencv_generated_types.h", self.code_types)
self.save(output_path, "pyopencv_generated_type_reg.h", self.code_type_reg) self.save(output_path, "pyopencv_generated_type_reg.h", self.code_type_reg)
self.save(output_path, "pyopencv_generated_ns_reg.h", self.code_ns_reg) self.save(output_path, "pyopencv_generated_ns_reg.h", self.code_ns_reg)

@ -1,9 +1,4 @@
#ifdef HAVE_OPENCV_STITCHING #ifdef HAVE_OPENCV_STITCHING
typedef Stitcher::Status Status; typedef Stitcher::Status Status;
template<>
PyObject* pyopencv_from(const Status& value)
{
return PyInt_FromLong(value);
}
#endif #endif

@ -1,33 +1,6 @@
#ifdef HAVE_OPENCV_VIDEOIO #ifdef HAVE_OPENCV_VIDEOIO
typedef std::vector<VideoCaptureAPIs> vector_VideoCaptureAPIs; typedef std::vector<VideoCaptureAPIs> vector_VideoCaptureAPIs;
template<>
bool pyopencv_to(PyObject *o, cv::VideoCaptureAPIs &v, const char *name)
{
(void)name;
v = CAP_ANY;
if (!o || o == Py_None)
return false;
else if (PyLong_Check(o))
{
v = VideoCaptureAPIs((int64)PyLong_AsLongLong(o));
return true;
}
else if (PyInt_Check(o))
{
v = VideoCaptureAPIs((int64)PyInt_AS_LONG(o));
return true;
}
else
return false;
}
template<>
PyObject* pyopencv_from(const cv::VideoCaptureAPIs &v)
{
return pyopencv_from((int)(v));
}
template<> struct pyopencvVecConverter<cv::VideoCaptureAPIs> template<> struct pyopencvVecConverter<cv::VideoCaptureAPIs>
{ {
static bool to(PyObject* obj, std::vector<cv::VideoCaptureAPIs>& value, const ArgInfo info) static bool to(PyObject* obj, std::vector<cv::VideoCaptureAPIs>& value, const ArgInfo info)

Loading…
Cancel
Save