// Update is called once per frame
    void Update()
    {
        if (!PopCheckCurrentCamera.CheckCurrentCamera())
        {
            return;
        }


        if (!mInputPrev ||
            !mInputNext ||
            !mMakeFeaturesShader ||
            !mFeaturesPrev ||
            !mFeaturesNext ||
            !mTrackFeaturesShader ||
            !mFeatureMatches
            )
        {
            Debug.Log("FeatureMatcher not setup");
            return;
        }

        //	make features for both inputs
        mFeaturesPrev.DiscardContents();
        mFeaturesNext.DiscardContents();
        Graphics.Blit(mInputPrev, mFeaturesPrev, mMakeFeaturesShader);
        Graphics.Blit(mInputNext, mFeaturesNext, mMakeFeaturesShader);

        //	match features
        mTrackFeaturesShader.SetTexture("FeaturesPrev", mFeaturesPrev);
        Graphics.Blit(mFeaturesNext, mFeatureMatches, mTrackFeaturesShader);

        FeatureTrackOptions Options = new FeatureTrackOptions();

        Options.MaxResults = mMaxResults;
        mJoints            = FeatureTracker.GetFeatureTracks(mFeatureMatches, ref mFeatureMatchesBuffer, Options);

        if (mCopyToPrev)
        {
            Graphics.Blit(mInputNext, mInputPrev);
        }
    }
示例#2
0
    static FeatureResults CalcFeaturePairs(Color32[] TrackedFeaturesData, int ImageWidth, int ImageHeight, FeatureTrackOptions Options)
    {
        FeatureResults Results = new FeatureResults();

        //	count matches
        for (int i = 0; i < TrackedFeaturesData.Length; i++)
        {
            if (TrackedFeaturesData [i].a < 1)
            {
                continue;
            }
            Results.mTotalResults++;

            if (Results.mMatches.Count >= Options.MaxResults)
            {
                break;
            }

            int     y      = i / ImageWidth;
            int     x      = i % ImageWidth;
            float   Startu = x / (float)ImageWidth;
            float   Startv = y / (float)ImageHeight;
            float   Endu   = (TrackedFeaturesData [i].r / 255.0f);
            float   Endv   = (TrackedFeaturesData [i].g / 255.0f);
            Vector4 Match  = new Vector4(Startu, Startv, Endu, Endv);
            Results.mMatches.Add(Match);
        }

        return(Results);
    }
示例#3
0
    public static FeatureResults GetFeatureTracks(RenderTexture FeatureMatches, ref Texture2D FeatureMatchesBuffer, FeatureTrackOptions Options)
    {
        if (!FeatureMatches)
        {
            return(null);
        }

        if (!FeatureMatchesBuffer)
        {
            FeatureMatchesBuffer = new Texture2D(FeatureMatches.width, FeatureMatches.height, TextureFormat.ARGB32, false);
        }

        //	extract data for debug rendering
        RenderTexture.active = FeatureMatches;
        FeatureMatchesBuffer.ReadPixels(new Rect(0, 0, FeatureMatches.width, FeatureMatches.height), 0, 0);
        FeatureMatchesBuffer.Apply(true);
        Color32[] FeatureMatchesData = FeatureMatchesBuffer.GetPixels32();
        RenderTexture.active = null;
        FeatureResults Results = CalcFeaturePairs(FeatureMatchesData, FeatureMatchesBuffer.width, FeatureMatchesBuffer.height, Options);

        return(Results);
    }