0

In OpenCV Scene Text Detection, we have two C++ functions, with different arguments

void cv::text::detectRegions    (   InputArray  image,
const Ptr< ERFilter > &     er_filter1,
const Ptr< ERFilter > &     er_filter2,
std::vector< std::vector< Point > > &   regions 
)   

void cv::text::detectRegions    (   InputArray  image,
const Ptr< ERFilter > &     er_filter1,
const Ptr< ERFilter > &     er_filter2,
std::vector< Rect > &   groups_rects,
int     method = ERGROUPING_ORIENTATION_HORIZ,
const String &  filename = String(),
float   minProbability = (float) 0.5 
)   

But it's corresponding python function is:

regions= cv.text.detectRegions(image, er_filter1, er_filter2)

How does this python binding decide which C++ function to execute?

3
  • The second functions automatically grayscales the image Commented May 22, 2018 at 13:02
  • Full function signature looks like this: cv2.text.detectRegions(image, er_filter1, er_filter2[, method[, filename[, minProbability]]]) -> groups_rects. Commented May 22, 2018 at 13:41
  • Still the ambiguity remains in both the functions. The python definition is same for both function. Commented May 22, 2018 at 14:54

2 Answers 2

1

The binding happens manually so you need to check the code for python binding in opencv to know which function is used. https://docs.opencv.org/3.4/da/d49/tutorial_py_bindings_basics.html

Sign up to request clarification or add additional context in comments.

Comments

0

The following is the Python code that OpenCV created on my machine for detectRegions function. The Python function signature is: cv2.text.detectRegions(image, er_filter1, er_filter2[, method[, filename[, minProbability]]]) -> groups_rects.

If you look at the code closely, you'll see that two different versions of cv::text::detectRegions is being called based on the number and type of arguments you provide.

static PyObject* pyopencv_cv_text_detectRegions(PyObject* , PyObject* args, PyObject* kw)
{
    using namespace cv::text;

    {
    PyObject* pyobj_image = NULL;
    Mat image;
    PyObject* pyobj_er_filter1 = NULL;
    Ptr<ERFilter> er_filter1;
    PyObject* pyobj_er_filter2 = NULL;
    Ptr<ERFilter> er_filter2;
    vector_vector_Point regions;

    const char* keywords[] = { "image", "er_filter1", "er_filter2", NULL };
    if( PyArg_ParseTupleAndKeywords(args, kw, "OOO:detectRegions", (char**)keywords, &pyobj_image, &pyobj_er_filter1, &pyobj_er_filter2) &&
        pyopencv_to(pyobj_image, image, ArgInfo("image", 0)) &&
        pyopencv_to(pyobj_er_filter1, er_filter1, ArgInfo("er_filter1", 0)) &&
        pyopencv_to(pyobj_er_filter2, er_filter2, ArgInfo("er_filter2", 0)) )
    {
        ERRWRAP2(cv::text::detectRegions(image, er_filter1, er_filter2, regions));
        return pyopencv_from(regions);
    }
    }
    PyErr_Clear();

    {
    PyObject* pyobj_image = NULL;
    UMat image;
    PyObject* pyobj_er_filter1 = NULL;
    Ptr<ERFilter> er_filter1;
    PyObject* pyobj_er_filter2 = NULL;
    Ptr<ERFilter> er_filter2;
    vector_vector_Point regions;

    const char* keywords[] = { "image", "er_filter1", "er_filter2", NULL };
    if( PyArg_ParseTupleAndKeywords(args, kw, "OOO:detectRegions", (char**)keywords, &pyobj_image, &pyobj_er_filter1, &pyobj_er_filter2) &&
        pyopencv_to(pyobj_image, image, ArgInfo("image", 0)) &&
        pyopencv_to(pyobj_er_filter1, er_filter1, ArgInfo("er_filter1", 0)) &&
        pyopencv_to(pyobj_er_filter2, er_filter2, ArgInfo("er_filter2", 0)) )
    {
        ERRWRAP2(cv::text::detectRegions(image, er_filter1, er_filter2, regions));
        return pyopencv_from(regions);
    }
    }
    PyErr_Clear();

    {
    PyObject* pyobj_image = NULL;
    Mat image;
    PyObject* pyobj_er_filter1 = NULL;
    Ptr<ERFilter> er_filter1;
    PyObject* pyobj_er_filter2 = NULL;
    Ptr<ERFilter> er_filter2;
    vector_Rect groups_rects;
    int method=ERGROUPING_ORIENTATION_HORIZ;
    PyObject* pyobj_filename = NULL;
    String filename;
    float minProbability=(float)0.5;

    const char* keywords[] = { "image", "er_filter1", "er_filter2", "method", "filename", "minProbability", NULL };
    if( PyArg_ParseTupleAndKeywords(args, kw, "OOO|iOf:detectRegions", (char**)keywords, &pyobj_image, &pyobj_er_filter1, &pyobj_er_filter2, &method, &pyobj_filename, &minProbability) &&
        pyopencv_to(pyobj_image, image, ArgInfo("image", 0)) &&
        pyopencv_to(pyobj_er_filter1, er_filter1, ArgInfo("er_filter1", 0)) &&
        pyopencv_to(pyobj_er_filter2, er_filter2, ArgInfo("er_filter2", 0)) &&
        pyopencv_to(pyobj_filename, filename, ArgInfo("filename", 0)) )
    {
        ERRWRAP2(cv::text::detectRegions(image, er_filter1, er_filter2, groups_rects, method, filename, minProbability));
        return pyopencv_from(groups_rects);
    }
    }
    PyErr_Clear();

    {
    PyObject* pyobj_image = NULL;
    UMat image;
    PyObject* pyobj_er_filter1 = NULL;
    Ptr<ERFilter> er_filter1;
    PyObject* pyobj_er_filter2 = NULL;
    Ptr<ERFilter> er_filter2;
    vector_Rect groups_rects;
    int method=ERGROUPING_ORIENTATION_HORIZ;
    PyObject* pyobj_filename = NULL;
    String filename;
    float minProbability=(float)0.5;

    const char* keywords[] = { "image", "er_filter1", "er_filter2", "method", "filename", "minProbability", NULL };
    if( PyArg_ParseTupleAndKeywords(args, kw, "OOO|iOf:detectRegions", (char**)keywords, &pyobj_image, &pyobj_er_filter1, &pyobj_er_filter2, &method, &pyobj_filename, &minProbability) &&
        pyopencv_to(pyobj_image, image, ArgInfo("image", 0)) &&
        pyopencv_to(pyobj_er_filter1, er_filter1, ArgInfo("er_filter1", 0)) &&
        pyopencv_to(pyobj_er_filter2, er_filter2, ArgInfo("er_filter2", 0)) &&
        pyopencv_to(pyobj_filename, filename, ArgInfo("filename", 0)) )
    {
        ERRWRAP2(cv::text::detectRegions(image, er_filter1, er_filter2, groups_rects, method, filename, minProbability));
        return pyopencv_from(groups_rects);
    }
    }

    return NULL;
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.