czwartek, 23 lipca 2009

OpenCV

OpenCV to prawdopodobnie najbardziej znana biblioteka związana z komputerową "wizją". Chodź od dłuższego czasu nic w niej się nie dzieje, to wydaje się nie tracić na popularności. Miałem okazję zapoznać się z nią na laboratorium przedmiotu Sensoryka i Systemy Wizyjne. Na zajęciach wykorzystywaliśmy Visual C++, a teraz chciałbym móc pracować z tą biblioteką w NetBeans na Ubuntu 8.04. Okazało się, że chęć tę bardzo łatwo przekuć w czyn. Oto co należy zrobić:
Nie zamierzam instalować ostatniej wersji z CVS czy SVN. Chcę wykorzystać to co jest w repozytorium Ubuntu. Mamy tam dostępną wersję 1.0.0. Aby dowiedzieć się jakie są nazwy paczek należy wpisać:
apt-cache search opencv
. W odpowiedzi dostaniemy:
libcv-dev - development files for libcv
libcv1 - computer vision library
libcvaux-dev - development files for libcvaux
libcvaux1 - computer vision extension library
libhighgui-dev - development files for libhighgui
libhighgui1 - computer vision GUI library
opencv-doc - OpenCV documentation and examples
python-opencv - Python bindings for the computer vision library

Nie potrzebujemy dokumentacji, która jest dostępna tutaj (dla wersji 1.0) lub tutaj (dla wersji 1.1). W repozytorium znajduje się wersja 1.0. Wydaje mi się, że nie różni się ona zbytnio od 1.1, ale nie przeglądałem changeloga, więc nie wiem na pewno. W każdym razie dokumentacja jest w internecie, a Pythona nie zamierzam używać.
Zatem instalujemy paczki:
sudo apt-get install libcv1 libcv-dev libcvaux1 libcvaux-dev libhighgui1 libhighgui-dev
W odpowiedzi dostaniemy:
Czytanie list pakietów... Gotowe
Budowanie drzewa zależności
Odczyt informacji o stanie... Gotowe
Zostaną zainstalowane następujące dodatkowe pakiety:

libatk1.0-dev libavcodec-dev libavformat-dev libavutil-dev libcairo2-dev libdc1394-13-dev libexpat1-dev libfontconfig1-dev libfreetype6-dev libglib2.0-dev libgsm1-dev libgtk2.0-dev libice-dev libjpeg62-dev libogg-dev libpango1.0-dev libpixman-1-dev libpng12-dev libpthread-stubs0 libpthread-stubs0-dev libraw1394-dev libsm-dev libtheora-dev libtiff4-dev libtiffxx0c2 libvorbis-dev libx11-dev libxau-dev libxcb-xlib0-dev libxcb1-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxft-dev libxi-dev libxinerama-dev libxrandr-dev libxrender-dev x11proto-composite-dev x11proto-core-dev x11proto-damage-dev x11proto-fixes-dev x11proto-input-dev x11proto-kb-dev x11proto-randr-dev x11proto-render-dev x11proto-xext-dev x11proto-xinerama-dev xtrans-dev zlib1g-dev
Sugerowane pakiety:
libcairo2-doc libglib2.0-doc libgtk2.0-doc imagemagick libpango1.0-doc
libraw1394-doc
Zostaną zainstalowane następujące NOWE pakiety:
libatk1.0-dev libavcodec-dev libavformat-dev libavutil-dev libcairo2-dev libcv-dev libcv1 libcvaux-dev libcvaux1 libdc1394-13-dev libexpat1-dev libfontconfig1-dev libfreetype6-dev libglib2.0-dev libgsm1-dev libgtk2.0-dev libhighgui-dev libhighgui1 libice-dev libjpeg62-dev libogg-dev libpango1.0-dev libpixman-1-dev libpng12-dev libpthread-stubs0 libpthread-stubs0-dev libraw1394-dev libsm-dev libtheora-dev libtiff4-dev libtiffxx0c2 libvorbis-dev libx11-dev libxau-dev libxcb-xlib0-dev libxcb1-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxft-dev libxi-dev libxinerama-dev libxrandr-dev libxrender-dev x11proto-composite-dev x11proto-core-dev x11proto-damage-dev x11proto-fixes-dev x11proto-input-dev x11proto-kb-dev x11proto-randr-dev x11proto-render-dev x11proto-xext-dev x11proto-xinerama-dev xtrans-dev zlib1g-dev
0 aktualizowanych, 59 nowo instalowanych, 0 usuwanych i 0 nieaktualizowanych.
Konieczne pobranie 0B/17,3MB archiwów.
Po tej operacji zostanie dodatkowo użyte 62,9MB miejsca na dysku.
Czy chcesz kontynuować [T/n]?
Odpowiadamy, że oczywiście tak. Jak widać instaluje się mnóstwo innych paczek - z tego co widać jedne służą do obsługi różnych formatów obrazów i filmów, a inne do obsługi interface'u (np libgtk2.0-dev). Gdy ta czynność się zakończy pliki nagłówkowe będą zainstalowane w /usr/include/opencv, a biblioteki w /usr/lib.
Zaczynamy teraz pracę z NetBeans:
Tworzymy nowy projekt typu "C/C++ Application". Nadajemy mu nazwę "openCV Hello World".
Mamy czysty projekt z pojedynczym plikiem main.cpp. Teraz trzeba powiedzieć kompilatorowi, gdzie znajdują się biblioteki, które ma dołączyć do projektu. Należy kliknąć prawym przyciskiem w oknie "Projects" na obecnym projekcie i przejść do jego właściwości (Properties). Po wybraniu "Linker" dodać ścieżkę do bibliotek (Additional Library Directories): /usr/lib oraz biblioteki (Libraries): cv, cvaux, highgui.

