如何查看导入的OpenCV代码?(特别是python的cv2)

4 投票
1 回答
2165 浏览
提问于 2025-04-18 09:35

我和我的朋友正在用OpenCV做一些图像处理的工作,我们想深入了解一下Python库中的findContours方法,因为文档里提供的信息除了函数定义和参数之外并不多。我们已经了解了一些关于寻找轮廓的数学原理,但我们更想看看OpenCV为这个任务写的具体代码。

我们尝试过的事情:

我们查看了opencv的GitHub仓库,但似乎我们能接触到的函数和方法都是用C++写的,我们不太确定OpenCV是怎么为Python制作这些包装的。

我们还尝试在Python环境中导入cv2,并打印出源代码的位置,但对.so文件不知道从哪里入手,而那个目录里的其他内容也没有帮助...

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

如果有其他相关的链接(这个问题到底是关于C++和Python包装的,还是有没有更简单的方法可以打印出cv2模块中的findContours代码,或者...?)或者有什么建议该怎么做的,我们会非常感激。谢谢!

1 个回答

2

>>> 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;
}

撰写回答