Android imread返回空矩阵,而ifstream可以打开并读取相同的文件
我正在尝试从本机代码部分读取图像。 Java part I用于从资源中提取文件:Android imread返回空矩阵,而ifstream可以打开并读取相同的文件,android,opencv,Android,Opencv,我正在尝试从本机代码部分读取图像。 Java part I用于从资源中提取文件: String unpackFileFromResources(int resID, String subdir, String fname) { String full_path = ""; try { // load cascade file from application resources
String unpackFileFromResources(int resID, String subdir, String fname)
{
String full_path = "";
try
{
// load cascade file from application resources
InputStream is = getResources().openRawResource(resID);
File cascadeDir = new File(Environment.getExternalStorageDirectory(), subdir);
if (!cascadeDir.exists())
{
cascadeDir.mkdirs();
}
mCascadeFile = new File(cascadeDir, fname);
FileOutputStream 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();
full_path = mCascadeFile.getAbsolutePath();
} catch (IOException e)
{
e.printStackTrace();
Log.e(TAG, "Failed to load cascade. Exception thrown: " + e);
}
return full_path;
}
OpenCV加载程序回调:
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this)
{
@Override
public void onManagerConnected(int status)
{
switch (status)
{
case LoaderCallbackInterface.SUCCESS:
{
Log.i(TAG, "OpenCV loaded successfully");
// Load native library after(!) OpenCV initialization
System.loadLibrary("mixed_sample");
String path = unpackFileFromResources(R.raw.lena, "cascade", "lena.jpg");
ReadFile(path);
}
break;
default:
{
super.onManagerConnected(status);
}
break;
}
}
};
和本地部分:
#define LOG_TAG "MyLog"
#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__))
JNIEXPORT void JNICALL Java_com_smorodov_opencv_MainActivity_ReadFile(JNIEnv* jenv, jobject, jstring jFileName)
{
const char* jnamestr = jenv->GetStringUTFChars(jFileName, NULL);
string stdFileName(jnamestr);
// This works perfect
ifstream fl(jnamestr);
fl.seekg(0, ios::end );
size_t len = fl.tellg();
char *ret = new char[len];
fl.seekg(0, ios::beg);
fl.read(ret, len);
fl.close();
delete[] ret;
// This returns empty matrix
Mat m=imread(stdFileName,0);
LOGD("%s",stdFileName.c_str());
LOGD("fl.read %d bytes",len);
LOGD("m.empty() = %d",m.empty());
}
当我运行此代码时,我会得到以下输出:
/存储/仿真/0/cascade/lena.jpg 05-08 16:01:57.721:
D/MyLog(27433):fl.read 91814字节05-08 16:01:57.721:
D/MyLog(27433):m.empty()=1
问题是:是否可以从本机代码中读取image/Mat/cascade。imdecode来自ifstream的字节,看看它是否损坏?谢谢您的回复。它成功地解码了。但我需要使工作标准化opencv的文件IO方法。