繁体   English   中英

使用openCv进行嘴部检测只能在一张脸中返回很多圆圈

[英]Mouth detection using openCv returns a lot of circles in only one face

我在Android Studio中使用OpenCv来检测图像中的面孔以及每张面孔中的眼睛和嘴巴。 但是,问题是每当我尝试检测嘴巴时,它都会在错误的脸上返回多个圆圈。

这是我添加的用于嘴部检测的代码:

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
...
InputStream iserM = getResources().openRawResource(
                                R.raw.haarcascade_mcs_mouth);
                        File cascadeDirERM = getDir("cascadeERM",
                                Context.MODE_PRIVATE);
                        File cascadeFileERM = new File(cascadeDirERM,
                                "haarcascade_mcs_mouth.xml");
                        FileOutputStream oserM = new FileOutputStream(cascadeFileERM);

                        byte[] bufferERM = new byte[4096];
                        int bytesReadERM;
                        while ((bytesReadERM = iserM.read(bufferERM)) != -1) {
                            oserM.write(bufferERM, 0, bytesReadERM);
                        }
                        iserM.close();
                        oserM.close();
...
//here begins
                        mJavaDetectorMouth = new CascadeClassifier(
                                cascadeFileERM.getAbsolutePath());
                        if (mJavaDetectorMouth.empty()) {
                            Log.e(TAG, "Failed to load cascade classifier");
                            mJavaDetectorMouth = null;
                        } else
                            Log.i(TAG, "Loaded cascade classifier from "
                                    + mCascadeFile.getAbsolutePath());
                        //here ends
...
}

public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
...
Rect r = facesArray[i];
            MatOfRect mouths = new MatOfRect();
            Mat faceROI = mRgba.submat(facesArray[i]);
            mJavaDetectorMouth.detectMultiScale(faceROI, mouths,1.1,1,1, new org.opencv.core.Size(30, 30), new org.opencv.core.Size());
            Rect[] mouthArray = mouths.toArray();

            for (int j = 0; j < mouthArray.length; j++){
                Point center1 = new Point(facesArray[i].x + mouthArray[j].x + mouthArray[j].width * 0.5,
                        facesArray[i].y + mouthArray[j].y + mouthArray[j].height * 0.5);
                int radius = (int) Math.round(mouthArray[j].width / 2);
                Imgproc.circle(mRgba, center1, radius, new Scalar(255, 0, 0), 4, 8, 0);
            }
...
}

自从发布问题并尝试了很多方法以来,我一直在四处看看。 但最后我找到了解决方案:我更改了:

 mJavaDetectorMouth.detectMultiScale(faceROI, mouths,1.1,1,1, new org.opencv.core.Size(30, 30), new org.opencv.core.Size());

至:

 mJavaDetectorMouth.detectMultiScale(faceROI, mouths,1.1, 2,
                    Objdetect.CASCADE_FIND_BIGGEST_OBJECT
                            | Objdetect.CASCADE_SCALE_IMAGE, new org.opencv.core.Size(30, 30), new org.opencv.core.Size());

我解决了这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM