Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for OpenCV text module #168

Closed
manuelh9r opened this issue Mar 1, 2016 · 5 comments
Closed

Add support for OpenCV text module #168

manuelh9r opened this issue Mar 1, 2016 · 5 comments

Comments

@manuelh9r
Copy link

In the OpenCV preset the text module (Scene Text Detection & Scene Text Recognition) is currently disabled.

Would it be possible to enable this module as well? As far as I know this module also has dependencies to Tesseract and Leptonica. How should these dependencies be represented in JavaCpp?

I would be happy to contribute to enable this module. However, I would need some guidance as I am lacking experience with JavaCpp. I already enabled the text module in cppbuild.sh and created a src/main/java/org/bytedeco/javacpp/presets/opencv_text.java file with the following contents:

@Properties(inherit = {opencv_highgui.class, opencv_ml.class}, value = {
    @Platform(include = {"<opencv2/text/erfilter.hpp>", "<opencv2/text/ocr.hpp>", "<opencv2/text.hpp>"}, link = "opencv_text@.3.1"),
    @Platform(value = "windows", link = "opencv_text310")},
        target = "org.bytedeco.javacpp.opencv_text")
public class opencv_text implements InfoMapper {
    public void map(InfoMap infoMap) {
        infoMap.put(new Info("std::vector<cv::text::ERStat>").pointerTypes("ERStatVector").define());
        infoMap.put(new Info("std::vector<cv::Vec2i>").pointerTypes("Vec2iVector").define());
        infoMap.put(new Info("std::vector<double>").pointerTypes("DoubleVector").define());
    infoMap.put(new Info("std::deque<int>").pointerTypes("IntDeque").define());
    }
}

I get a lot of errors during the build of the generated jniopencv_text.cpp file, like the following:

/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6509:19: error: expected ';' before 'adapter4'
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6526:76: error: 'adapter4' was not declared in this scope
         ptr->run(*ptr0, *ptr1, (std::string&)adapter2, ptr3, (std::string&)adapter4, adapter5, arg6);
                                                                            ^
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6539:26: error: 'adapter4' was not declared in this scope
     signed char* rptr4 = adapter4;
                          ^
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6543:65: error: 'template<class P, class T> class VectorAdapter' used without template parameters
         JavaCPP_initPointer(env, arg4, rptr4, rsize4, rowner4, &VectorAdapter::deallocate);
                                                                 ^
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6505:11: warning: unused variable 'owner4' [-Wunused-variable]
     void* owner4 = JavaCPP_getPointerOwner(env, arg4);
           ^
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp: In function 'void Java_org_bytedeco_javacpp_opencv_1text_00024BaseOCR_run__Lorg_bytedeco_javacpp_opencv_1core_00024Mat_2Lorg_bytedeco_javacpp_opencv_1core_00024Mat_2Ljava_lang_String_2Lorg_bytedeco_javacpp_opencv_1core_00024RectVector_2Ljava_lang_String_2Lorg_bytedeco_javacpp_FloatPointer_2I(JNIEnv*, jobject, jobject, jobject, jstring, jobject, jstring, jobject, jint)':
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6589:19: error: missing template arguments before 'adapter4'
     VectorAdapter adapter4(ptr4, size4, owner4);
                   ^
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6589:19: error: expected ';' before 'adapter4'
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6599:76: error: 'adapter4' was not declared in this scope
         ptr->run(*ptr0, *ptr1, (std::string&)adapter2, ptr3, (std::string&)adapter4, adapter5, arg6);
                                                                            ^
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6587:10: warning: unused variable 'size4' [-Wunused-variable]
     jint size4 = 0;
          ^
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6588:11: warning: unused variable 'owner4' [-Wunused-variable]
     void* owner4 = (void*)ptr4;
           ^
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp: In function 'void Java_org_bytedeco_javacpp_opencv_1text_00024BaseOCR_run__Lorg_bytedeco_javacpp_opencv_1core_00024Mat_2Lorg_bytedeco_javacpp_BytePointer_2Lorg_bytedeco_javacpp_opencv_1core_00024RectVector_2Lorg_bytedeco_javacpp_BytePointer_2_3FI(JNIEnv*, jobject, jobject, jobject, jobject, jobject, jfloatArray, jint)':
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6649:19: error: missing template arguments before 'adapter3'
     VectorAdapter adapter3(ptr3, size3, owner3);
                   ^
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6649:19: error: expected ';' before 'adapter3'
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6656:69: error: 'adapter3' was not declared in this scope
         ptr->run(*ptr0, (std::string&)adapter1, ptr2, (std::string&)adapter3, adapter4, arg5);
                                                                     ^
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6669:26: error: 'adapter3' was not declared in this scope
     signed char* rptr3 = adapter3;
                          ^
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6673:65: error: 'template<class P, class T> class VectorAdapter' used without template parameters
         JavaCPP_initPointer(env, arg3, rptr3, rsize3, rowner3, &VectorAdapter::deallocate);
                                                                 ^
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6645:11: warning: unused variable 'owner3' [-Wunused-variable]
     void* owner3 = JavaCPP_getPointerOwner(env, arg3);
           ^
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp: In function 'void Java_org_bytedeco_javacpp_opencv_1text_00024BaseOCR_run__Lorg_bytedeco_javacpp_opencv_1core_00024Mat_2Ljava_lang_String_2Lorg_bytedeco_javacpp_opencv_1core_00024RectVector_2Ljava_lang_String_2Ljava_nio_FloatBuffer_2I(JNIEnv*, jobject, jobject, jstring, jobject, jstring, jobject, jint)':
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6743:19: error: missing template arguments before 'adapter3'
     VectorAdapter adapter3(ptr3, size3, owner3);
                   ^
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6743:19: error: expected ';' before 'adapter3'
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6760:69: error: 'adapter3' was not declared in this scope
         ptr->run(*ptr0, (std::string&)adapter1, ptr2, (std::string&)adapter3, adapter4, arg5);
                                                                     ^
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6741:10: warning: unused variable 'size3' [-Wunused-variable]
     jint size3 = 0;
          ^
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6742:11: warning: unused variable 'owner3' [-Wunused-variable]
     void* owner3 = (void*)ptr3;
           ^
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp: In function 'void Java_org_bytedeco_javacpp_opencv_1text_00024BaseOCR_run__Lorg_bytedeco_javacpp_opencv_1core_00024Mat_2Lorg_bytedeco_javacpp_BytePointer_2Lorg_bytedeco_javacpp_opencv_1core_00024RectVector_2Lorg_bytedeco_javacpp_BytePointer_2Lorg_bytedeco_javacpp_FloatPointer_2I(JNIEnv*, jobject, jobject, jobject, jobject, jobject, jobject, jint)':
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6849:19: error: missing template arguments before 'adapter3'
     VectorAdapter adapter3(ptr3, size3, owner3);
                   ^
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6849:19: error: expected ';' before 'adapter3'
/home/manuel/dev/sources/javacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:6859:69: error: 'adapter3' was not declared in this scope
         ptr->run(*ptr0, (std::string&)adapter1, ptr2, (std::string&)adapter3, adapter4, arg5);
