bytedeco / javacpp-presets

The missing Java distribution of native C++ libraries
Other
2.65k stars 736 forks source link

Add support for OpenCV text module #168

Closed manuelh9r closed 7 years ago

manuelh9r commented 8 years ago

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 commented 8 years ago

BTW, you could use Tesseract directly...

manuelh9r commented 8 years ago

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 commented 8 years ago

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 commented 8 years ago

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

saudet commented 7 years ago

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