私は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)の上に何を追加する必要があります?
'あなたのスニペットの1つに 'jni'コード(とにかく' C++ ')が含まれているので、' jni'でタグ付けします。 – Nepho
2度目の読み込み後、純粋な 'opencv'問題のようです。あなたは基本的に、 'opencv'を使ってマトリックス/イメージを切り抜くためにどのような方法を使うのか尋ねるだけです。 – Nepho
完全には、私はカメラを見ることに抵抗しています。だから私はキャプチャボタンをクリックすると、境界Rectだけをキャプチャする必要があります。 @Nepho –