1

最大の輪郭を描画しようとしています。リアルタイムで作業して、各カメラ フレームを処理しています。私の入力画像は手で作られます。いくつかの制約があります - 黒の背景、鏡面反射光なし。

最大の輪郭が下の画像にできるだけ近いと思いますここに画像の説明を入力

私のコードは次のとおりです。オンラインで入手できる多くのサンプルを参照しましたが、コードに問題はないとほとんど考えています。

        mRgba = inputFrame.gray();
        contours = new ArrayList<MatOfPoint>();
        mcontours = new ArrayList<MatOfPoint>();
        List<Mat> hull = new ArrayList<Mat>(contours.size());

        hierarchy = new Mat();
        Imgproc.Canny(inputFrame.gray(), mIntermediateMat, 50, 50);
        Imgproc.findContours(mIntermediateMat, contours, hierarchy,
                Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);


        for (int idx = 0; idx != contours.size(); ++idx)
        {
            Mat contour = contours.get(idx);
            double contourarea = Imgproc.contourArea(contour);
            Log.i(TAG, "maxAreaIdx =" + idx + "contourarea = " + contourarea);
            if (contourarea > maxArea)
            {
                maxArea = contourarea;
                maxAreaIdx = idx;
                Log.i(TAG, "maxAreaIdx =" + maxAreaIdx + "MaxArea = " + maxArea);

            }

        }

        if(maxAreaIdx > 0 && maxAreaIdx < contours.size())
            mcontours.add(contours.get(maxAreaIdx));
        else
            break;

        Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_GRAY2RGBA,
                4);
        hierarchy.release();
        Imgproc.drawContours(mRgba, mcontours, -1, CONTOUR_COLOR, -1);

今、私が得たのはこれのほんの一部です。私の現在の理解では、OpenCV 自体が大きな連続した輪郭を検出できないということです。以下の画像を参照してください。

ここに画像の説明を入力

これだけでなく、他の画像でもテストしましたが、どういうわけか大きな大きな連続した輪郭を取得できません。

最初にキャニーを適用するのは間違っていますか? より良いテクニックはありますか?手の輪郭の輪郭を取得したい。将来的には、保存されている同様の等高線データベースと比較したいと考えています。私は正しい軌道に乗っていますか?

4

1 に答える 1