Videolara Giriş

Created with Sketch.
  • Videoların, karelerin(frame) ne olduğu öğreneceksiniz
  • Videoyu okumak, izlemek ve kaydetmek için gerekli fonksiyonları öğreneceksiniz: cv2.VideoCapture()cv2.VideoWriter(), cv2.cvtColor()
  • Webcam üzerinden görüntü almayı öğrenceksiniz.
  • Videolarla işimiz bittiğinde nasıl kapatağımızı öğreneceksiniz.

1.Video Nedir ?

Resimlere giriş başlığında resimlerin ne olduğunu konuşmuştuk. Hatırlarsanız resimlerin yapı taşı piksellerdi. Benzer şekilde videoların yapı taşı da frame(kare)dir. Her bir frame aslında bir resimdir ve bu resimlerin arka arkaya gelmesiyle video dediğimiz yapı ortaya çıkar.

Frameler, videolar üzerinden algılama işlemleri yapmamızı sağlayan en önemli ögelerdir. Bu yazıda, framelerin ne olduğunu ve OpenCV algoritmalarını neden ve nasıl framelere uyguladığımızı göreceğiz.

1.1 Öyleyse, Frame Nedir?

Frame, bir videonun herhangi bir anındaki resimdir. Yani bir videoyu oynattığımızda ve herhangi bir anda durduğumuzda videonun o anki frame’ini veya o anki resmini görürüz. Yani frame aslında resimdir. Bir çok frame’in yada resmin arka arkaya gelmesiyle video dediğimiz şeyler oluşur.

Videolar üzerinde işlemler yaparken aslında tek tek tüm frameleri inceleriz. Bu frameleri tek tek işleriz ve daha sonra işlenmiş frameleri birleşitiririz. Son olarakta videonun işlenmiş halini tekrardan izleriz.

İşte bu yöntemle, OpenCV fonksiyonları da frame’lere uygulanır. Bu şekilde videoları işleriz ve sonuçlara bakarız.

2. OpenCV’yi Kullanma Vakti

Frame, video gibi kavramların ne olduğunu anladığımıza göre artık uygulamaya yapmaya başlayabiliriz.

2.1 Videoları Okuma

Videoları okumak için özel bir fonksiyon öğreneceğiz: cv2.VideoCapture(). Bu fonksiyon içerisine bir adet argüman alır. Eğer bilgisayarınızdaki videoyu kullanacaksanız fonksiyonun içerisine videonun adresini uzantısıyla(.mp4 gibi) beraber yazmalısınız. Eğer webcam kullanacaksanız 0 değerini girmelisiniz.

Biz bu örnekte webcam’den görüntü alacağız.

import cv2
cap = cv2.VideoCapture(0)

İlk satırda her zamanki gibi kütüphanemizi ekledik, ikinci satırda ise videoyu okuduk. Şimdilik kodları çalıştırıp hata alıp almadığınıza bakabilirsiniz ama unutmayın henüz ekranda bir şey göremeyeceksiniz.

Dipçe: Eğer kodları çalıştırdığınızda SourceReaderCB::~SourceReaderCB terminating async callbackgibi bir hata aldıysanız endişelenmeyin. Bu önemli bir hata değil, diğer fonksiyonları yazınca bu hata kalkacak. Eğer başka bir sorun yoksa devam edebilirsiniz.

2.2 Videoları İzleme

Videoların frame’lerden oluştuğunu öğrenmiştik, o halde webcam’den aldığımız frameleri tek tek okuyarak daha sonra da arka arkaya sonsuz defa ekleyerek ekrandaki görüntümüzü izleyebiliriz. Dolayısıyla bu aşamada sonsuz bir döngü kurmamız gerekiyor. Bu döngü içinde, cap.read() ile frameleri tek tek okuyacağız. Okuduğumuz bu frameleri daha önce öğrendiğimiz cv2.imshow() ile görüntüleyeceğiz. Aslında yaptığımız şey resimleri ardı ardına sonsuz defa cv2.imshow() ile göstermekten ibaret.

