Category: Prowadzone zajęcia

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

  • Materiały pomocnicze – Lab 03 z Zaawansowanego Programowania w Multimediach

    Przykładowe obrazki do wkorzystania w aplikacji.