2017-11-27 3 views
0

私はDocument Scannerを作成しています。私は画像処理にopencvを使用しています。カメラのビューでは、私は最大の輪郭の矩形の境界を定めています。それは、最大の輪郭を適切に検出しています。そして今、私はnative-lib.cppで書かれたboudingRectだけをキャプチャしたいと思います。だから私はJavaクラスのネイティブlibのオブジェクトが欲しいです。それを手伝ってください。Javaでnative-libのオブジェクトを呼び出す方法

ネイティブ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; 

} 

iは行列をトリミングのみboundingRectの一部を保存するためにImgcodecs.imwrite(ファイル名、mRgba)の上に何を追加する必要があります?

+0

'あなたのスニペットの1つに 'jni'コード(とにかく' C++ ')が含まれているので、' jni'でタグ付けします。 – Nepho

+1

2度目の読み込み後、純粋な 'opencv'問題のようです。あなたは基本的に、 'opencv'を使ってマトリックス/イメージを切り抜くためにどのような方法を使うのか尋ねるだけです。 – Nepho

+0

完全には、私はカメラを見ることに抵抗しています。だから私はキャプチャボタンをクリックすると、境界Rectだけをキャプチャする必要があります。 @Nepho –

答えて

0

ネイティブJNIメソッドJava_prisca_ctest_OpenCvCamera_doWithMatを呼び出すとします。

まず、このメソッドをJava側から呼び出すには、宣言する必要があります。これは、このは、Javaで実行されることを意味します

  1. のJava _prisca_ctest_OpenCvCamera_doWithMat:それを宣言するために、あなたはあなたが必要なすべてを提供する方法、の名前を理解する必要があります。

  2. Java_ prisca_ctest _OpenCvCamera_doWithMat:この部分は、クラスのパッケージです。

  3. Java_prisca_ctest_ OpenCvCamera _doWithMat:この部分は、Javaクラスの名前です。

  4. Java_prisca_ctest_OpenCvCamera_ doWithMat:この部分は、メソッドの名前です。

これを念頭に置いて、パラメータを知る必要があります。この場合は簡単です:2つの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(特に私の頭の上からそれについて書いています)をうまく使っていません。しかし、これはあなたを起動させるはずです:)

+0

私はそれを知っているし、すでにJNIメソッドを呼び出す、それは私がカメラのビューでRectangleを取得する理由、私は長方形領域をキャプチャしていた。 –

+0

私はあなたの問題を理解しようとしましたが、あなたの質問は正直に意味がありません。なぜあなたのJNIの特定の部分を含めるのですか?地獄、なぜ下のJavaも含めますか?私にとっては、あなたが達成したいことを達成するために正しいopencv関数を探しているようです。あなたは、ネイティブメソッドを呼び出すのに問題があったというコメントで、私はちょうどあなたにそれを行う方法のウォークスルーを教えました。それがあなたが望んでいたものでないなら...私はあなたをさらに助けることができません – Nepho

+0

ネイティブオブジェクトを呼び出す際に問題があります –

関連する問題