@saudet
Copy link
Member

saudet commented Mar 1, 2016

BTW, you could use Tesseract directly...

@manuelh9r
Copy link
Author

For the scene text recognition I may be able to use Tesseract directly. However, at least the scene text detection part from OpenCV is required (OpenCV doc).

I removed the include of <opencv2/text/ocr.hpp> but still get a issue:
jacacpp-presets/opencv/target/classes/org/bytedeco/javacpp/jniopencv_text.cpp:2643:10: error: cannot convert 'cv::Vec<int, 2>*' to 'cv::Point_<int>*' in assignment rptr = &(*ptr)[(size_t)arg0]; ^

The related generated jniopencv_text.cpp code looks like this:

JNIEXPORT jobject JNICALL Java_org_bytedeco_javacpp_opencv_1text_00024Vec2iVector_get(JNIEnv* env, jobject obj, jlong arg0) {
    ::std::vector<cv::Vec2i>* ptr = (::std::vector<cv::Vec2i>*)jlong_to_ptr(env->GetLongField(obj, JavaCPP_addressFID));
    if (ptr == NULL) {
        env->ThrowNew(JavaCPP_getClass(env, 16), "This pointer address is NULL.");
        return 0;
    }
    jint position = env->GetIntField(obj, JavaCPP_positionFID);
    ptr += position;
    jobject rarg = NULL;
    ::cv::Point_<int>* rptr;
    rptr = &(*ptr)[(size_t)arg0];
    if (rptr != NULL) {
        rarg = JavaCPP_createPointer(env, 22);
        if (rarg != NULL) {
            env->SetLongField(rarg, JavaCPP_addressFID, ptr_to_jlong(rptr));
        }
    }
    return rarg;
}

@saudet
Copy link
Member

saudet commented Mar 3, 2016

Maybe modifying this line from presets/opencv_core.java:

.put(new Info("cv::Vec2i").pointerTypes("Point"))

this way:

.put(new Info("cv::Vec2i").cast().pointerTypes("Point"))

would fix this issue.

@saudet saudet closed this as completed Mar 3, 2016
@saudet saudet reopened this Mar 3, 2016
@saudet
Copy link
Member

saudet commented May 19, 2016

Let me know if you are encountering any other errors. I can help with that. Thanks!

@saudet
Copy link
Member

saudet commented Dec 13, 2016

It's done! See #327 and #333. Enjoy

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants