
Merhaba Arkadaşlar, pythonearth de bu gün OpenCV Kamera İşlemleri ile birlikteyiz. Bir önceki yazıda resimler üzerindeki temel işlemleri görmüştük. Bu yazının konusunu ise video üzerindeki temel işlemler oluşturacaktır. Kamera ile ilgili de işlemleri gördükten sonra daha derinlere inmeye başlıyacağız. Artık bir uygulama geliştirebileceğimiz bir kıvama geleceğiz.
OpenCV ile video oluşturmak yani eldeki görüntü dizilerini kaydetmek için VideoWriter sınıfı kullanılmaktadır. Kullanımına geçmeden önce bazı kavramlara bakmakta fayda var bu kavramlar codec yani kod çözücü ve FourCC (Four character code).
Codec Nedir?
Codec kısaca kod çözücü demektir. Dijital ortamda video dosyalarını, görüntü dosyalarını, ses dosyalarını sıkıştırma ve yeniden açma işlemlerinde kullanılmaktadır.
Videolar yüzlerce görüntünün arka arkaya gösterilmesi ile oluşmaktadır. 720p 60 fps video kaydı alabilen bir kamera saniyede 1280×720 büyüklüğünde 60 adet resim çekerek bu resimleri arka arkaya oynatmaktadır. Dolayısıyla 1 dakikada 360 adet görüntü dosyası oluşacaktır. 10 dakika içinde 3600 görüntü dosyası olacağını düşünürsek dosya boyutu hayli büyüyecektir. Bu nedenle bu görüntüleri sıkıştırmak için birden fazla algoritma geliştirilmiştir. Bu algoritmalar sayesinde verilerimizi sıkıştırabiliriz fakat sıkıştırılan verileri çözebilen bir algoritmaya daha ihtiyacımız olacaktır. Çünkü sıkıştırılan veriler tekrar anlamlı bir veri olarak okunabilsin. İşte bu sıkıştırılan verileri tekrar okumaya yarayan algoritmalar codec olarak isimlendirilmektedir. Yüzlerce codec paketi vardır.
Sıkıştırılan veriyi açmak için ise bu sıkıştırma algoritmasını anlayacak ve veriyi gösterecek bir çözücüye ihtiyaç duyulmaktadır, işte bu çözücüler codec olarak adlandırılmaktadır. Sık kullanılan sizin de aşina olduğunuzu düşündüğüm bazı codec’ler şunlardır; H261, MJPEG, MPEG vb.
FourCC
“Four character code” yani dört karakter kodu olarak adlandırılır. FourCC nin amacı medya verilerindeki codec’leri dört karakter ile tanımlamaktır, yani standart bir tanımlama formatı oluşturmaktır. FourCC kodunu tanımlarken ASCI tablosunda olmayan bir karakter kullanılamaz. En çok bilinenleri DIVX, XVID, H264 vb. güncel listeye buradan bakabilirsiniz. Codec’leri indirmek için ise bu bağlantıyı kullanabilirsiniz.
FourCC formatı aşağıdaki gibidir,
8 – 8 – 8 – 8 = 4 byte – 32 bit
OpenCV içerisinde codec tanımlamak veya kullanmak için FourCC kullanacağız.
Kameradan Video Çekme
Kameradan görüntü alma ve video çekme işlemlerinde veya video dosyaları ile yapılacak işlemler için cv.VideoCapture(*args) sınıfı kullanılmaktadır. Aşağıda kameradan video çekimi yapabilmemiz için bir örnek verilmiştir. Bu örneği inceledikten sonra cv.VideoCapture(*args) sınıfına ait nesnelerin açıklamaları yapılacaktır.
-
- cap = cv.VideoCapture(*args) VideoCapture sınıfını oluşturur.
- isOpened() = VideoCapture sınıfını açmayı dener. Hata olup olmadığını kontrol eder. 1 veya 0 ya da True veya False değeri döndürür.
- release() = VideoCapture sınıfını kapatır.
import cv2 as cv cap = cv.VideoCapture(0) # Kamera bağlantısını kontrol et. if not cap.isOpened(): print("Kamera bağlantısı başarısız!") exit() while True: # Kameradan görüntü al ret, frame = cap.read() # Görüntü başarıyla alındı mı kontrol et. if not ret: print("Bağlantıdan görüntü alınamadı!") break # Gri formatta okumak için gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # Okunan görüntüyü ekranda göster. cv.imshow('frame', frame) # a tuşuna basıldığında çık. if cv.waitKey(1) == ord('a'): break # İşin bittikten sonra her şeyi serbest bırak. cap.release()
Dosyadan Video Oynatma
Sistem üzerinde kayıtlı video dosyasını oynatmak için aşağıda bir örnek program verilmiştir.
import cv2 as cv # Dosyadan video okumak için cap = cv.VideoCapture('pythonearth.mp4') # Dosyadan Görüntü okuma başarılı olduğu sürece while döngüsü çalışsın. while (cap.isOpened()): # Videodan bir görüntü al. ret, frame = cap.read() # Gri formatta okumak için gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # Okunan görüntüyü ekranda göster. cv.imshow('frame', frame) # a tuşuna basıldığında çık. if cv.waitKey(1) & 0xFF == ord('a'): break # İşin bittikten sonra her şeyi serbest bırak. cap.release() cv.destroyAllWindows()
Kameradan Çekilen Videoyu Kaydetme
Görüntüleri kaydetme işlemini sadece cv.imwrite() fonksiyonunu kullanarak yapabiliyorduk. Videoları kaydetmek için ek olarak codec ve fourcc kullanmamız gerekmektedir.
Bu sefer VideoWriter nesnesi(object) oluşturmamız gerekiyor. Daha sonra çıktı olarak alacağımız dosyaya bir isim vermeliyiz. Daha sonra FourCC kodunu belirtmemiz gerekiyor. Son işlemimiz ise renk için bir flag atamakta. Eğer bu renk değeri doğruysa(True) çözücü renk çerçevesini çalıştırır yoksa grinin tonları olarak çalışır.
FourCC kodu, MJPG için cv2.VideoWriter_fourcc(‘M’,’J’,’P’,’G’) veya cv2.VideoWriter_fourcc(*’MJPG’) olarak iletilir.
Bir kameradan görüntüyü frame halinde yakalayıp kaydetmek için aşağıdaki kod bloğunu kullanabiliriz.
Kameradan nasıl video çekilir ve kaydedilir örnek bir uygulamayla gözlemleyelim.
import cv2 as cv cap = cv.VideoCapture(0) fourcc = cv.VideoWriter_fourcc(*'XVID') # Kaydedilecek video dosyasının adı, uzantısı, konumu, saniyedeki çerçeve sayısı ve çözünürlüğü out = cv.VideoWriter('output.avi', fourcc, 50.0, (640, 480)) # Görüntü alma başarılı olduğu süre boyunca kaydetmeye devam et. while (cap.isOpened()): # Videodan görüntü oku ve geri döndür. ret, frame = cap.read() # Görüntü okuma başarılı ise if ret == True: # cv.flip(src, flipCode, dst) 2 boyutlu diziyi dikey yatay veya her iki eksen etrafında döndürür. # 0 => dikey döndürme # 1 => yatay döndürme # 2 => hem yatay hem dikey döndürme frame = cv.flip(frame, 1, dst=None) # Döndürülen görüntüyü video dosyasına yaz. out.write(frame) # Görüntüyü ekranda göster. cv.imshow('frame', frame) # a tuşuna basıldığında çık. if cv.waitKey(1) & 0xFF == ord('a'): break else: break # İşin bittikten sonra her şeyi serbest bırak. cap.release() out.release() cv.destroyAllWindows()
Çekilen videomuz ‘output.avi’ şeklinde kaydettik. Umarım faydalı olmuştur.
pythonearth.com da bu yazıda OpenCV Kamera İşlemleri yazısını işledik. Eksik veya yanlış gördüğünüz yerler için iletişime geçmekten çekinmeyin. Bir sonra ki yazıda görüşürüz.