- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从相机拍摄照片并通过 tesseract-ocr 库对其进行 OCR。这是我的完整代码:
list :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.m.ocrapp">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus"/>
<uses-feature android:name="android.hardware.camera.front"/>
<uses-feature android:name="android.hardware.camera.front.autofocus"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
主要 Activity :
package com.m.ocrapp;
public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2{
Scalar CONTOUR_COLOR = new Scalar(255);
private Bitmap bmp;
private Mat mIntermediateMat , mGrey, mRgba;
private JavaCameraView mOpenCvCameraView;
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS: {
mOpenCvCameraView.enableView();
}
break;
default: {
super.onManagerConnected(status);
}
break;
}
}
};
@Override
public void onCameraViewStopped() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
//FULLSCREEN MODE
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_main);
mOpenCvCameraView = findViewById(R.id.my_java_camera);
mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
mOpenCvCameraView.setCvCameraViewListener(this);
}
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
mGrey = inputFrame.gray();
mRgba = inputFrame.rgba();
detectText();
return mRgba;
}
@Override
public void onPause() {
super.onPause();
if (mOpenCvCameraView != null)
mOpenCvCameraView.disableView();
}
@Override
public void onResume() {
super.onResume();
if (!OpenCVLoader.initDebug()) {
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, mLoaderCallback);
} else {
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
public void onDestroy() {
super.onDestroy();
if (mOpenCvCameraView != null)
mOpenCvCameraView.disableView();
}
public void onCameraViewStarted(int width, int height) {
mIntermediateMat = new Mat();
mGrey = new Mat(height, width, CvType.CV_8UC4);
mRgba = new Mat(height, width, CvType.CV_8UC4);
}
private void doOCR(final Bitmap bitmap) {
String text = mTessOCR.getOCRResult(bitmap);
// String temp = mTessOCR.getOCRResult(bitmap);
}
private void detectText()
{
MatOfKeyPoint keypoint = new MatOfKeyPoint();
List<KeyPoint> listpoint;
KeyPoint kpoint;
Mat mask = Mat.zeros(mGrey.size(), CvType.CV_8UC1);
int rectanx1;
int rectany1;
int rectanx2;
int rectany2;
int imgsize = mGrey.height() * mGrey.width();
Scalar zeos = new Scalar(0, 0, 0);
List<MatOfPoint> contour2 = new ArrayList<MatOfPoint>();
Mat kernel = new Mat(1, 50, CvType.CV_8UC1, Scalar.all(255));
Mat morbyte = new Mat();
Mat hierarchy = new Mat();
Rect rectan3;
//
FeatureDetector detector = FeatureDetector
.create(FeatureDetector.MSER);
detector.detect(mGrey, keypoint);
listpoint = keypoint.toList();
//
for (int ind = 0; ind < listpoint.size(); ind++) {
kpoint = listpoint.get(ind);
rectanx1 = (int) (kpoint.pt.x - 0.5 * kpoint.size);
rectany1 = (int) (kpoint.pt.y - 0.5 * kpoint.size);
rectanx2 = (int) (kpoint.size);
rectany2 = (int) (kpoint.size);
if (rectanx1 <= 0)
rectanx1 = 1;
if (rectany1 <= 0)
rectany1 = 1;
if ((rectanx1 + rectanx2) > mGrey.width())
rectanx2 = mGrey.width() - rectanx1;
if ((rectany1 + rectany2) > mGrey.height())
rectany2 = mGrey.height() - rectany1;
Rect rectant = new Rect(rectanx1, rectany1, rectanx2, rectany2);
try {
Mat roi = new Mat(mask, rectant);
roi.setTo(CONTOUR_COLOR);
} catch (Exception ex) {
Log.d("mylog", "mat roi error " + ex.getMessage());
}
}
Imgproc.morphologyEx(mask, morbyte, Imgproc.MORPH_DILATE, kernel);
Imgproc.findContours(morbyte, contour2, hierarchy,
Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_NONE);
/*
for (int ind = 0; ind < contour2.size(); ind++) {
rectan3 = Imgproc.boundingRect(contour2.get(ind));
rectan3 = Imgproc.boundingRect(contour2.get(ind));
if (rectan3.area() > 0.5 * imgsize || rectan3.area() < 100
|| rectan3.width / rectan3.height < 2) {
Mat roi = new Mat(morbyte, rectan3);
roi.setTo(zeos);
} else
Imgproc.rectangle(mRgba, rectan3.br(), rectan3.tl(), CONTOUR_COLOR);
*/
for (int ind = 0; ind < contour2.size(); ind++)
{
rectan3 = Imgproc.boundingRect(contour2.get(ind));
try {
Mat croppedPart;
croppedPart = mIntermediateMat.submat(rectan3);
bmp = Bitmap.createBitmap(croppedPart.width(), croppedPart.height(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(croppedPart, bmp);
} catch (Exception e) {
// Log.d(TAG, "cropped part data error " + e.getMessage());
}
if (bmp != null) {
doOCR(bmp);
}
}
}
}
MyTessOCR:
package com.m.ocrapp;
public class MyTessOCR
{
private String datapath;
private TessBaseAPI mTess;
Context context;
public MyTessOCR(Context context)
{
datapath = Environment.getExternalStorageDirectory() + "/ocrctz/";
File dir = new File(datapath + "/tessdata/");
File file = new File(datapath + "/tessdata/" + "eng.traineddata");
if (!file.exists()) {
Log.d("mylog", "in file doesn't exist");
dir.mkdirs();
copyFile(context);
}
mTess = new TessBaseAPI();
String language = "eng";
mTess.init(datapath, language);
//Auto only mTess.setPageSegMode(TessBaseAPI.PageSegMode.PSM_AUTO_ONLY);
}
public void stopRecognition()
{
mTess.stop();
}
public String getOCRResult(Bitmap bitmap)
{
mTess.setImage(bitmap);
String result = mTess.getUTF8Text();
return result;
}
public void onDestroy()
{
if (mTess != null)
mTess.end();
}
private void copyFile(Context context)
{
AssetManager assetManager = context.getAssets();
try {
InputStream in = assetManager.open("eng.traineddata");
OutputStream out = new FileOutputStream(datapath + "/tessdata/" + "eng.traineddata");
byte[] buffer = new byte[1024];
int read = in.read(buffer);
while (read != -1)
{
out.write(buffer, 0, read);
read = in.read(buffer);
}
} catch (Exception e)
{
Log.d("mylog", "couldn't copy with the following error : " + e.toString());
}
}
// }
}
但在 MainActivity
中的这一行:mTess.init(datapath, language);
我收到此错误消息:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.m.ocrapp/com.m.ocrapp.MainActivity}: java.lang.IllegalArgumentException: Data path does not exist!
我还必须说我已经在项目的 app/src/main/assets
路径中创建了assets
文件夹并复制了 eng.traineddata
来自 https://github.com/tesseract-ocr/tessdata/blob/master/eng.traineddata给它。但我认为这还不够,我应该从 tesseract
复制更多文件到我的项目中吗?但我不知道哪些文件和位置?
(其实我是在一个网站里面看到这段代码,然后按上面的方法试了一下)
最佳答案
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus"/>
<uses-feature android:name="android.hardware.camera.front"/>
<uses-feature android:name="android.hardware.camera.front.autofocus"/>
缺少以下 android 权限。自从您尝试访问文件存储系统以来,您需要这些权限。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
关于android - 错误 : Unable to start activity ComponentInfo{com. m.ocrapp/com.m.ocrapp.MainActivity} : java. lang.IllegalArgumentException:数据路径不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48870079/
因此,我正在学习 Lynda.com 上关于使用 Google map V2 构建移动应用程序的教程,并且我正在学习一个让您创建 map 应用程序的部分,该应用程序以编程方式查找位置,而不是依赖于se
我有一个 Mainactivity,其中包含一个 Layout,它是 4 个子布局的父级。单击子布局后,我将使用一个新 fragment 替换主布局。但我无法在按下返回按钮后返回 MainActivi
如你所见 this@MainActivity 或 MainActivity@this 在 kotlin 中开始 Activity 时有效。我试图找出答案,但我什么也没找到。谁能知道它的确切区别以及哪个
Solve by using getActivity() 我有这个 MainActivity.java 和 RepeatEntry.java 在我的 MainActivity 中,我有这个代码来实现
我正在尝试将 Google Analytics 集成到我的应用程序中,并遵循来自 here 的教程一切就绪: 我有一个 MainActivity,它扩展了 Activity 并附加了三个 Tab Fr
EditText 对象未创建,为什么? EditText editText=(EditText)findViewById(R.id.edittext); 这适用于扩展 AsyncTask 类的应用程序
所以我正在尝试了解 Android Fragments。如果我将以下代码放入我的 MainActivity 中: public void getMessage(Object obj) { Lo
我试图在我的Android设备上运行我的Android应用程序,但它一直显示我的主活动不存在,尽管我的主活动类在那里。我试图创建一个新的项目,然后复制我以前的代码,它在一段时间内奏效了。但随后它又产生
//主要活动 package com.going.books; import androidx.appcompat.app.AppCompatActivity; import androi
这似乎是一个我不好意思问的基本问题,但我对我的 Fragment 学习曲线感到非常沮丧,以至于我会暴露我的无知。 教科书中的一个例子,它削减了很多角落,使得扩展变得困难,即使它们有效,也没有按钮可以点
我正在将我的启动 Activity 从“MainActivity”更改为“RealMain”我在 list 中声明了这一点,但是 MainActivity 仍然首先出现。有人可以启发我吗?代码来 se
它失败了@ below line - bindService(intent, m_serviceConnection, Context.BIND_AUTO_CREATE); 下面是轨迹.... Act
我的项目在调试状态下正常工作。当我打开MainActivity.java文件时,这在import androidx.annotation.NonNull;上显示了问题 并在下面显示错误。 FAILUR
我在 MainActivity 类中看到了这样的代码: class MainActivity : AppCompatActivity() { private val languages = a
我的问题是关于如何制作启动屏幕,并在 MainActivity 完成渲染时完成启动屏幕,而不是通过设置超时。 我已经搜索过如何制作闪屏并且我已经做到了,但主要是他们使用超时来设置闪屏何时必须关闭/完成
大家好,我正在尝试为我的 Android 手机开发一个手电筒应用程序,但是当我运行它时出现错误。 GUI 有 2 个按钮:1 个用于开灯,另一个用于关灯 这是代码: package com.examp
如何解决这个问题? MainActivity.this is not an enclosing class. 谢谢 public class uploadToServer extends AsyncT
我的 logcat 中出现一些错误,并且我的应用程序无法在我的智能手机上运行...我更改了 list 和 MainActivity 中的一些代码(名为 HomaActivity ) 这是我的 list
我想知道使用单例 MainAcitivity 是否是一个糟糕的设计选择,如下所示: public class MainActivity extends AppCompatActivity ... {
我正在创建一个像 WhatsApp 一样的应用程序,但我遇到了问题。该应用程序应该进入 LoginActivity,但它直接进入 MainActivity,而无需我登录。 我尝试更改 Android
我是一名优秀的程序员,十分优秀!