Извлечение капли детектора движения - PullRequest
0 голосов
/ 07 ноября 2019

Редактировать: Обнаружение движения Я полагаю, что это может ответить на мой вопрос ...

Я хочу не только обнаружить движение, но и прочитать, где движение произошло в кадре. Ничто в MotionDetector не имеет ничего общего с его местоположением. Я подумал, что, возможно, смогу запустить его через MotionDetector, а затем извлечь самый большой блоб, но это тоже не сработает. Он подхватывает только одну каплю.

Видеоролик - это машина, спускающаяся по трапу. mainPBX - это оригинальный кадр, main2PBX - это измененный кадр (с наложением самого большого двоичного объекта). Моя мысль - читать, когда капля переходит от меньшего к большему (и наоборот), чтобы определить вход или выход.

Private Sub Processor()
        Dim bc As New BlobCounter With {
            .MinWidth = 5,
            .MinHeight = 5,
            .ObjectsOrder = ObjectsOrder.Size
        }

        Dim detector As New MotionDetector(New SimpleBackgroundModelingDetector, New MotionAreaHighlighting)

        Using reader As New AForge.Video.FFMPEG.VideoFileReader()
            reader.Open("C:\Videos\MyVideo.mp4")
            For i As Integer = 0 To reader.FrameCount - 1
                Dim frame = reader.ReadVideoFrame()
                Dim frame2 As Bitmap = frame.Clone()
                Dim frame3 As Bitmap = frame.Clone()
                detector.ProcessFrame(frame2)
                bc.ProcessImage(frame2)
                Dim blobs = bc.GetObjectsInformation()

                If blobs.Length > 0 Then
                    bc.ExtractBlobsImage(frame3, blobs(0), True)
                    PBX_Image(main2PBX, frame3.Clone())
                End If

                PBX_Image(mainPBX, frame.Clone())

                Threading.Thread.Sleep(25)

                frame.Dispose()
                frame2.Dispose()
                frame3.Dispose()
            Next
        End Using
    End Sub

1 Ответ

0 голосов
/ 07 ноября 2019

Это никоим образом не закончено, но я действительно могу взаимодействовать с каплями.

Private Sub Processor()
    Dim Rectangles As New List(Of Rectangle)

    Dim detector As New SimpleBackgroundModelingDetector With {
        .SuppressNoise = True,
        .DifferenceThreshold = 10,
        .FramesPerBackgroundUpdate = 10,
        .KeepObjectsEdges = True
    }

    Dim processor As New AForge.Vision.Motion.BlobCountingObjectsProcessing With {
        .MinObjectsWidth = 40,
        .MinObjectsHeight = 40,
        .HighlightColor = Color.Red
    }

    Dim motionDetector As New MotionDetector(detector, processor)

    Using reader As New AForge.Video.FFMPEG.VideoFileReader()
        reader.Open("C:\Videos\MyVideo.mp4")
        For i As Integer = 0 To reader.FrameCount - 1
            Dim frame = reader.ReadVideoFrame()
            motionDetector.ProcessFrame(frame)
            Dim t As BlobCountingObjectsProcessing = motionDetector.MotionProcessingAlgorithm
            Dim r As Rectangle = Rectangle.Empty
            If t.ObjectRectangles.Length > 0 Then
                If t.ObjectRectangles.Length > 2 Then
                    r = t.ObjectRectangles.Aggregate(Function(r1, r2) If((r1.Width * r1.Height) > (r2.Width * r2.Height), r1, r2))
                Else
                    r = t.ObjectRectangles.First()
                End If
            End If

            If r.IsEmpty = False Then Rectangles.Add(r)

            PBX_Image(mainPBX, frame.Clone())

            Threading.Thread.Sleep(25)

            frame.Dispose()
        Next
    End Using
End Sub
...