【问题标题】:How does one look at imported OpenCV code? (specifically python's cv2)如何查看导入的 OpenCV 代码? (特别是python的cv2)
【发布时间】:2014-06-12 18:04:12
【问题描述】:

我和一个朋友正在使用 OpenCV 进行一些图像处理工作,并想在 python 库中打开 findContours 方法的“黑匣子”,因为文档没有提供比 function definition/parameters 更多的信息。我们已经阅读了寻找轮廓背后的数学知识,但有兴趣查看为此任务编写的特定 OpenCV 代码。

我们尝试过的事情:

我们已经查看了opencv github repository,但似乎我们可以访问的唯一函数/方法是在 c++ 中,我们不确定 opencv 是如何制作其 python 包装器的。

我们还尝试在 python shell 中导入 cv2 并打印源代码的位置,但不知道从哪里开始 .so 文件,并且该目录中的其他内容也没有帮助...

>>> import cv2
>>> print cv2
<module 'cv2' from '/usr/local/lib/python2.7/dist-packages/cv2.so'>

任何指向其他响应的链接(这实际上应该是关于 c++ 和 python 包装器的问题,还是有更简单的方法可以打印出 cv2 模块中的 findContours 代码,或者...?)或关于什么的提示下一步将不胜感激。谢谢!

【问题讨论】:

    标签: python opencv


    【解决方案1】:
    >>> import cv2
    >>> help(cv2.findContours)
    Help on built-in function findContours in module cv2:
    
    findContours(...)
        findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> contours, hierarchy
    

    正如您已经猜到的,c++ -> python 包装代码是从 c++ 头文件生成的,请查看 modules/python/src/gen2.py。

    生成的代码,例如对于 findContours 看起来像这样(pyopencv_generated_funcs.h):

    static PyObject* pyopencv_findContours(PyObject* , PyObject* args, PyObject* kw)
    {
        PyObject* pyobj_image = NULL;
        Mat image;
        PyObject* pyobj_contours = NULL;
        vector_Mat contours;
        PyObject* pyobj_hierarchy = NULL;
        Mat hierarchy;
        int mode=0;
        int method=0;
        PyObject* pyobj_offset = NULL;
        Point offset;
    
        const char* keywords[] = { "image", "mode", "method", "contours", "hierarchy", "offset", NULL };
        if( PyArg_ParseTupleAndKeywords(args, kw, "Oii|OOO:findContours", (char**)keywords, &pyobj_image, &mode, &method, &pyobj_contours, &pyobj_hierarchy, &pyobj_offset) &&
            pyopencv_to(pyobj_image, image, ArgInfo("image", 1)) &&
            pyopencv_to(pyobj_contours, contours, ArgInfo("contours", 1)) &&
            pyopencv_to(pyobj_hierarchy, hierarchy, ArgInfo("hierarchy", 1)) &&
            pyopencv_to(pyobj_offset, offset, ArgInfo("offset", 0)) )
        {
            ERRWRAP2( cv::findContours(image, contours, hierarchy, mode, method, offset));
            return Py_BuildValue("(NN)", pyopencv_from(contours), pyopencv_from(hierarchy));
        }
    
        return NULL;
    }
    

    【讨论】:

    • here是包装函数的来源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 2018-09-03
    相关资源
    最近更新 更多