Ders 2 : OpenCV’de video nasıl okunur, nasıl gösterilir ve nasıl yeni bir video kaydedilir ? Webcam’den video elde etmek..
Öncelikle OpenCv ile webcam ya da herhangi bir IP güvenlik kamerasından nasıl live stream çekilir bunlara bakalım.
Bilgisaya doğrudan bağlı olan (usb aracılığı ile) kameralara ait live stream çekerken indeks numaralarını kullanarak yaparız. Bu değer 0’dan başlar. Örneğin laptop’a gömülü olan webcam 0.indeksli olan ilk web cam iken harici olarak usb ara yüzünden bağlı olan webcam 1.indeksli kamerayı ifade etmektedir.
Örnek uygulama üzerinden anlatarak ilerleyelim.
import cv2 |
import cv2 ile OpenCV kütüphanesini proje içine çağırıyoruz. 2.satırda cap adında capture anlamına gelen değişken tanımlıyoruz. Bu değişken url, kamera indeks, video adı gibi bir argüman alır. Örneğimizde 0 ifadesi bulunmaktadır. Bu bilgisayarımızda gömülü olan webcam’i ifade etmektedir. Videolar frame’ler den yani karelerden oluşmaktadır. Video okuma işleminde tek tek frame’lerin okunması gerekmektedir. Bunu bir döngü içinde yapmak gerekmektedir. While döngüsü altında belirli koşul gerçekleşinceye kadar video yakalamaya devam edecek bir yapı kuruyoruz.
cap.read komutu 2 değişkene ihtiyaç duyar. Bunlar için ret , frame olmak üzere 2 değişken tanımlıyoruz. Cap.read video verisi varsa True döner ve frame değişkeni içine videodan okumuş olduğu frame’leri basar.
ret değişkeninde tutulan değeri print(ret) ile yazdığımızda yukarıdaki resimde gördüğünüz gibi True döner.
Sonraki aşamalarda cv2.imshow ile yakalanan frame’leri pencerede gösterimini sağlıyoruz ve ESC tuşuna basıldığında capture kaynağını serbest bırakıp, tüm pencereleri kapatıyoruz.
Uygulamamız üzerinde değişiklik yaparak devam edelim. Yakalamış olduğumuz live video BGR renk uzayında. Yakalanan frame’leri tek tek grayscale renk uzayına çekip, gri tonlu video elde edelim.
import cv2 |
gray değişeni tanımlayıp, bu değişken içine okumuş olduğumuz frame için BGR renk uzayından GRAY renk uzayına dönüşüm işlemi yapıp, cv2.imshow içinde gray değişkenini çağırarak gri tonlamalı video elde ederiz. Burada önemli noktalardan birisi cv2.waitKey içinde tanımlanan value için çok küçük ms (milisaniye) değerleri tanımlarsanız, videonuz çok hızlı akabilir. Bu değer ile oynayarak görüntüleme hızını ayarlayabilirsiniz.
Bir IP kameradan url aracılığı ile live video elde etmek isterseniz, kameranın rtsp url’sini kullanarak bunu yapabilmek mümkündür.
Örnek :
rtsp://IP_adres:554/stream1
Live video almak istediğiniz IP kamera için internetten rtsp url’sini kontrol edebilirsiniz.
Farklı birşeyden yine bahsetmek gerekirse, while içinde True ifadesi yerine cap.isOpened() ifadesi ile cv2.VideoCapture komutu True dönerse işlem devam eder. False dönerse kaynağı bırakır.
print(cap.isOpened()) ile dönen değeri ekrana yazdırabilirsiniz.
Video ile ilgili daha fazla detay döndürmek için https://docs.opencv.org/3.4/d4/d15/group__videoio__flags__base.html OpenCV flags for Video yazısındaki komutlar çalıştırılabilir.
Örneğin frame için genişlik ve yükseklik bilgisini elde etmek istiyorsak;
CAP_PROP_FRAME_WIDTH , CAP_PROP_FRAME_HEIGHT komutlarını kullanabiliriz. Örnek yaparak devam edelim.
import cv2
cap=cv2.VideoCapture(0) #indeks değeri 0'dan başlar.
#eğer birden fazla bağlı kameranız varsa 1 yazarak diğerini açabilisiniz.
while(cap.isOpened()):
ret,frame=cap.read()#2 değişkene ihtiyaç duyar
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
#print(ret)
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
cv2.imshow("webcam_pencere",gray)
k=cv2.waitKey(1)
if k==27:
break
cap.release()#kaynağı serbest bırakıyoruz
cv2.destroyAllWindows() #tüm pencereleri kapatıyoruz
cap.get(cv2.CAP_PROP_FRAME_WIDTH) ile genişlik, cap.get(cv2.CAP_PROP_FRAME_HEIGHT) ile yükseklik bilgisini alıyoruz. Bunları konsola yazdırmak için print içine yazıp, genişlik-yükseklik bilgisini döndürüyoruz.
Webcam’den yakaladığımız frame’leri kaydetmek için cv2.VideoWriter sınıfını çağırıyoruz. cv2.VideoWriter() birden çok argüman almaktadır. Bu argümanlara bakalım.
- Birinci argüman, çıktı olarak üretilecek dosyanın adı,
- İkinci argüman, fourcc code değeridir. 4 byte’lık bir koddur ve video kodeğini belirtmek için kullanılır. Video kodeklerine ait fourcc kod değerlerini görmek için https://www.fourcc.org/ adresini kullanabilirsiniz.
- Üçüncü argüman, FPS değeridir. Frame per second 25.0 gibi.
- Dördüncü argüman, boyut bilgisidir. (640,480) gibi. Ilk değer genişlik, ikinci değer yükseklik
import cv2
import numpy as np
# VideoCapture objesi oluştur
cap = cv2.VideoCapture(0)
# Kamera başarılı bir şekilde açıldı mı kontrol et
if (cap.isOpened() == False):
print(Kameradan yayın alınamadı")
# Genişlik ve Yükseklik değerlerini al
# Çözünürlük ile ilgili genişlik ve yükseklik değerlerini float’tan integer’a dönüştür
frame_width = int(cap.get(3))
frame_height = int(cap.get(4))
# Video codec’ini tanıma ve VideoWriter objesi oluştur. 'outpy.avi' dosyası içine frame’leri yaz.
out = cv2.VideoWriter('outpy.avi',cv2.VideoWriter_fourcc('M','J','P','G'), 10, (frame_width,frame_height))
while(True):
ret, frame = cap.read()
if ret == True:
# 'output.avi' içine frame’leri yaz
out.write(frame)
# frame’leri pencerede göster
cv2.imshow('frame',frame)
# Kaydı durdurmak için klavyeden q tuşuna bas
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# Break the loop
else:
break
# Herşey tamamlandığında, VideoCapture ve video write objelerini serbest bırak
cap.release()
out.release()
# Tüm pencereleri sonlandır
cv2.destroyAllWindows()
ouypy.avi dosyası kaydedilmiş oldu.