OpenCV-Python Uygulamaları-2





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. İyi Eğlenceler..

Kullanılan Sistem Özellikleri: Ubuntu 16.04 LTS, OpenCV 3.2, Python 3.5.2

Hedefler

Burada bir videonun nasıl okunabileceğini, nasıl düzenlenebileceğini ve nasıl geri kaydedilebileceğini öğreneceğiz.
Ayrıca bir videonun nasıl yakalanıp, görüntülenebileceğini de öğrenmiş olacağız.
Kullanılacak fonksiyonlar: cv2.VideoCapture() , cv2.VideoWriter()

Kameradan Video Çek


Genellikle kamera ile canlı akış yakalamak isteriz. OpenCV bunun için çok basit bir arayüz sağlar. Şimdi bebeğin birkaç adım atması mahiyetinde birkaç basit işlem yapacağız. Dünyayı dolaşmak istesek de markete gitmek istesekte aynı adımları atıyoruz ama niyet sonucu çok etkiliyor. Neyse konumuza dönelim

Bir videoyu yakalamak için bir VideoCapture nesnesi(object) oluşturmak gerekir. Parametre olarak cihazın indeksi veya video dosyasının adı kullanılabilir. İndeks sadece kamerayı tanımlar. Normalde (laptop kullandığımızı varsayıyoruz.) bir kamera bağlanacaktır. Bu yüzden sadece "0" değerini veriyoruz. Eğer harici ikinci bir kamera kullanıyorsanız "1" i index olarak seçmelisiniz.

import numpy as np
import cv2
cap = cv2.VideoCapture(0) # harici bir kamerada i=0 yerine i=1,2,3..vs kullanabilirsiniz
while(True):

#Çerçeveler halinde görüntü yakalar
    ret, frame = cap.read()

#Üzerinde işlem yapacağımız çerçeve buraya gelsin
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

#Sonuç Çerçeveyi Görüntüleme:
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'): # q ile çıkış yapabilirsiniz
        break

#Herşey yolunda gitti ise dükkanı kapatabiliriz :)
cap.release()
cv2.destroyAllWindows()

cap.read() bir boolen(True/False) mantık işlemi döndürür. Eğer çerçeve(frame) doğru bir şekilde okunduysa, doğru(True) çıkışını verecektir. Bu bize videonun kontrol edilmesi olanağını verecektir.
Bazen cap görüntü yakalamayı tanımlamayabilir. Bu durumda bu kod hata dönderecektir. Eğer doğru bir şekilde tanımlanıp tanımlanmadığını kontrol etmek istiyorsak cap.isOpened() methodunu kullanabiliriz. Hata yoksa bu metodu kullanmaya da gerek yoktur.

Not: Eğer hata alıyorsanız, kameranın doğru çalıştığından başka bir uygulama yardımı ile emin olun

Dosyadaki Bir Video ile İşlem Yapmak


Pratik olarak Kameradan görüntü yakalamak ile aynı işlem, yalnızca kamera indeksi yerine videonun dosya adını koymak gerekiyor.
Ayrıca çerçeveyi(frame) görüntülerken, cv2.waitKey() için uygun zamanı kullanmak gerekmektedir. Çok düşükse, video çok hızlı olacaktır ve çok yüksekse, video yavaş oynatılacaktır.(Aslında yavaş çekim(Slow-motion) uygulamalarının atası diyebilirsiniz bu işleme.). Normal durumlarda 25 milisaniyede sorunsuz olacaktır.

import numpy as np
import cv2
cap = cv2.VideoCapture('videotest.avi') # Kullanacağınız videonun adını buraya yazmalısınız!!

while(cap.isOpened()):
#Çerçeveler halinde görüntü yakalar
    ret, frame = cap.read()

#Üzerinde işlem yapacağımız çerçeve buraya gelsin ve griye dönsün
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

#Sonuç Çerçeveyi Görüntüleme:
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
       break

#Herşey yolunda gitti ise dükkanı kapatabiliriz :)
cap.release()
cv2.destroyAllWindows()

Not: ffmpeg veya gstreamer doğru sürümlerinin kurulduğundan emin olun. Bazen hatalı yükleme sebebi ile VideoCapture ile çalışmak sıkıntılı olabilmektedir.

Video Kaydetme


Bir video yakalayıp, onu kareler halinde işledikten sonra bu videoyu kaydetmek isteriz. Bir önceki uygulamamızda resimler için sadece cv2.imwrite() kullanmanın yeterli olduğunu görmüştük. Burada biraz daha zaman harcayacağız ama kolayca halledilebilecek bir işlem.
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.
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
#Codec tanımlama ve VideoWriter nesnesi(object) oluşturma
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640,480))

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret == True:
        frame = cv2.flip(frame,0)
        out.write(frame)
        
        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
           break
    else:
       break
#Herşey yolunda gitti ise dükkanı kapatabiliriz :)
cap.release()
out.release()
cv2.destroyAllWindows()


Kaynak dosyaları ve Resimleri indirmek için: TIKLAYINIZ
Kaynakça:  http://docs.opencv.org/3.2.0/

0 yorum: