我在 Android 环境中编程,我有一个主线程和一个工作线程。
主线程从使用 org.opencv.android.JavaCameraView 打开的视频流中捕获帧(将每一帧保存到 Mat 对象中),并将其连同时间戳一起发送到工作线程。工作线程应该能够接收它并使用一些技术对其进行处理。
我发现,如果我在工作线程中使用级联分类器进行人脸检测,从主线程接收到的一些消息会丢失。我用时间戳发现了这一点,这是 mat 的一种索引。
如果我不使用级联分类器(它的“detectMultiScale”方法),接收到的垫子的顺序是:1,2,3,4,5,6,7...如果我使用级联分类器,我只收到: 1,3,5,9 等。一些消息丢失。为什么这个?我该如何解决?
发送消息的线程:
Message m=Message.obtain();
m.what=123;
m.obj=resultedFrame;
myAsynkTask.mHandler.sendMessage(m);
接收的线程:
while(running){
synchronized (this) {
Looper.prepare();
mHandler = new Handler(){
public void handleMessage( Message msg ){
if(msg.what==123){
str.setmRgba(((structureMat)msg.obj).getmRgba());
str.setTimestamp(((structureMat)msg.obj).getTimestamp());
if((str.getmRgba())!=null) {
set_finalMat(str.getmRgba());
//Simple Face Detection with a cascade classifier.
faceFound = seg_asynk.findFaceMat(finalMatScaled, frameGrayAsynk, feat_asynk);
}
}
}
};
Looper.loop();
}
}