Author: Krzysztof Wegner

  • Szablon Programu w WinApi

    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.

  • 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_file

    OPENFILENAME 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).aspx

    CHOOSECOLOR 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)

    1. Filtr skalujący obraz x2 – 88474
    2. Filtr skalujący obraz na dowolny rozmiar – 88495
    3. Filtr konwertujący obraz RGB na YUV – 84315
    4. Filtr konwertujący obraz YUV na RGB – 88511
    5. Filtr konwertujący obraz RGB na w odcieniach szarości – 88536
    6. Filtr konwertujący obraz RGB na sepie – 88481
    7. Filtr konwertujący obraz RGB na Czarno biały (1 bit) – progowanie – 84421
    8. Filtr konwertujący obraz RGB na Czarno biały (1 bit) – dither – 88479
    9. Filtr greenbox’a – 88603
    10. Filtr nakładający napisy – 88620
    11. Filtr dokonujący konwersji z RGB do 16 kolorów z metoda ditheru – 88630
    12. Filtr dokonujący konwersji z RGB do 16 kolorów z metoda kwantowania wektorowego – 88528
    13. Filtr wyszukujący i śledzący kolorowy kartonik papieru – 88600
    14. Filtr wyszukujący i śledzący najbliższy obiekt (KINEKT) – 84318
    15. Filtr nakładajacy logo nadawcy – 88531
    16. Filtr wyświetlający wektory ruchu – 84414
    17. Filtr obliczający DCT – 88475
    18. Filtr odczytujący tekst z pliku oraz filtr wyświetlający tekst – 88619
    19. Filtr dokonujący predykcji intra – 88613
    20. Filtr PIP – Picture in the Picture – 88515
    21. Filtr obracajacy obraz o 90 stopni – 88453
    22. Filtr obracajacy obraz o dowolny kąt – 88472
    23. Filtr znaczący obraz – ukrywający tekst w obrazie (Ulotny znak wodny) – 88506
    24. Filtr detektor znaczonego obrazu – wykrywający ukryty tekst w obrazie (Ulotny znak wodny) – 88506
    25. Filtr do zakrywania fragmentu obrazu (np twarzy, tablic rejestracyjnych) – 88617
    26. Filtr przeplatający 2 obrazy w jeden – 88599
    27. Filtr wyświetlający 2 obrazy w technice anaglifowej – 88594
    28. Filtr wyświetlający 2 obrazy w trybie obraz przy obrazie (SideBySide) – 88538
    29. Filtr wyświetlający fps’y – 88616
    30. Filtr efekt graficzny przestawiający kafelki (puzle) – 88533

    Bardziej wymagające projekty (max ocena 5)

    1. Filtr pobierający obraz z przystawki Kinekt
    2. Filtr wyszukujący i śledzący twarz (Analiza koloru twarzy) – 88612
    3. Filtr składający 2 obrazy do jednego obrazu 3D w trybie obraz przy obrazie (SideBySide) – wersja rozszerzona
    4. Filtr składający obraz i mapę głebi do jednego obrazu 3D w trybie obraz przy obrazie (SideBySide) (KINEKT) – 88595
    5. Filtr lub Filtry odczytujące obraz 3D z formatu AVI Fujitsu
    6. Filtr nakładajacy logo nadawcy – wesja rozszerzona – 84251
    7. Filtry strumieniujące dane przez internet (serwer i klient)
    8. Filtr strumieniujący dane przez system plików
    9. Filtr PIP – Picture in the Picture – wersja rozszerzona – 84398
    10. Filtry zapisujące i odczytujące dane z wykorzystaniem kompresji Huffmana
    11. Filtry zapisujące i odczytujące dane z wykorzystaniem kompresji LZW – 88483
    12. Filtr syntezujący obraz z mapy głębi i obrazu (KINEKT) – 84267
    13. Filtr otwierający pliki MPO (3D)
    14. Filtr zapisujący pliki MPO (3D)
    15. Filtr zapisujący pliki JPG – 88490
    16. Filtr zapisujący pliki BMP – 88526
    17. Filtr czytajacy QPkody – 88503
    18. Szybki filtr skalujący obraz x2 (SSE) – Kuik
    19. Szybki filtr skalujący obraz na dowolny rozmiar (SSE)
    20. Szybki filtr konwertujący obraz RGB na YUV (SSE) – 84273
    21. 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)