문서 스캐너를 만들고 있습니다. 나는 이미지 처리를 위해 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) 이상 추가해야합니까 ?
'C++ '태그가'jni'로되어 있습니다. 왜냐하면 여러분의 스니 피트 중 하나에'jni' 코드 (어쨌든'C++ ')가 포함되어 있기 때문입니다. – Nepho
두 번째 읽기 후에, 그것은 순수한'opencv' 문제와 더 비슷합니다. 기본적으로'opencv'를 사용하여 매트릭스/이미지를 자르려면 어떤 방법을 사용해야할까요? – Nepho
전적으로, bouding 나는 bouding 카메라 사진에 강해지고 있습니다. 따라서 캡쳐 버튼을 클릭하면 바운딩 Rect 만 캡쳐해야합니다. @Nepho –