cap.read() fonksiyonun içine herhangi bir argüman girmemize gerek yok. Bu fonksiyon 2 değer döndürür.

Birincisi, eğer frameler doğru okunuyorsa 1 değerini döndürür, yani True. Eğer yanlış okunduysa veya okunamadıysa 0 yani False değerini döndürür. Bu değeri ret değişkeninde saklayacağım.

İkincisi ise, frame’lerdir. Dolayısıyla fonksiyonun dündürdüğü ikinci değeri daha sonra izlemek üzere frame değişkeninde saklıyorum.

Gelin kodlara bakalım :

import cv2
cap = cv2.VideoCapture(0)

while True:
   ret,frame = cap.read()
   cv2.imshow("webcam",frame)

Henüz çalışır bir kod elde etmedik. Buraya kadar anladıysak yapmamız gereken son bir şey kaldı. Videoyu sorunsuz kapatmak.

Bu aşamada 2 fonksiyon daha kullanacağız: cv2.waitKey() ve cap.release().

cv2.waitKey() fonksiyonunu daha önce zaten öğrenmiştik. İçine girdiğimiz süre(milisaniye) kadar frame’i ekranda bekletiyordu. cap.release() ise, videoyla işimiz bitti ve artık serbest bırak demek. Eğer bunu yapmazsak videoyu açamayız, çünkü video hala işlemde gözüküyor.

import cv2

cap = cv2.VideoCapture(0)

while True:
   ret,frame = cap.read()
   cv2.imshow("webcam",frame)

   if cv2.waitKey(1) & 0xFF == ord('q'): 
      break 

cap.release() 
cv2.destroyAllWindows()

Şimdi kodları çalıştırabiliriz. Webcam’den aldığımız görüntüde her bir kare, 1 milisaniye ekranda gözükecek, ta ki biz q düğmesine basana kadar.

Dipçe: Eğer q düğmesine bastığınızda, [ WARN:1] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (674) SourceReaderCB::~SourceReaderCB terminating async callback şeklinde bir hata ile karşılaşıyorsanız, kodlardaki 3. satırı:

cap = cv2.VideoCapture(0) 

Aşağıdaki şekilde düzenleyin:

cap = cv2.VideoCapture(0,cv2.CAP_DSHOW) 

2.3 Video Kaydı Alma

Kameradan aldığımız görüntüleri kaydetmek oldukça kolay bir işlemdir. Basitçe yapmamız gereken şey, kareleri (frame) tek tek arka arkaya eklemek olacaktır. Bu aşamada 2 yeni fonksiyonla tanışacaksınız: cv2.VideoWriter_fourcc(), cv2.VideoWriter()

Şimdi kodları inceleyerek işe başlayalım:

import cv2

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

fileName = "E:\Pycharm\video_recording\output.avi"
codec = cv2.VideoWriter_fourcc('W', 'M', 'V', '2')

frameRate = 30
resolution = (640, 480)

videoFileOutput = cv2.VideoWriter(fileName,codec,frameRate,resolution)

while True:

   ret, frame = cap.read()
   videoFileOutput.write(frame)

   cv2.imshow("windowName", frame)
   if cv2.waitKey(1) == 27:
      break

cv2.destroyAllWindows()
videoFileOutput.release()
cap.release()

5. satırda, kayıt için oluşturulacak dosyanın adresine, adına ve uzantısına karar verdik. 6. satırda, videonun fourcc codec değerlerini girdik. 8-9. satırlarda sırasıyla kare hızı ve çözünürlük değerlerini girdik.

11. satırda, videoları bir dosyaya yazmamızı sağlayan fonksiyona değerlerini girdik ve bunu “videoFileOutput” değişkeninde sakladık. Daha sonra while döngüsü oluşturarak tek tek kareleri okuyup, bunları videoFileOutput.write(frame) ile “videoFileOutput” değişkenine yazdık. İşlem bu şekilde ESC tuşuna basana kadar devam eder.

Sonuç olarak, ESC düğmesine bastıktan sonra çıktı dosyası belirlenen adreste oluşacaktır.

Yorum yapılmamış

Yorumunuzu ekleyin