Как обновить байтовые данные Mat и нарисовать их в графическом окне? - PullRequest
0 голосов
/ 19 марта 2019

Я учу Эмгу и хотел бы:

  • Имейте объект Mat в VB.net (потому что я понимаю, что Mat - это предполагаемое использование Emgu 3)
  • дать указатель на его базовый байтовый массив в виде IntPtr для функции dll c ++ (для меня это черный ящик, я не могу изменить свою подпись)
  • имеют Emgu Imagebox отображать это изображение, управляемое событиями, когда данные изменяются

Что я пробовал до сих пор:

У меня есть решение, использующее обычную систему. Рисование объектов работает так же, как это.

У меня есть решение с использованием объектов Mat, которое требует переназначения imagebox.image = MatObject.Bitmap() каждый раз, когда я хочу обновить

Вот код, который не работает:

Public Sub StartVideo(ByRef videoFrame As Image)
    cts = New Threading.CancellationTokenSource()
    Me._lastMat = New Mat(New Size(Me.Resolution.Width, Me.Resolution.Height), Me.ImageFormat, 1, Me._videoHandle.AddrOfPinnedObject(), Me.Resolution.Width * Me.BytesPerPixel)
    Me._videoBmp = New Bitmap(Me.Resolution.Width, Me.Resolution.Height, Me.Resolution.Width * Me.BytesPerPixel, Imaging.PixelFormat.Format8bppIndexed, _videoHandle.AddrOfPinnedObject())
    'videoFrame = Me._videoBmp
    videoFrame = Me._lastMat.Bitmap()
    Task.Run(Sub()
                 While Not cts.Token.IsCancellationRequested

                     If Me.GetVideoData(Me._videoHandle.AddrOfPinnedObject(), Me._videoBytes.Length, 10) Then

                         'Task.Run(Sub()
                         RaiseEvent HasNewVideo()
                         'End Sub)
                     Else
                         Dim test = True
                     End If
                 End While

             End Sub, cts.Token)

End Sub

Обратите внимание, что когда я переключаю, какая из строк "videoFrame =" закомментирована, он работает с системным растровым объектом.

...