我一直在使用this教程对图片进行面部检测。问题是当我获取在Java上使用的文件路径时
String xmlFile = "E:/OpenCV/facedetect/lbpcascade_frontalface.xml";
CascadeClassifier classifier = new CascadeClassifier(xmlFile);
如何在android studio上翻译。我尝试将lbpcascade_frontalface.xml放在原始资源上。 CascadeClassifier是opencv库提供的类。唯一的问题是它们仅加载了字符串路径(在xmlfile上)。 这是我的代码。
String pathtoRes = getRawPathAtempt2(context);
CascadeClassifier cascadeClassifier = new CascadeClassifier();
cascadeClassifier.load(pathtoRes);
我翻译成这样的方法。
public String getRawPathAtempt2(Context context) {
return "android.resource://" + context.getPackageName() + "/raw/" + "lbpcascade_frontalface.xml";
}
我通过opencv收到断言错误,告诉我文件为空。那意味着当我在方法中使用文件路径时,我错了。如何获取原始资源上的文件路径?帮帮我,请问我已经被困了好几天了
答案 0 :(得分:2)
如何获取原始资源上的文件路径?
不能。没有路。它是开发计算机上的文件。它不是设备上的文件。相反,它是APK文件中的一项,即您在设备上的应用。
如果您的库支持InputStream
而不是文件系统路径,请在getResources().openRawResource()
上使用Context
,以在原始资源上获取InputStream
。
答案 1 :(得分:0)
Uri video = Uri.parse("android.resource://com.test.test/raw/filename");
使用它可以访问原始文件夹中的文件,如果要访问资产文件夹中的文件,请使用此URL ...
file:///android_asset/filename
确保没有将扩展名添加到文件名中。例如。 “ / movie”而不是“ /movie.mp4”。
请参阅此链接:
答案 2 :(得分:0)
这就是我用@CommonWare Answer解决问题的方法
我正在使用输入流获取文件
is = context.getResources().openRawResource(R.raw.lbpcascade_frontalface);
因此,将打开文件,然后指向File类
File cascadeDir = context.getDir("cascade", Context.MODE_PRIVATE);
mCascadeFile = new File(cascadeDir, "lbpcascade_frontalface.xml");
然后我像这样使用getAbsolutePath搜索路径文件
cascadeClassifier.load(mCascadeFile.getAbsolutePath());
看看我的完整代码
try {
is = context.getResources().openRawResource(R.raw.lbpcascade_frontalface);
File cascadeDir = context.getDir("cascade", Context.MODE_PRIVATE);
mCascadeFile = new File(cascadeDir, "lbpcascade_frontalface.xml");
os = new FileOutputStream(mCascadeFile);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
is.close();
os.close();
cascadeClassifier.load(mCascadeFile.getAbsolutePath());
} catch (IOException e) {
Log.i(TAG, "face cascade not found");
}
答案 3 :(得分:0)
我们可以使用这种替代方法来查找原始文件夹中文件的路径。
/*Remove struct padding*/
#pragma pack(push, 1)
typedef struct
{
int8_t a;
int8_t b;
int8_t c;
int8_t d;
} data;
/*Recover struct padding, some structs from other libraries malfunction from not using struct pudding.*/
#pragma pack(pop)
int main()
{
/*Define a clean data structure*/
data tmp = { 0x00, 0x00, 0x00, 0x00 };
((int8_t *)&tmp)[0] = 0x01; /*data.a = 0x01*/
((int8_t *)&tmp)[1] = 0x03; /*data.b = 0x03*/
((int8_t *)&tmp)[2] = 0x05; /*data.c = 0x05*/
((int8_t *)&tmp)[3] = 0x07; /*data.d = 0x07*/
return 0;
}
你可以使用
modelFile.getAbsolutePath());获取路径