package com.example.cppinandroid;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import org.opencv.core.Mat;
import java.io.File;
import static org.opencv.imgcodecs.Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE;
import org.opencv.imgcodecs.Imgcodecs;
public class MainActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = findViewById( R.id.sample_text );
Mat image;
image = Imgcodecs.imread( "/home/<myName>/a.png", CV_LOAD_IMAGE_GRAYSCALE);
if ( image.size().height > 0 )
{
tv.setText( "No datfa in image!");
}
else
{
tv.setText( "xxff " + image.size().height);
}
}
}
我没有使用任何可绘制或外部媒体。图像存在于主文件夹中,可以通过提供完全相同的路径由普通的 opencv c++ 程序打开。
Someone here told me that native C++ NDK will not be able to read Linux paths .好吧。这里全是Java。
当我执行它时,它总是进入 else 语句并将高度显示为 0.0
。
我已经删除了多余的代码。
在 Linux 上这个程序从主文件夹读取普通 png 的方法是什么?
最佳答案
所有 Android 设备或模拟器都无法访问外部存储,例如您的 Linux 存储分区,它们可以访问其内部存储或 SD 卡。在模拟器的情况下,它们的内部存储是使用不易读取的特定格式的文件来模拟的。在启用了开发人员选项的模拟器或设备中,可以使用 adb
在 Android SDK 中找到的命令 platform-tools
将文件传输到其中的文件夹:
adb push file.jpg /sdcard/file.jpg
之后,您需要更改您在代码中使用的文件的路径以匹配并启用 READ_EXTERNAL_STORAGE 的权限(这里的外部意味着您正在运行的应用程序外部,但仍然在设备内部)。
Someone here told me that native C++ NDK will not be able to read Linux paths. Alright. Here it is all Java.
查看您的问题和答案,首先这是同一个问题,试图访问不属于设备/模拟器内部存储的文件。然而答案并不完全正确,只要授予应用程序权限,C/C++ 代码就可以访问内部存储的文件和目录。我建议您首先尝试使用 Java 解决问题,然后切换回您在其他问题中使用的代码,但路径已更正。使用 Java,您将为 OpenCV API 使用 Java 包装器,因此您需要调用 OpenCVLoader.initDebug()
加载包装库。使用纯 NDK 时,您只需加载已编译的库(您使用 native C/C++ 代码创建的 System.loadLibrary(<libname>)
。
关于java - imread 没有从 Linux 读取 Java Android 上的现有图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61725184/