0

我在 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();
            }
        }
4

0 回答 0