【问题标题】:How to call object of the native-lib in java如何在java中调用native-lib的对象
【发布时间】:2017-11-27 18:21:25
【问题描述】:

我正在制作文档扫描仪。我正在使用 opencv 进行图像处理。在相机视图中,我在最大轮廓上包围矩形。它正在正确检测最大轮廓。现在我只想捕获用 native-lib.cpp 编写的 boudingRect。所以我想要java类中的native-lib对象。帮助得到那个。

Native-lib.cpp

extern "C"
JNIEXPORT void JNICALL
Java_prisca_ctest_OpenCvCamera_doWithMat(JNIEnv *env, jobject instance, jlong matAddrGr,
                                     jlong matAddrRgba) {
try {
    Mat &image = *(Mat *) matAddrRgba;
    Rect bounding_rect;

    Mat thr(image.rows, image.cols, CV_8UC1);
    cvtColor(image, thr, CV_BGR2GRAY); //Convert to gray
    threshold(thr, thr, 150, 255, THRESH_BINARY + THRESH_OTSU); //Threshold the gray

    vector<vector<Point> > contours; // Vector for storing contour
    vector<Vec4i> hierarchy;
    findContours(thr, contours, hierarchy, CV_RETR_CCOMP,
                 CV_CHAIN_APPROX_SIMPLE); // Find the contours in the image
    sort(contours.begin(), contours.end(),
         compareContourAreas);            //Store the index of largest contour
    bounding_rect = boundingRect((const _InputArray &) contours[0]);

rectangle(image, bounding_rect, Scalar(250, 250, 250) , 5);
} catch (int a) {

}
}

活动

 protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.cam);
    mOpenCvCameraView = (JavaCameraView) findViewById(R.id.tutorial1_activity_java_surface_view);
    mOpenCvCameraView.setVisibility(View.VISIBLE);

    mOpenCvCameraView.setCvCameraViewListener(this);
    btnCapture = (Button) findViewById(R.id.btnCapture);
    btnCapture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String timestamp = new SimpleDateFormat("ddMMyyyy_HHmmss", Locale.US).format(new Date());
            File imgFolder = new File(FILE_LOCATION);
            imgFolder.mkdir();
            File image = new File(imgFolder, "Scan" + timestamp + ".jpg");
            String fileName = FILE_LOCATION +
                    "/Scan" + timestamp + ".jpg";
            Toast.makeText(OpenCvCamera.this, image + " saved", Toast.LENGTH_SHORT).show();
            Imgcodecs.imwrite(fileName, mRgba);
        }
    }) ;
}

@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
    // input frame has RGBA format
    mRgba = inputFrame.rgba();
    mGray = inputFrame.gray();
    doWithMat(mGray.getNativeObjAddr(), mRgba.getNativeObjAddr());
    return mRgba;

}

我应该在 Imgcodecs.imwrite(fileName, mRgba) 上面添加什么来裁剪矩阵并只保存 boundingRect 部分?

【问题讨论】:

  • 请注意,您应该将c++ 标记替换为jni,因为您的一个sn-p 包含jni 代码(无论如何都是c++
  • 第二次阅读后,它似乎更像是一个纯粹的opencv 问题。您基本上只是在询问使用opencv 裁剪矩阵/图像的方法,对吗?
  • 不完全是,因为我在cameraview上得到了boudingRect。所以当我点击捕获按钮时,它应该只捕获边界矩形。 @Nepho
  • 目前我可以捕捉图像,但它捕捉整个表面。 @Nepho
  • 正如我所说,您似乎正在寻找“如何在 OpenCV 中裁剪 boudingRect”的简单答案,而无需先阅读文档。如果您不想阅读它的文档,我建议您尝试在线查找,或发布更相关的问题

标签: java android opencv image-processing java-native-interface


【解决方案1】:

假设你要调用原生 JNI 方法Java_prisca_ctest_OpenCvCamera_doWithMat

首先,要从 Java 端调用此方法,您需要声明它。要声明它,您需要了解方法的名称,它会为您提供所需的一切:

  1. Java_prisca_ctest_OpenCvCamera_doWithMat:表示这是由Java执行的。

  2. Java_prisca_ctest_OpenCvCamera_doWithMat:这部分是类的包。

  3. Java_prisca_ctest_OpenCvCamera_doWithMat:这部分是Java类的名称。

  4. Java_prisca_ctest_OpenCvCamera_doWithMat:这部分是方法的名称。

考虑到这一点,我们需要知道参数。在这种情况下,这很简单:两个 jlong 参数转换为 Java long

创建一个OpenCvCamera.java 类,并将其放入其中:

package prisca.ctest; // This part might actually be ctest.prisca, not sure

public class OpenCvCamera {
    public static native void doWithMat(long matAddrGr, long matAddrRgba);
}

您现在可以通过导入类并调用OpenCvCamera.doWithMat(long, long) 来调用该方法。请注意,这可能不是 100% 正确的,我对 JNI 不是很好(尤其是在我的脑海中写下它),但这应该让你开始:)

【讨论】:

  • 我知道并且已经调用了 JNI 方法,这就是为什么我在相机视图中获取 Rectangle,我被困在捕获矩形区域。
  • 我试图理解你的问题,但你的问题老实说没有意义。为什么要包含 JNI 的特定部分?见鬼,为什么还要包括下面的java?在我看来,您似乎只是在寻找正确的 opencv 函数来实现您想要实现的目标。您在评论中说您在调用本机方法时遇到了麻烦,我只是为您提供了如何做到这一点的演练。如果这不是你想要的......我不能再帮你了
  • 调用原生对象时遇到问题
猜你喜欢
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多