Amatorskie spojrzenie na EmguCv – kontrolka Image Box

W poprzednim wpisie wspomniałem o metodzie ToBitmap klasy Image pozwalającej na konwersję klasy Image na klasę System.Drawing.Bitmap, co pozwala na używanie wyniku obróbki obrazu w kontrolkach Windows Forms. Jednak taka konwersja nie należy do najszybszych operacji, po za tym powoduje zwiększenie zużycia pamięci, ponieważ obraz jest przechowywany w pamięci w dwóch postaciach. Ponieważ najczęstszym zastosowaniem obrazów jest ich wyświetlanie do EmguCV została dodana kontrolka ImageBox.

Jest ona pod pewnymi względami podobna do PictureBox z WindowsForms, podstawową różnicą jest fakt iż jako źródła używa klasy IImage (po którym dziedziczy Image<TColor, TDepth>) , a nie Bitmap. Kontrolka ta dodaje też kilka funkcjonalności np. skalowanie obrazka myszką, obsługę rolki itp. jednak mam nadzieję że da się to wyłączyć Edit.

Aby dodać kontrolkę ImageBox do projektu należy dodać referencję do EmguCV (operację tą opisałem w poprzednim poście) i to wystarczy aby używać tej kontrolki z poziomu kodu. Jednak aby ww. kontrolka pojawiła się także w toolboxie należy się jeszcze trochę wysilić.

Po kliknięciu prawym przyciskiem myszy w wolny obszar na toolboxie należy wybrać“Add Tab” ja swoją zakładkę nazwałem “EmguControls”:

AddTab

Następnie należy kliknąć prawym przyciskiem myszy w nową zakładkę wybrać opcję “Choose Items”.

Choose Items

Na wyświetlonym oknie można należy wybrać przycisk “Browse”, wskazać ścieżkę do EmguCV.UI.dll i zatwierdzamy obydwa formularze.

Browse

Oprócz kontrolki ImageBox zostają też dodane też kontrolki HistogramBox, MatrixBox, PanAndZoomPictureBox ich eksploracją zajmę się w późniejszym czasie (o ile mi starczy chęci).

Na koniec dodam iż eksplorację EmguCV będę dodatkowo dokumentował na GitHubie w projekcie https://github.com/szogun1987/EmguExperriments

W projekcie brakuje bibliotek OpenCV ze względu na ich rozmiar, należy je sobie samemu podlinkować/skopiować.

Ponieważ projekt ma za zadanie ukazać możliwości API w jak najprostrzy sposób większość kodu będzie się znajdowała w EventHandlerach (nie znam dobrego polskiego odpowiednika tego słowa), a sam kod będzie pełen powtórzeń. Więc nie uznaję krytyki tych aspektów. Natomiast chętnie zapoznam się z innymi uwagami.

Edit:

Właściwością kontrolki determinującą zachowanie kontrolki jest FunctionalMode. Właściwość ta może przyjmować 4 wartości:

  • Minimum – ogranicza się do wyświetlenia obrazka ta na której mi zależy.
  • RightClickMenu – wyświetla menu pozwalające na dokonywanie przekształceń na obrazie, ponieważ Menu pokrywa większość funkcjonalności projektu EmguExperiments wyłącze je w swoim projekcie
  • PanAndZoom – obsługa gestów myszy
  • Everything – jak sama nazwa wskazuje wszystkie funkcjonalności – wartość domyślna dla właściwości FunctionalMode