Teraz możemy napisać trochę kodu. Oto propozycja:
#include <stdlib.h>
#include "opencv/cv.h"
#include "opencv/cvaux.h"
#include "opencv/highgui.h"

/*
*
*/
int main(int argc, char** argv) {
//tworzenie zmiennej przechowującej obraz i załadowanie obrazu z pliku, 0 = czarno-biały
IplImage* obraz = cvLoadImage("/home/daniel/Obrazy/hello.jpg", 0);
//utworzenie okna nazwanego Hello World
cvNamedWindow("Hello world");
//wyświetlenie obrazu
cvShowImage("Hello world", obraz);
//oczekiwanie na wciśnięcie klawisza, domyślnie 0 = nieskonczonosc
cvWaitKey();
//zamknięcie okna, można użyć cvDestroyAllWindows()
cvDestroyWindow("Hello world");
//zwalniamy pamięć zajętą przez zmienną obraz
cvReleaseImage(&obraz);
return (EXIT_SUCCESS);
}
Efekt po wciśnięciu F6:

niedziela, 19 lipca 2009

LaTeX

Przeglądałem dziś sobie jakie programy są dostępne przez "Dodaj/Usuń programy" w Ubuntu i w oczy rzucił mi się Texmaker. Zainstalowałem go i próbowałem stworzyć prosty dokument. Skonfigurowałem sobie opcję "Quick build", aby po naciśnięciu F1 otrzymać gotowy plik PDF. Niestety dostawałem błędy w stylu "błąd podczas wykonywania polecenia", "nie istnieje plik dziennika (log file)". Swego czasu próbowałem już skompilować dokument na Windowsie i poległem. Za to w trakcie prób rozwiązania problemu natrafiałem na instrukcję dla Linuksów. Było tam wspomniane o poleceniach typu pdflatex. Sprawdziłem w terminalu czy mam coś takiego zainstalowanego. Okazało się, że nie, więc trzeba je doinstalować. Tylko jak się nazywa ta paczka. Poszukiwania (apt-cache search latex | less) doprowadziły do tego, że w oczy rzuciła mi się duża ilość paczek z "texlive" na początku. Tylko jak będzie się nazywać główny pakiet? Pewnie texlive. Polecenie apt-cache show texlive upewniło mnie, że zgadłem:
This metapackage provides a decent selection of the TeX Live packages which should suffice for the most common tasks.
Zainstalowałem zatem paczkę texlive wraz z texlive-lang-pl, gdyż uznałem, że ta druga może się przydać. Po tym wszystkim odinstalowałem i zainstalowałem ponownie Texmakera.
Teraz ponownie skonfigurowałem Quick Build, żeby tworzyło pdfa. Następnie przy wykorzystaniu "Quick Wizard" stworzyłem następujący dokument:
\documentclass[10pt,a4paper]{article}
\usepackage[latin2]{inputenc}
\author{Imię Nazwisko}
\title{O pisaniu w LaTeXu}
\begin{document}
Treść dokumentu
\end{document}
Zapisałem do pliku /home/daniel/Dokumenty/LaTeX/pierwszy. To był mój pierwszy błąd- pliki należy zapisywać koniecznie z rozszerzeniem .tex. Udało mi się skompilować tekst do pdfa, ale zamiast ź otrzymałem jakieś L z zawijasami. Zacząłem kombinować z różnymi paczkami:
\usepackage[polish]{babel}
\usepackage[]{polski}
\usepackage[OT4]{polski}
\usepackage[T1]{polski}
\usepackege[MeX]{polski}
Za każdym razem dostawałem inny efekt. A to zamiast ź było ij, a to w ogóle ź zostało pominięte. Przez pewien czas pomyślałem, że może brakuje mi czcionek, ale wersja zapisu ź z akcentem działała (wpisanie \'z również powoduje wyświetlenie ź).
Wtedy trafiłem na stronę morony.pl, gdzie opisywano instalację paczek dla Windows. Wykorzystałem przykładowy plik LaTeXa:
\documentclass[11pt,a4paper]{article}
\usepackage{polski}
\usepackage[cp1250]{inputenc}
\title{\LaTeX}
\author{Marcin Polkowski}
\begin{document}
\maketitle
\section{Matematyka}
$$f(x)=\left\{
\begin{array}{ccc}
\sin{x}&\mbox{dla}&x<0\\ 0&\mbox{dla}&x=0\\ \cos{x}&\mbox{dla}&x>0
\end{array}
\right.$$
\section{Polskie krzaczki}
Późną nocą grań olśniła księżyca jasność.
Pchnąć w tę łódź jeża lub ośm skrzyń fig.
Różowy słoń ma usiąść na tępych gwoździach
\end{document}
Jako, że używam Ubuntu zmieniłem windowsowe kodowanie cp1250 na latin2. Nikt nie potrafi wyobrazić sobie mojego zdziwienia, gdy powyższy tekst skompilował się do pięknego pdfa. Na razie służy mi jako szablon do tworzenia kolejnych dokumentów. Może jak kiedyś zrozumiem na czym polega ustawianie opcji poszczególnych paczek to będę pisał preambułę sam. Na razie jest to dla mnie czarna magia i to rozwiązanie jest wystarczająco dobre.

Taka drobnostka, co do której nie jestem pewien czy ma znaczenie: w Options->Configure Texmaker->Editor ustawiłem kodowanie edytora na ISO-8859-2

Pomocą służyły mi dwa główne opracowania:
Nie za krótkie wprowadzenie do systemu LaTeX oraz Jak szybko zacząć pisać w LaTeX Pomocna również była strona Grupy Użytkowników Systemu Tex (w skrócie GUST).

poniedziałek, 13 lipca 2009

NetBeans i C/C++

Jako że będę niedługo potrzebował umiejętności pisania programów w C z Linuksem jako docelową platformą postanowiłem zrobić coś w tym kierunku. Korzystać będę z Ubuntu 8.04 LTS.
Rozpocząłem od przejrzenia książki Beginning Linux Programming z której to dowiedziałem się jak kompilować programy z pomocą linii komend. Zdaję sobie sprawę, że niektórzy to lubią i ma to "oldskulowy" urok, ale jednak cenię sobie wyżej wygodę niż bajery.
Swego czasu dużo dobrego słyszałem o NetBeans i postanowiłem je wypróbować. Jest to środowisko programistyczne, które można wykorzystać do programowania w wielu językach (pierwotnie była to chyba Java). Mnie interesowała wersja dla C/C++, toteż ściągnąłem odpowiedni instalator ze strony http://www.netbeans.org/downloads/index.html. Na stronie dostępne są też tutoriale dotyczące obsługi tego środowiska.
Instalację przeprowadzałem już jakiś czas temu, więc nie pamiętam wszystkich szczegółów, ale wydaje mi się, że brakowało tam kompilatora C++ - wystarczy doinstalować g++ na przykład za pomocą Synaptica i w Narzędzia=>Opcje=>C/C++=>Build Tools w okienku C++ Compiler: wpisać /usr/bin/g++. Od teraz można już działać bez przeszkód.
Moje dotychczasowe doświadczenia z programowaniem w C++ to głównie 2 programy: MS Visual Studio i C++ Builder z Borlanda. Ten drugi to już zabytek, więc nie ma co porównywać. Jak na tak stary program jest bardzo wygodny, ale znalezienie jakiejś instalki w internecie, a do niej jeszcze klucza rejestracyjnego to już nie jest zabawne. Acha, żeby działał debugger należy się zarejestrować. Swojego czasu ominąłem rejestrację i zachodziłem w głowę dlaczego debugger, który kiedyś działał bez problemu, teraz w ogóle nie chce tego robić. Wracając jednak do sedna - porównanie będzie odbywać się między VS, a NetBeans.
Jest kilka funkcji, które w IDE są przeze mnie wymagane. Działający debugger to podstawa - byłem bardzo mile zaskoczony, gdy zobaczyłem w NetBeans, że mogę bez problemu włączyć uruchomienie programu linia po linii wraz z poglądem zmiennych, dodawanie watchów itp. Bardzo miłe zaskoczenie.
Pisząc program bardzo pomocne są podpowiedzi nazw zmiennych i funkcji. Zarówno w VS, jak i NB mamy je dostępne pod ctrl+spacja, ale w tym drugim mamy to bardziej rozbudowane - podpowiadane są też nazwy plików nagłówkowych, dyrektywy preprocesora, rozwinięcia kodu (napisz "for", naciśnij ctrl+spacja, a dostaniesz podpowiedź "fori", które po wybraniu rozwija się w pętlę for ze zmienną i. To jeszcze nie koniec - zmienna i jest w polu, które uaktywnia się po rozwinięciu. Możemy wpisać dowolną nazwę zmiennej, a zastąpi ona i we wszystkich miejscach w pętli. Coś takiego dostępne w VS jest chyba tylko wtedy gdy piszemy w C# (albo może wszystko pisane przy użyciu CLR ma taką właściwość). Nie udało mi się za to znaleźć jak włączyć podpowiedź listy parametrów w funkcji, czyli odpowiednik Visualowego ctrl+shift+spacja, ale to pewnie jeszcze gdzieś to się przede mną ukrywa.
Co jeszcze mi się podoba w NB, a nie widziałem w VS to ilustracja czasu wykonywania programu i zużycia pamięci. Wciskamy F6, aby uruchomić nasz projekt i widzimy jak rośnie czy spada rozmiar naszego programu. Inny przykład to kombinacja alt+shift+f, która ładnie formatuje kod - wstawia spację między operatorami, wyrównuje wszystko, generalnie sprawia, że kod staje się czytelny.
Dodatkowo mamy integrację z CVS, SVN, Kenai i nie wiem nawet czym jeszcze. Trochę czasu minie zanim odkryję wszystkie funkcje. Wrażenia z użytkowania są niezmiernie zadowalające - obecnie staram się rozwiązać jak najwięcej zadań z Projektu Euler o którym napiszę więcej wkrótce.