3

我最近将 OpenCv 更新到了 3.2.0 版,因此不得不重写我的一些 JNI 包装器。但是,现在它向我抛出了这个错误:

dyld: lazy symbol binding failed: Symbol not found: 
ZN2cv4MSER6createEiiiddiddi
  Referenced from: /Users/kve/Documents/Projects/NU/bot/JDA/libs/libmser.dylib
  Expected in: flat namespace

dyld: Symbol not found: __ZN2cv4MSER6createEiiiddiddi
  Referenced from: /Users/kve/Documents/Projects/NU/bot/JDA/libs/libmser.dylib
  Expected in: flat namespace

这是我使用该MSER::create功能的结果。我已经尝试返回一个新的地址Mat并且它没有出现错误,所以我相信这与其他人遇到的与 MacOS 和 dylibs 相关的类似错误无关(即其他人通常在加载库时遇到问题,而我的是仅与MSER::create)。相信我,我已经在网上搜索了至少 2 个小时来寻找解决方案,但我找不到。

这是我的 MSER.cpp 文件中的相关代码:

JNIEXPORT jlong JNICALL Java_org_opencv_features2d_MSER_create_11(JNIEnv* env, jclass cls, jint delta, jint min_area, jint max_area, jdouble max_variation, jdouble min_diversity, jint max_evolution, jdouble area_threshold, jdouble min_margin, jint edge_blur_size)
{
    static const char method_name[] = "MSSR::create_1";

    Ptr<Feature2D> pointer = MSER::create(delta, min_area, max_area, max_variation, min_diversity, max_evolution, area_threshold, min_margin, edge_blur_size);
    MSER* mser = pointer.dynamicCast<MSER>();
    jlong addr = reinterpret_cast<jlong>(mser);

    return addr;
}

JNI 包装器的代码:

package org.opencv.features2d;

import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.MatOfRect;

import java.io.File;

public class MSER extends FeatureDetector{
    static {
        System.load(new File("libs/libmser.dylib").getAbsolutePath());
    }

    public MSER(long addr) {
        super(addr);
    }

    //          MSER( int _delta=5, int _min_area=60, int _max_area=14400, double _max_variation=0.25, double _min_diversity=.2,
    // C++:     int _max_evolution=200, double _area_threshold=1.01,
    //          double _min_margin=0.003, int _edge_blur_size=5 )

    public MSER(int delta, int minArea, int maxArea, double maxVariation, double minDiversity, int maxEvolution, double areaThreshold, double minMargin, int edgeBlurSize) {
        super(create_1(delta, minArea, maxArea, maxVariation, minDiversity, maxEvolution, areaThreshold, minMargin, edgeBlurSize));
    }


    public MSER() {
        this(5, 60, 14400, 0.25, .2, 200, 1.01, 0.003, 5);
    }

    public void detectRegions(Mat image, MatOfKeyPoint msers, MatOfRect bboxes) {
        detectRegions_0(nativeObj, image.nativeObj, msers.nativeObj, bboxes.nativeObj);
    }

    private static native long create_1(int delta, int minArea, int maxArea, double maxVariation, double minDiversity, int maxEvolution, double areaThreshold, double minMargin, int edgeBlurSize);

    private native void detectRegions_0(long nativeObj, long image_nativeObj, long msers_nativeObj, long bboxes_nativeObj);
}

任何帮助,将不胜感激!

谢谢,
基拉

4

0 回答 0