android - 使用 OpenCV 检测账单
问题描述
是否有关于在 android studio 中使用 openCv 的任何新的或最近的教程。我想用它来创建我们的顶点项目。这是一个应用程序,应该使用其相机(或使用图像)检测账单并确定其价值。
我已经创建了一个应用程序,但现在我被困在如何使用 opencv 上,因为我以前没有任何使用它的经验,而且我无法获得任何像样的教程。
这些是我迄今为止创建的。(忽略评论,我和我的兄弟正在尝试对此进行编码,他说最好注释掉一些行而不是删除它)。
activity_convert.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Convert">
<org.opencv.android.JavaCameraView
android:id="@+id/cView"
android:layout_width="343dp"
android:layout_height="303dp"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="4dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.52"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.043" />
</android.support.constraint.ConstraintLayout>
转换.java
package com.example.carlo.thesis;
import android.hardware.Camera;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceView;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.JavaCameraView;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Scalar;
import org.opencv.imgproc.Imgproc;
import java.util.ArrayList;
import java.util.List;
public class Convert extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 {
private static String TAG = "Convert";
JavaCameraView jview;
Mat mRgba, imgGray, imgCanny, mHierarchy;
Scalar CONTOUR_COLOR = new Scalar(255,0,0,255);
static {
if(OpenCVLoader.initDebug()){
Log.i(TAG, "OpenCV loaded.");
}else{
Log.i(TAG, "OpenCV not loaded.");
}
}
BaseLoaderCallback mLoaderCallBack = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status){
case BaseLoaderCallback.SUCCESS:{
jview.enableView();
break;
}
default:{
super.onManagerConnected(status);
break;
}
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_convert);
jview = findViewById(R.id.cView);
jview.setVisibility(SurfaceView.VISIBLE);
jview.setCvCameraViewListener(this);
}
@Override
protected void onPause(){
super.onPause();
if(jview!=null){
jview.disableView();
}
}
@Override
protected void onDestroy(){
super.onDestroy();
if(jview!=null){
jview.disableView();
}
}
@Override
protected void onResume(){
super.onResume();
if (OpenCVLoader.initDebug()){
Log.i(TAG, "OpenCV loaded");
mLoaderCallBack.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}else{
Log.i(TAG, "OpenCV not loaded");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9, this, mLoaderCallBack);
}
}
@Override
public void onCameraViewStarted(int width, int height) {
mHierarchy = new Mat();
mRgba = new Mat(height, width, CvType.CV_8UC4);
imgGray = new Mat(height, width, CvType.CV_8UC1);
imgCanny = new Mat(height, width, CvType.CV_8UC1);
}
@Override
public void onCameraViewStopped() {
mRgba.release();
}
@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
// List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
mRgba = inputFrame.rgba();
final Mat dst = new Mat(mRgba.rows(), mRgba.cols(), mRgba.type());
mRgba.copyTo(dst);
Imgproc.cvtColor(dst, dst, Imgproc.COLOR_BGR2GRAY);
final List<MatOfPoint> points = new ArrayList<>();
final Mat hierarchy = new Mat();
Imgproc.findContours(dst, points, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE);
Imgproc.cvtColor(dst, dst, Imgproc.COLOR_GRAY2BGR);
/* Imgproc.Canny(mRgba, imgCanny, 50, 100);
//Imgproc.cvtColor(imgCanny, imgGray, Imgproc.COLOR_RGB2GRAY);
Imgproc.findContours(imgCanny, contours, mHierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
Imgproc.drawContours(imgCanny, contours, -1, CONTOUR_COLOR);
//Imgproc.findContours(mRgba, contours, mHierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
return contours.get(1);
//return imgCanny;*/
Mat mRgbaT = mRgba.t();
Core.flip(mRgba.t(), mRgbaT, 1);
Imgproc.resize(mRgbaT, mRgbaT, mRgba.size());
return mRgbaT;
}
}
先感谢您!
解决方案
您可以从此处在 GitHub 上找到 OpenCV Android 演示:https ://github.com/opencv/opencv/tree/master/samples/android
适用于 Android 的 OpenCV 教程,它有 Eclipse 步骤。 https://docs.opencv.org/3.4/d5/df8/tutorial_dev_with_OCV_on_Android.html
您也可以在互联网上搜索 OpenCV Android 视频,它将帮助您快速学习。
推荐阅读
- flutter - 如何在flutter中将三个条目放在一行中(设置ui)
- javascript - 为变量赋值的动态目标
- javascript - Antd DatePicker 日期在 onChange 函数中没有变化
- java - java:不兼容的类型:推理变量 RR 具有不兼容的界限
- c++ - WINAPI/C++:鼠标悬停在任何孩子上都不起作用——可能是什么原因?
- javascript - 为什么我的 jquery 只在第二次点击时执行?
- codenameone - scrollComponentToVisible 在 android 上的 codenameone 中不起作用,键盘打开
- typescript - 无法使用 TypeScript 导入 Yarn 工作区子目录
- typescript - 对象文字只能指定已知 > 属性,并且类型中不存在“waitFor”-Typescript
- asp.net-mvc - 引导 datetimepicker 不显示时间图标图像来选择 asp.net mvc 应用程序中的时间