2017-11-27 3 views
0

문서 스캐너를 만들고 있습니다. 나는 이미지 처리를 위해 opencv를 사용하고있다. 카메라보기에서 나는 가장 큰 윤곽에 직사각형을 경계하고있다. 가장 큰 윤곽을 올바르게 감지합니다. 이제 native-lib.cpp로 작성된 boudingRect 만 캡처하려고합니다. 그래서 자바 클래스에서 native-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; 

} 

내가 행렬을 자르기 만 boundingRect 부분을 저장 Imgcodecs.imwrite (파일 이름, mRgba) 이상 추가해야합니까 ?

+0

'C++ '태그가'jni'로되어 있습니다. 왜냐하면 여러분의 스니 피트 중 하나에'jni' 코드 (어쨌든'C++ ')가 포함되어 있기 때문입니다. – Nepho

+1

두 번째 읽기 후에, 그것은 순수한'opencv' 문제와 더 비슷합니다. 기본적으로'opencv'를 사용하여 매트릭스/이미지를 자르려면 어떤 방법을 사용해야할까요? – Nepho

+0

전적으로, bouding 나는 bouding 카메라 사진에 강해지고 있습니다. 따라서 캡쳐 버튼을 클릭하면 바운딩 Rect 만 캡쳐해야합니다. @Nepho –

답변

0

네이티브 JNI 메서드 Java_prisca_ctest_OpenCvCamera_doWithMat을 호출한다고 가정 해 봅시다.

먼저 Java 측에서이 메소드를 호출하려면 선언해야합니다. 이것은이 자바에 의해 실행되어야 함을 의미합니다

  1. 자바 _prisca_ctest_OpenCvCamera_doWithMat : 그것을 선언하려면, 당신은 당신에게 필요한 모든 것을 제공하는 방법의 이름을 이해할 필요가있다.

  2. 자바 _ 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와 잘 맞지는 않을 것입니다. (특히 머리 위로 쓰고 있습니다.)

+0

그걸 알고 있고 이미 JNI 메서드를 호출, 그 이유는 내가 카메라보기에서 직사각형을 받고, 그 사각형 영역을 캡처에 갇혀 있어요. –

+0

귀하의 문제를 이해하려고 노력했지만 귀하의 질문에 정직하게 이해가되지 않습니다. 왜 JNI의 특정 부분을 포함합니까? 지옥, 왜 아래 자바 포함? 나에게 그것은 당신이 원하는 것을 달성하기 위해 올바른 opencv 함수를 찾고있는 것처럼 보인다. 당신은 네이티브 메서드를 호출하는 데 문제가 있다는 의견을 말했고, 나는 방금 그 방법을 연습 해 보았습니다. 그게 니가 원하는게 아니야 ... 나는 너를 더 이상 도울 수 없다. – Nepho

+0

네이티브 오브젝트 호출에 문제가있다. –

관련 문제