我在Nexus 5上使用OpenCV4Android v.2.4.9和android 4.4.4 stock rom。
我使用这段代码来运行haar cascade face detection:
public Rect getFaceFromCascade(){
// cascade! woohoo
if (mFrontCascade != null) {
int height = mWorkingFrame.rows();
int faceSize = Math.round(height * mMinFaceSize);
mFrontCascade.detectMultiScale(mWorkingFrame, mFaceList,
1.1, 2, 2 , new Size(faceSize, faceSize), new Size());
}
Rect[] facesArray = mFaceList.toArray();
if (facesArray.length == 0){
//cascade couldn't find any face
return null;
}
return facesArray[0];
}
mFaceList是一个MatOfRect,我在初始化类时创建一次。
当班级去世时,我不会对mFaceList做任何事情(虽然我也试过发布它并且没有帮助),并把它留给垃圾收集器,但当GC随后出现,我得到一个SIGSEGV。深入调查后,我发现问题是在MatOfRect(Mat)终结器中调用释放时。
当我的班级去世时,mFaceList有以下标题:
Mat [ 1*1*CV_32SC4, isCont=true, isSubmat=false, nativeObj=0x713cdad8, dataAddr=0x751badf0 ]
并且在mFaceList的finalize方法中它有以下标题:
Mat [ 1964813884*1*CV_32SC(455), isCont=false, isSubmat=true, nativeObj=0x751ad8bc, dataAddr=0x751cae60 ]
发生SIGSEGV时的情况。任何想法什么可以弄乱这样的标题?或者为什么会这样?我在代码中的任何地方都没有任何其他MatOfRect的引用。
任何帮助将不胜感激。维拉德
答案 0 :(得分:-1)
好的,我设法解决了它。
问题是我在一个不同的矩阵中,我已经从c ++代码中传递出来了。从jni返回矩阵地址时,我不得不使用:
Mat ret = getSomeMatrix();
return (jlong) new Mat(ret);
因为java构造函数Mat(long addr)没有添加对矩阵计数器的引用,但终结器确实删除了一个引用。