Category: av-lib++

  • 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
    
  • Wczytanie pliku BMP

    Podstawowym obiektem służacym do operowania na obrazach jest sImg. Obiekt tej klasy składa się z tablicy komponentów typu sCmp które z kolei przechowują bezpośrednio tablicę próbek obrazu. Każdy komponent przechowuje jedną składową obrazu. Dla standardowych obrazków RGB obiekt sImg przechowuje 3 komponenty po jednym dla składowej R, G i B. Aby wczytać obrazu z z pliku BMP najpier należy stworzyć instancje obiektu klasy sImg, służy do tego funkcja x_img_create_rgb tworzące odrazu obraz w formacie RGB.

    sImg* x_img_create_rgb(
    int32 dx, //Szerokość obrazu w punktach
    int32 dy, //Wysokość obrazu w punktach
    int32 n, //Ilość dodatkowych komponentów
    );

    Jako ostatni parametr podajemy ilość dodatkowych komponentów, najczęściej parametr ten ustawiamy na 0. Aby odczytać wczytać obrazek z pliku BMP wykorzystujemy funkcję x_img_get_bmp_from_file. Przyjmuje ona jako parametry wskaźnik na obiekt obrazu (typu sImg) i ciąg znaków określający ścieżkę i nazwę pliku do wczytania.

    int32 x_img_get_bmp_from_file(
    sImg* img, //Wskażnik na obiekt obrazu
    char* name //Nazwa pliku do wczytania
    );

    Na przykład aby wczytać obrazek w formacie bmp o nazwie Poznan_Street.bmp należy napisać poniższy kod.

    sImg* img = x_img_create_rgb(1920,1088,0); //Utworzenie obiektu obrazu
    
    x_img_get_bmp_from_file(img,"Poznan_Street.bmp"); //Wczytanie obrazka z pliku
    //Przetwarzenie
    for(int32 y=0;ycmp[0]->dy;y++)
      for(int32 x=0;xcmp[0]->dx;x++)
        printf("%d",img->cmp[0]->pel[y][x]);
    
    x_img_delete(img); //Usuniecie z pamieci obiektu obrazu
    
  • Odczyt sekwencji YUV

    Podstawowym obiektem służacym do operowania na sekwencjach wizyjnych jest sSeq. Obiekt tej klasy posiada informacje o rozdzielczości sekwencji, formacie chrominancji i ilości ramek. Aby wczytać obrazu z sekwencji YUV najpier należy stworzyć instancje obiektu klasy sSeq, służy do tego funkcja x_seq_create.

    sSeq* x_seq_create(
    int32 dx, //Szerokość obrazu w punktach
    int32 dy, //Wysokość obrazu w punktach
    int32 cf, //Format chrominancji - najczęściej 420
    FILE_HANDLE fh //Uchwyt do pliku z sekwencją
    );

    Jako ostatni parametr podajemy uchwyt do pliku z sekwencja. Aby uzyskać uchwyt do pliku używamy funkcji x_fopen służącej do otwierana pliku. Oby odczytać ramke z sekwencji wykorzystujemy funkcję x_seq_get_frame_yuv. Przyjmuje ona jako parametry wskaźnik na obiekt sekwencji i wskaźnik na obiekt obrazu do którego ma zostać załadowany odczytany obraz.

    int32 x_seq_get_frame_yuv(
    sSeq* seq, //Wskaźnik na obiekt sekwencji
    sImg* img //Wskażnik na obiekt obrazu
    );

    Na przykład aby odczytać pierwszą ramkę z pliku Poznan_Street.yuv o rozdzielczości 1920 na 1088 punktów w formacie chrominancji 420 należy napisać poniższy kod.

    //Utworzenie obiektu sekwencji i otwarcie pliku Poznan_Street.yuv
    sSeq* seq_in = x_seq_create(1920,1088,420,x_fopen("Poznan_Street.yuv")); 
    sImg* img = x_img_create_yuv(1920,1088,420,0); //Utworzenie obiektu obrazu
    
    x_seq_get_frame_yuv(seq_in,img); //Odczyt ramki z sekwencji do obiekt img
    //Przetwarzenie
    
    x_img_delete(img); //Usuniecie z pamieci obiektu obrazu
    x_seq_delete(seq_in); //Usuniecie z pamieci obiektu sekwencji