Jak punkt wyjścia przy pisaniu kolejnych aplikacji pod system Windows polecam wykorzystanie załączonego szablonu FirstApp-Template
Zawiera on przykład tworzenia okienka aplikacji, dołączaniu menu, wstawiania elementów formatek, załączania formatek w zasobach, i obsługę podstawowych komunikatów systemu windows.
Author: Krzysztof Wegner
-
Szablon Programu w WinApi
-
Szablony filtrów
W archiwum DirectShowLab.rar znajduje sie 5 szablonów filtrów:
- Transform – Filtr przeznaczony do realizacji projektów z jednym wejściem i jednym wyjściem. Przykładem takiego projektu jest filtr konwersji RGB do YUV
- DualInput – Filtr przeznaczony do realizacji projektów z dwoma wejściamy i jednym wyjściem. Przykładem takiego projektu jest filtr składający dwa obrazu do obrazu typu SideBySide.
- DualOutput – Filtr przeznaczony do realizacji projektów z jednym wejściem i dwoma wyjściami. Przykładem takiego projektu jest filtr wyszukujący i śledzący twarz
- Source – Filtr przeznaczony do realizacji projektów filtów źródłowych z jednym wyjściem. Przykładem takiego projektu jest filtr odczytujący pliki BMP z dysku
- Sink – Filtr przeznaczony do realizacji projektów filtów docelowych z jednym wejściem. Przykładem takiego projektu jest filtr zapisujący pliki BMP z dysku
Po rozpakowaniu archiwum w pierwszej kolejności nalezy przekompilować klasy bazowe znajdujące się w katalogu BaseClasses. W tym celu otwieramy plik projektu make.visual/baseclasses_vc2005.sln w środowisku Visual Studio 2005 lub odpowiednio nowszy projekt w nowszym środowisku. Z menu build wybieramy opcje Rebuild Solution. Nastepnie zamykamy projekt.
Po przeanalizowaniu projektu który Państwo realizują należy wybrać odpowiedni szablon filtru.
W zależności od wybranego typu projektu należy zmodyfikować następującą funkcję:
- Transform – Transform
- DualInput – ProcessSamples
- DualOutput – Receive
- Source – DeliverSample
- Sink – Receive
-
Bio Lab03
Transformacja Radona zdefiniowana jest następujaco
\(R(L)=\int_{L}^{ }f(l)dl\) Zakładając parametryzacje prostej \(L\) następująco
\(L: \begin{Bmatrix}(x,y): x=t\cdot sin(\alpha)+s\cdot cos(\alpha),y=-t\cdot cos(\alpha)+s\cdot sin(\alpha)\end{Bmatrix}\) Transformacja Radona sprowadza sie do wyznaczenia
\(R(\alpha ,s)=\int_{\infty }^{\infty }f(x(t),y(t))dt\) \(R(\alpha ,s)=\int_{\infty }^{\infty }f(t\cdot sin(\alpha)+s\cdot cos(\alpha),-t\cdot cos(\alpha)+s\cdot sin(\alpha)))dt\)W środowisku MatLab znajduje się już zaimplementowana transformacja Radona w postaci funkcji radon.I = zeros(100,100); I(25:75, 25:75) = 1; imshow(I) [R,xp] = radon(I,[0 45]); figure; plot(xp,R(:,1)); title('R_{0^o} (x\prime)')
Podobnie zaimplementowana jest już odwrtona transformata radona w postaci funkcji iradon
theta1 = 0:10:170; [R1,xp] = radon(P,theta1); theta2 = 0:5:175; [R2,xp] = radon(P,theta2); theta3 = 0:2:178; [R3,xp] = radon(P,theta3); I1 = iradon(R1,10); I2 = iradon(R2,5); I3 = iradon(R3,2); imshow(I1) figure, imshow(I2) figure, imshow(I3)
Aby obejżeć sinogram można wykorzystać funkcje imshow lub
theta = 0:180; [R,xp] = radon(I,theta); imagesc(theta,xp,R); title('R_{\theta} (X\prime)'); xlabel('\theta (degrees)'); ylabel('X\prime'); set(gca,'XTick',0:20:180); colormap(hot); colorbar
D = 250; dsensor1 = 2; F1 = fanbeam(P,D,'FanSensorSpacing',dsensor1); dsensor2 = 1; F2 = fanbeam(P,D,'FanSensorSpacing',dsensor2); dsensor3 = 0.25 [F3, sensor_pos3, fan_rot_angles3] = fanbeam(P,D,'FanSensorSpacing',dsensor3); output_size = max(size(P)); Ifan1 = ifanbeam(F1,D,'FanSensorSpacing',dsensor1,'OutputSize',output_size); figure, imshow(Ifan1) Ifan2 = ifanbeam(F2,D,'FanSensorSpacing',dsensor2,'OutputSize',output_size); figure, imshow(Ifan2) Ifan3 = ifanbeam(F3,D,'FanSensorSpacing',dsensor3,'OutputSize',output_size); figure, imshow(Ifan3)
-
Okienko wyboru pliku do otwarcia
Poniżej przykład wywołania Open Dialog Box z Common Dialog Box
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646829(v=vs.85).aspx#open_fileOPENFILENAME ofn; // common dialog box structure char szFile[260]; // buffer for file name HWND hwnd; // owner window HANDLE hf; // file handle // Initialize OPENFILENAME ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hwnd; ofn.lpstrFile = szFile; // Set lpstrFile[0] to '\0' so that GetOpenFileName does not // use the contents of szFile to initialize itself. ofn.lpstrFile[0] = '\0'; ofn.nMaxFile = sizeof(szFile); ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0"; ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; // Display the Open dialog box. if (GetOpenFileName(&ofn)==TRUE) { hf = CreateFile(ofn.lpstrFile, //Open the file GENERIC_READ, 0, (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL); //Rest of the code hire }
-
Okienko wyboru koloru
Poniżej przykład wywołania Color Pickera z Common Dialog Box
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646829(v=vs.85).aspxCHOOSECOLOR cc; // common dialog box structure static COLORREF acrCustClr[16]; // array of custom colors //HWND hwnd; // owner window HBRUSH hbrush; // brush handle static DWORD rgbCurrent; // initial color selection // Initialize CHOOSECOLOR ZeroMemory(&cc, sizeof(cc)); cc.lStructSize = sizeof(cc); cc.hwndOwner = hwnd; cc.lpCustColors = (LPDWORD) acrCustClr; cc.rgbResult = rgbCurrent; cc.Flags = CC_FULLOPEN | CC_RGBINIT; if (ChooseColor(&cc)==TRUE) { hbrush = CreateSolidBrush(cc.rgbResult); rgbCurrent = cc.rgbResult; } else { MessageBox(0,TEXT("Error"),TEXT("O programie"),MB_OK); }
-
Propozyje temetów projektów z Laboratorium Systemów Multimedialnych
Łatwe projekty (max ocena 4)
- Filtr skalujący obraz x2 – 88474
- Filtr skalujący obraz na dowolny rozmiar – 88495
- Filtr konwertujący obraz RGB na YUV – 84315
- Filtr konwertujący obraz YUV na RGB – 88511
- Filtr konwertujący obraz RGB na w odcieniach szarości – 88536
- Filtr konwertujący obraz RGB na sepie – 88481
- Filtr konwertujący obraz RGB na Czarno biały (1 bit) – progowanie – 84421
- Filtr konwertujący obraz RGB na Czarno biały (1 bit) – dither – 88479
- Filtr greenbox’a – 88603
- Filtr nakładający napisy – 88620
- Filtr dokonujący konwersji z RGB do 16 kolorów z metoda ditheru – 88630
- Filtr dokonujący konwersji z RGB do 16 kolorów z metoda kwantowania wektorowego – 88528
- Filtr wyszukujący i śledzący kolorowy kartonik papieru – 88600
- Filtr wyszukujący i śledzący najbliższy obiekt (KINEKT) – 84318
- Filtr nakładajacy logo nadawcy – 88531
- Filtr wyświetlający wektory ruchu – 84414
- Filtr obliczający DCT – 88475
- Filtr odczytujący tekst z pliku oraz filtr wyświetlający tekst – 88619
- Filtr dokonujący predykcji intra – 88613
- Filtr PIP – Picture in the Picture – 88515
- Filtr obracajacy obraz o 90 stopni – 88453
- Filtr obracajacy obraz o dowolny kąt – 88472
- Filtr znaczący obraz – ukrywający tekst w obrazie (Ulotny znak wodny) – 88506
- Filtr detektor znaczonego obrazu – wykrywający ukryty tekst w obrazie (Ulotny znak wodny) – 88506
- Filtr do zakrywania fragmentu obrazu (np twarzy, tablic rejestracyjnych) – 88617
- Filtr przeplatający 2 obrazy w jeden – 88599
- Filtr wyświetlający 2 obrazy w technice anaglifowej – 88594
- Filtr wyświetlający 2 obrazy w trybie obraz przy obrazie (SideBySide) – 88538
- Filtr wyświetlający fps’y – 88616
- Filtr efekt graficzny przestawiający kafelki (puzle) – 88533
Bardziej wymagające projekty (max ocena 5)
- Filtr pobierający obraz z przystawki Kinekt
- Filtr wyszukujący i śledzący twarz (Analiza koloru twarzy) – 88612
- Filtr składający 2 obrazy do jednego obrazu 3D w trybie obraz przy obrazie (SideBySide) – wersja rozszerzona
- Filtr składający obraz i mapę głebi do jednego obrazu 3D w trybie obraz przy obrazie (SideBySide) (KINEKT) – 88595
- Filtr lub Filtry odczytujące obraz 3D z formatu AVI Fujitsu
- Filtr nakładajacy logo nadawcy – wesja rozszerzona – 84251
- Filtry strumieniujące dane przez internet (serwer i klient)
- Filtr strumieniujący dane przez system plików
- Filtr PIP – Picture in the Picture – wersja rozszerzona – 84398
- Filtry zapisujące i odczytujące dane z wykorzystaniem kompresji Huffmana
- Filtry zapisujące i odczytujące dane z wykorzystaniem kompresji LZW – 88483
- Filtr syntezujący obraz z mapy głębi i obrazu (KINEKT) – 84267
- Filtr otwierający pliki MPO (3D)
- Filtr zapisujący pliki MPO (3D)
- Filtr zapisujący pliki JPG – 88490
- Filtr zapisujący pliki BMP – 88526
- Filtr czytajacy QPkody – 88503
- Szybki filtr skalujący obraz x2 (SSE) – Kuik
- Szybki filtr skalujący obraz na dowolny rozmiar (SSE)
- Szybki filtr konwertujący obraz RGB na YUV (SSE) – 84273
- Szybki filtr konwertujący obraz YUV na RGB (SSE) – 88471
-
Komponenty w AVLib++
Podstawowym obiektem przechowywującym próbki obrazu jest komponent, obiekt klasy
sCmp
. Obiekt tej klasy składa się z dwuwymiarowej tabelki z wartościami próbek obrazu, oraz informacji o wielkości obrazu.Najważniejsze pola klasy:
- pel
- Wskaźnik do 2 wymiarowej tablicy zawierającej punkty komponentu linia po linii, punkt po punkcie
- dx
- Szerokość komponentu w punktach
- dy
- Wysokość komponentu w punktach
- name
- Nazwa komponentu. Przy zdefiniowanych przestrzeniach kolorów, nazwy komponentów odpowadają nazwą składowych kolorów.
Przypisanie nazwy komponentu odbywa się przez wywołanie funkcji x_cmp_set_name. - data
- Wskaźnik typu void. Umożliwia podpięcie dowolnych danych do komponentu. Obecnie nie wykorzystywane. Można przypisać
dowolną wartość - ref
- Wskaźnik na inny komponent, umoźliwia wskazanie komponentu referencyjnego.
- prev
- Wskaźnik na poprzedni komponent, używany do konstrukcji list komponentów
- next
- Wskaźnik na następny komponent, używany do konstrukcji list komponentów
Nagłówek:
x_cmp.h
Obiekt komponentu możemy utworzyć za pomocą funkcji
sCmp* x_cmp_create(
int32 dx, //Szerokość obrazu w punktach
int32 dy, //Wysokość obrazu w punktach
);Aby usunąć komponent z pamięci wystarczy wywyołać funkcję
sCmp* x_cmp_delete(
sCmp* cmp, //Wskaźnik na Komponent do usunięcia
);Poniżej przykład pracy z komponentami.
sCmp* cmp = x_cmp_create
(1920,1088); //Utworzenie obiektu komponentu //Przetwarzenie for(int32 y = 0 ; y < cmp->dy ; y++) //Pętla po wszystkich liniach obrazu (wierszach) for(int32 x = 0 ; x < cmp->dx ; x++) //Pętla po wszystkich punktach obrazu (kolumnach) cmp->pel[y][x] = x % 255; //Ustawienie wartości próbek obrazu - rysujemy gradient od 0 do 255 x_cmp_put_bmp_to_file(cmp,"obrazek.bmp"); //Zapisanie obrazka w pliku BMP x_cmp_delete(cmp); //Usuniecie z pamieci obiektu komponentu -
Lab 01 – Zliczanie komórek
f=imread(‚png’);
bf=im2bw(f ,graythresh(f) )
[junk threshold] = edge(I, ‚sobel’);
fudgeFactor = .5;
BWs = edge(I,’sobel’, threshold * fudgeFactor);
figure, imshow(BWs), title(‚binary gradient mask’);
se90 = strel(‚line’, 3, 90);
se0 = strel(‚line’, 3, 0);
BWsdil = imdilate(BWs, [se90 se0]);
figure, imshow(BWsdil), title(‚dilated gradient mask’);
BWdfill = imfill(BWsdil, ‚holes’);
figure, imshow(BWdfill);
title(‚binary image with filled holes’);
BWnobord = imclearborder(BWdfill, 4);
figure, imshow(BWnobord), title(‚cleared border image’);
seD = strel(‚diamond’,1);
BWfinal = imerode(BWnobord,seD);
BWfinal = imerode(BWfinal,seD);
figure, imshow(BWfinal), title(‚segmented image’);
BWoutline = bwperim(BWfinal);
Segout = I;
Segout(BWoutline) = 255;
figure, imshow(Segout), title(‚outlined original image’);
pepper2 = rgb2gray(peppers);
imshow(pepper2);
gearBW = (gearGray > 100); imshow(gearBW)
Small ex:
I = imread(‚coins.png’);
imshow(I);
bw = im2bw(I,graythresh(I));
figure,imshow(bw);
bw = imfill(bw,’holes’);
figure,imshow(bw);
L = bwlabel(bw);
obj1 = max(max(L))
stats = regionprops(L,’Basic’);
obj2 = numel(stats)