Video 4 Linux 2 (v4l2) Bölüm 1 – Fotoğraf çekmek
Giriş bölümünde de bahsetiğim gibi video formatımız YUV olacağından biraz bu formatı açıklayayım.
YUV, parlaklık (Luminance – Y) ve renk (Chroma – UV) bilgisinden oluşan bir renk sistemidir. Renkli televizyon yayınlarının siyah beyaz sistemler tarafından da izlenebilmesi için tasarlanmıştır. Yani Y bileşeni görüntünün siyah beyaz kısmını oluşturur. Buna ek olarak renk bilgisini içeren chroma sinyali buna eklenmiştir. Bir görüntünün bütün bileşenlerinin (RGB – Kırmızı Yeşil Mavi) alıcıya gönderilmesi yüksek band genişliği sorunuyla birlikte geldiğinden, renk bilgisini içeren UV bileşeni band genişliği nedeniyle aslında kayıplı bir sıkıştırma yöntemi olarak tasarlanmıştır. Esasen renk bilgisi kırmızı ve mavinin farkından oluşur. Kabaca, U maviden yeşile, V de yeşilden kırmızıya değişen bir değerdir ve ayrıca bu sinyaller işaretli değerlerdir. Y ise işaretsizdir. YUV bazen YCbCr olarak da adlandırılsa da YCbCr bu formatın işaretsiz halidir. Bu yüzden bazı kameralarda çıkış YUV denmesine rağmen aslında çıkış YCbCr dır. (OV5640 gibi)
YUV veya YCbCr bir renk sistemi olduğundan, insan gözünün anlayabildiği tek renk sistemi RGB ye geçişte veya RGB den YUV ye geçişte her bir bileşenin yeniden hesaplanması gerekir. Aşşağıda bu denklemler verilmiştir.
YUV (YCbCr) den RGB ye
RGB den YUV (YCbCr) ye
Yukarıda verilen tüm çevrim denklemleri 8 bit için geçerlidir ve her bir bileşen 0 ila 255 arasında bir değer alır. Her hangi bir değerin 0 ın altında veya 255 in üzerinde çıkması muhtemeldir. Böyle bir durumda alt limit 0, üst limit ise 255 seçilmelidir.
Aslında denklemlere bakıldığında bazı şeylerin YUV sisteminde yapılmasının daha kolay olduğu aşikardır ki günümüzde bile hala kameraların bu sistemleri desteklemesi de bu yüzdendir. Mesela YUV sisteminde parlaklık ayarı için sadece Y bileşeni ile oynamak yeterlidir veya beyaz dengesi için U ve V bileşenlerini birbirlerine eşitlemek yeterlidir. RGB sistemi için işler bu kadar kolay değildir.
İnsan gözü renkden ziyade parlaklığa daha duyarlı olduğundan ve sınırlı band genişliği sorunlarından dolayı, renk bilgisini daha düşük seviyede yeniden örneklenmiştir. Aşağıda farklı YUV formatları gösterilmiştir.
YUV444 herkesin aşina olduğu kayıpsız RGB formatı gibidir. Her bir bileşen her piksel için birkez örneklenir. YUV422 formatında Y her pikselde birkez örneklenirken, renk bilgisi her iki pikselde bir kez örneklenir. YUV420 da ise renk bilgisi her dört pikselde birkez örneklenir ki böyle resmin çıktısı renk bakımından oldukça fakirdir.
Dijital ortamda YUV422 resmin (kullanacağım format) data formatı yine adına uygun şekilde önce resmin boyutu kadar Y bileşeni, boyutun yarısı kadar da U ve V bileşenlerinden oluşur. Örneğin resim 640×480 boyutunda ise 307200 bayt (640*480) Y bileşeni (siyah-beyaz kısım) yine 307200 bayt da renk bilgisidir (UV). Fakat renk bilgisinin yarısı U bileşenine (153600 bayt) kalan kısmı ise (153600 bayt) diğer bileşen olan V bileşenine aittir. Yani toplamda parlaklık ve renk bilgisi olarak data uzunluğu 614400 bayttır. Bu durumda resim formatını RGB (640*480*3 byte = 921600 byte) ile kıyaslarsak yaklaşık %33 civarında bir sıkıştırma söz konusudur.
Aşşağıda 640×480 boyutlarında YUV422 formatında bir görüntünün 640×960 (tam boyutlu YUV422) boyutlarında çıktısı görülmektedir.
Dikkat edilirse U ve V, Y bileşeninin yarısı kadar örneklendiğinden siyah beyaz görüntünün hemen altında dört adet küçük boyutta resimcikler oluşmuştur. Y bileşeninden hemen sonra U bileşeni ve daha sonra V bileşeni geldiğinden resimciklerin ikisi aynı tonlara sahiptir. Fakat bu resimcikler aslında renk bilgisidir.
Yukarıda YUV den RGB ye dönüşüm için verilen denklemi kullanarak YUV422 formatındaki resmi RGB ye çevirirsek sonuç aşşağıdaki gibi olacaktır.
Ayrıca resmin siyah beyaz kısmıda görüntü işleme işlemi için rahatlıkla kullanılabilir.
Gerekli program aşşağıda verilmiştir.
capture.c
Program şu şekilde çalışmaktadır; Video formatı ve gerekli bellek ayarlandıktan sonra kamera açılır. Sadece bir adet video karesi alınarak bu karedeki YUV formatından siyah-beyaz ve renkli görüntü elde edilip bmp formatında kaydedilir. Kayıt sonunda kamera kapatılır ve program sonlandırılır.
Programı derlemek için
gcc capture.c bmp.c -o capture -lv4l2
bmp.c ve bmp.h dosyalarını bölüm 0 da bulabilirsiniz.
Devam edecek…