OpenCV-Görüntü Piramidi

Pazar, Kasım 12, 2017 , , , 1 Comments

Hedefler

Görüntü piramidi oluşturmak.
Görüntü piramidi kullanarak kendi hayali objemizi oluşturmak(blending).
Kullanılacak Fonksiyonlar: cv2.pyrUp(), cv2.pyrDown()

Görüntü Piramidi Hakkında:

Normal şartlar altında tek bir görüntü üzerinde çalışırken sabit bir çözünürlük değeri(resolution) kullanırız. Fakat görüntü işleme işi ile uğraşırken bazı durumlarda aynı görüntü üzerinde farklı çözünürlük değerlerine ihtiyacımız olabilir. Mesela bir görüntü üzerinde yüz tanıma veya tespiti işlemi yaparken; aynı görüntü üzerinde bir dizi farklı çözünürlükte dizi oluşturmalı ve tüm bu yeni dizi içinde nesne taraması yapmalıyız. İş bu görüntü setine görüntü piramidi adı verilmektedir.
İki çeşit görüntü piramidi bulunmaktadır:
1) Gauss Görüntü Piramidi
2) Laplace Görüntü Piramidi

Bir gauss piramidinde yüksek seviye(düşük çözünürlüklü olan) alt seviyedeki(yüksek çözünürlüklü olan) görüntülerden ardışık satırları ve sütünları kaldırarak oluşturulmuştur. Bu işlem devam ettikçe MXN olan matris (M/2)X(N/2) şekline dönüşür. Buna bir octave denir. Aynı desen piramitte yukarılara çıktıkça devam eder(çözünürlük azalır). Benzer şekilde görüntüyü genişletirken(expanding) alan her seviyede 4 katına çıkar.
Laplace piramitleri Gauss piramitlerinin farklı bir formundan oluşturulur. Laplace için OpenCV içinde özel bir fonksiyon tanımlanmamıştır. Bu piramitteki görüntüler Gauss piramidindeki görüntülerin kenar değerlerinin döndürülmesi gibidir. Laplace piramidindeki bir seviye; Gauss piramidindeki bir seviye ile Gauss piramidinin en üst seviyedeki görüntüsünün arasındaki farktan oluşur.

Piramitleri kullanarak Resim Karıştırma(Blending)

Görüntü piramitlerini kullanarak yapabileceğimiz klasik bir uygulama görüntü karıştırma(blending) işlemidir. İki görüntüyü birbirine kaynaştırırken görüntü setlerini yığmamız gerekecek ancak görüntüler arasındaki süreksizlik yeni görüntünün iyi görünmemesine yol açmış olacak. Bu gibi durumlarda görüntü piramidi kullanılarak veri birikimi oluşmadan işlem gerçekleştirilebilir. Bu durumun klasik bir örneğini aşağıda görebilirsiniz.

 işte kodların tamamı:
import cv2
import numpy as np,sys
A = cv2.imread('elma.jpg')
B = cv2.imread('portakal.jpg')
# A için Gauss Piramidi
G = A.copy()
gpA = [G]
for i in xrange(6):
    G = cv2.pyrDown(G)
    gpA.append(G)

# B için Gauss Piramidi
G = B.copy()
gpB = [G]
for i in xrange(6):
    G = cv2.pyrDown(G)
    gpB.append(G)
# A için Laplace Piramidi
lpA = [gpA[5]]
for i in xrange(5,0,-1):
    GE = cv2.pyrUp(gpA[i])
    L = cv2.subtract(gpA[i-1],GE)
    lpA.append(L)
# B için Laplace Piramidi
lpB = [gpB[5]]
for i in xrange(5,0,-1):
    GE = cv2.pyrUp(gpB[i])
    L = cv2.subtract(gpB[i-1],GE)
    lpB.append(L)
# SAĞ Ve SOL Yarım Kürelerini Ekliyoruz
LS = []
for la,lb in zip(lpA,lpB):
    rows,cols,dpt = la.shape
    ls = np.hstack((la[:,0:cols/2], lb[:,cols/2:]))
    LS.append(ls)
# Şimdi Yeniden Oluşturma
ls_ = LS[0]
for i in xrange(1,6):
    ls_ = cv2.pyrUp(ls_)
    ls_ = cv2.add(ls_, LS[i])

# Her Yarım Küreye Bağlantı:

real = np.hstack((A[:,:cols/2],B[:,cols/2:]))
cv2.imwrite('Piramid_Karistirma.jpg',ls_)
cv2.imwrite('Direkt_Karistirma.jpg',real)

KaynakçaImage_Mosaic
Kaynak dosyaları indirmek için: TIKLAYINIZ

1 yorum:

OpenCV-Görüntü Üzerinde Geometrik Dönüşümler

Pazar, Kasım 05, 2017 , , , 0 Comments


Hedefler

Bu yazıda görüntü üzerinde taşıma, döndürme gibi geometrik dönüşüm(transformation) işlemlerini öğreneceğiz.
Kullanılacak Fonksiyonlar: cv2.getPerspectiveTransform, cv2.warpAffine

Dönüşüm(Transformation)

OpenCV; cv2.warpAffine ve cv2.warpPerspective olmak üzere iki dönüştürme(transformation) işlevi sunuyor. Dönüşüm işlemlerinin tamamında bu iki fonksiyondan faydalanmak mümkün olacaktır. Dönüşüm matris olarak; cv2.warpAffine , 2x3 dönüşüm matrisi alırken cv2.warpPerspective , girdi olarak 3x3 dönüşüm matrisini alır.

Ölçekleme(Scaling)

Ölçekleme(scaling) resmin yeniden boyutlandırılması işlemidir. OpenCV, bu amaçla cv2.resize() işleviyle birlikte gelir. Bunun dışında görüntünün boyutu manuel olarak belirtilebilir veya ölçeklendirme(scaling) faktörü belirtilebilir.Bu işlemlerde; küçültme için cv2.INTER_AREA ve yakınlaştırma için cv2.INTER_CUBIC ve cv2.INTER_LINEAR fonksiyonları kullanılabilir. Varsayılan olarak, kullanılan yeniden boyutlandırma amaçları için cv2.INTER_LINEAR yöntemi kullanılır. Aşağıdaki kodlardaki değerler ile oynayıp sonuçları inceleyebilirsiniz.
import cv2
import numpy as np

img = cv2.imread('ogu.jpg')
res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)

# Veya

height, width = img.shape[:2]
res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)

Translation(Taşıma)

Burada yapılan işlem kelimenin tam manası ile bir taşıma işlemi. (x,y) düzleminde yapılan taşıma işlemi ne ise burada da onun matris versiyonunu görüntü üzerinde gerçekleştiriyoruz.
import cv2
import numpy as np

img = cv2.imread('ogu.jpg',0)
rows,cols = img.shape

# Matrisimizi (100,50)(wight,height) şeklinde kaydırıyoruz(Shift):
M = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img,M,(cols,rows))

cv2.imshow('img',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

Döndürme(Rotation)

Temelde bir görüntünün belirlenen bir açı kadar döndürülmesi işlemidir. Bu işlemi OpenCV'nin anlayabilmesi için matris formunda matematiksel bir modele ihtiyaç duyulmaktadır:

Bu dönüşüm matrisini bulmak için cv2.getRotationMatrix2D şeklinde bir fonksiyon kullanılabilmektedir. Aşağıdaki örnekte herhangi bir ölçek olmadan görüntüyü 90 derece döndürebilmekteyiz.
import cv2
img = cv2.imread('ogu.jpg',0)

rows,cols = img.shape
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv2.warpAffine(img,M,(cols,rows))

Persfektif Dönüşümü

Perspektif dönüşümü için 3X3 dönüşüm matrisine ihtiyaç duymaktayız. Dönüşüm matrisini(transformation matrix) bulmak için görüntü üzerinde 4 noktaya ve bu noktaların toplam çıktısını almaya ihtiyacımız bulunmaktadır. Bu 4 noktanın 3'ü collinear olmamalıdır. Dönüşüm matrisini bulmak için kullanacağımız cv2.getPerspectiveTransformation() fonksiyonundan sonra cv2.warpPerspective fonksiyonunu kullanarak 3X3 matrisimizi elde etmiş olacağız. İşte Kodlar:
import cv2
img = cv2.imread('sudoku_training.png')

rows,cols,ch = img.shape
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])

M = cv2.getPerspectiveTransform(pts1,pts2)
dst = cv2.warpPerspective(img,M,(300,300))

plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()

Bu kodların çıktısı olan görüntü sayfanın başında bulunmaktadır. Görüntüden de anlaşılacağı gibi sudoku çözücü uygulamasının birinci adımını oluşturan bir uygulamayı yapmış olduk. İlerleyen zamanlarda öğrendiğimiz fonksiyonlarla çalışan bir uygulamayı beraber yapmak umudu ile. İyi çalışmalar.

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

0 yorum:

OpenCV-Renk Alanı Değiştirme Ve Nesne Takibi

Hedefler:

Bu yazıda görüntü üzerindeki renkleri bir renk uzayından diğerine çevirmeyi(convert) öğreneceğiz.
Ek olarak bir objenin gerçek zamanlı olarak akan görüntü üzerinden ayrılması(extract) işlemini öğreneceğiz.
Kullanılacak Fonksiyonlar: cv2.cvtColor(), cv2.inRange()

Renk Alanlarını Değiştirme:

OpenCV içerisinde 150 den fazla renk uzayı değiştirme(convert) metodu bulunmakta. İlerleyen zamanlarda birçoğunu uygulamalarımız içinde kullanacağız. İş bu yazının konusu olan dönüştürme metodları ise BGR <-> Gray ve BGR <-> HSV metodlarından oluşmaktadır.
Renk dönüştürmek için cv2.cvtColor(input_image,flag) fonksiyonunu kullanacağız. "Flag" dönüşümümüzün(convert) çeşidine(type) karar verecek.
BGR -> Gray dönüşümü için cv2.COLOR_BGR2GRAY flag olarak seçiliyor. Benzer şekilde BGR -> HSV dönüşümü için ise cv2.COLOR_BGR2HSV flag olarak kullanıyoruz. Diğer flag'leri merak ediyorsanız. Aşağıdaki kod bloğunu python terminalinizden çalıştırmanız yeterli olacaktır.
>>> import cv2
>>> flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
>>> print flags

Nesne Takibi

Artık bir görüntüyü BGR'den HSV'ye nasıl çevirebileceğimizi biliyoruz. Şimdi bunu herhangi bir nesnenin rengini görüntü içinde ayırt etmek için nasıl kullanırızı göreceğiz. HSV renk uzayında renkleri ayırt etmek BGR'ye göre çok daha kolay olmakta. Ayrıntılı bilgi için web'de arama yapabilirsiniz. Uygulamamızda mavi renkli bir objeyi görüntüdeki diğer nesnelerden ayıracağız(extracting).

İşte Adımlar:

Video'nun her karesini yakala
Görüntülere BGR -> HSV işlemini uygula
Değer aralığını(range) belirlediğimiz nesneyi görüntüye threhold işlemini uyguladık.
Sonra mavi objemizi görüntüden ayırıyoruz(extracting)
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while(1):

    # Her görüntü çerçevesini(frame) yakala
    _, frame = cap.read()

    # BGR'yi HSV'ye çevir
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # HSV renk uzayında mavi renk oranını(range) ayarla
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])

    # Görüntüde Mavi Objeye Threshold Uygula
    mask = cv2.inRange(hsv, lower_blue, upper_blue)

    # Orjinal Görüntüye Bitwise-AND İşlemini Uygula
    res = cv2.bitwise_and(frame,frame, mask= mask)

    cv2.imshow('frame',frame)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break
cv2.destroyAllWindows()
Bu yöntem nesne takibinin en basit yöntemi, ilerleyen zamanlarda çerçeveleri(countour) kullanarak merkez noktayı veya spesifik bir noktayı takip işlemini gerçekleştirebileceğiz.

Soru:
HSV renk uzayında renklerin değerlerini(range) nasıl öğrenebilirim?
Cevap:
Aşağıdaki örnekte yeşil renginin HSV değerlerinin nasıl bulunduğunu görüyoruz. Sizde bu yöntem yardımı ile ihtiyacınız olan değeri elde edebilirsiniz.
>>> green = np.uint8([[[0,255,0 ]]])
>>> hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
>>> print hsv_green
[[[ 60 255 255]]]

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

0 yorum:

OpenCV- Plaka Tespiti Uygulaması

Cuma, Ekim 13, 2017 , , 4 Comments


Makinelerin yükselişi bir dip dalga ile beraber artarak sürmekte. Elbette bu yükselişi gerçekleştirmeleri için "Görü(Vision)" kavramının içinin doldurulması gerekmekte. Bu yazının konusunu ise; bilgisayarlı görünün ufak bir adımı olan tanımlama(recognition) oluşturmaktadır. Önceki derslerimizde OpenCV'nin fonksiyonlar üzerinden kullanımını gördük. Şimdi ise projemizi algoritma üzerinden anlatmaya çalışacağım.

Hedefler

Araç Üzerindeki Plakayı Bulma
Bulunan plaka görüntüsünü temizleme
Temizlenen Görüntünün Tanımlanması

Projemizin ana omurgasını iki görev oluşturmaktadır:
1. Muhtemel Plaka alanlarının tespit edilmesi.
2. Muhtemel Plaka üzerindeki karakterlerin tespit edilmesi


Görev 1: Plaka Alan Tespiti İşlem Basamakları:

a) Görüntüyü Al (imread)
b) Alınan Görüntüyü Gri'ye çevir (GrayScale)
c) Görüntü Alanındaki Muhtemel Karakterlerin Vektörel Tespiti
d) Plaka Bölgesini Kesip Görüntüden Ayır (ImageExtract)


Görev 2: Plaka Üzerindeki Karakterlerin Tespiti Ve Sınıflandırılması:

e) Muhtemel Plakanın Vektörel İz Düşümü
f) Görüntünün Treshold'u
g) KNN Verinin Yüklenmesi (Load&Train)
h) Karakter Eşleştirme (Matching)
i) Tanımlanan Plakanın Değerinin Döndürülmesi (imshow)


Algoritmamızdaki tüm bu adımları takip ettiğimizde aşağıdakine benzer bir çıktı almamız mümkün olmaktadır.


Kaynakça: http://doc.openalpr.com/

4 yorum:

Görüntü Üzerinde Aritmetik İşlemler

Pazar, Ekim 01, 2017 , , 0 Comments

Şekil-1 Görüntü Ekleme(Adding)
Kullanılan Sistem Özellikleri: Ubuntu 16.04 LTS, OpenCV 3.2, Python 3.5.2

Hedefler:

Görüntüler üzerinde toplama, çıkarma, bitwise işlemlerinin yapılması
Kullanılacak Fonksiyonlar: cv2.add() , cv2.addWeighted()

İki görüntüyü cv2.add() fonksiyonu yardımı ile birbirine ekleyebilirsiniz veya basitçe Numpy operasyonu ile direkt img = res1+res2 şeklinde ekleme yapabilirsiniz. Tabi görüntülerin derinikleri, tipleri aynı olmak veya ikinci resmin sadece skalar değerlerinin bulunması şartı ile.
OpenCV görüntü ekleme işlemi ile Numpy arasında farklılıklar bulunmaktadır.
OpenCV ile görüntü ekleme işleminde satürasyon bulunurken, Numpy da modulo operasyonu
yapılmaktadır.
Peki bu satürasyon ve modulo işlemleri ne demek oluyor??
-Matematiksel model olarak bakacak olursak sonuç olarak aşağıdaki işlemleri görürüz:

>>> a = np.uint8([250])
>>> b = np.uint8([10])
>>> print cv2.add(a,b) # 250+10 = 260 => 255
[[255]]
>>> print a+b          # 250+10 = 260 % 256 = 4
[4]
Görüntüler ile işlem yaptığımızda sonuçlar daha net görüntülenmiş olacaktır.

Görüntü Karıştırma(Blending)

Bu işlem aynı zamanda görüntü ekleme(adding) işlemidir. İşlem sırasında farklı oransal ağırlıklar(weights) verilerek, görüntüde şeffaklık(transpency) ve karışma(blending) hissi verilir. Görüntüler aşağıdaki matematiksel denkleme göre eklenir.

Alfa değişkeni 0 ile 1 arasında değiştirilerek istenilen geçiş sağlanılabilir.
Örneğimizde birinci görüntünün değişkeni olarak 0.8 atamasını yaptım, ikincisinin ağırlık değeri olarak ise 0.2 değerini atadım. Takip eden denklemdeki işlemleri gerçekleştirmiş olduk.

 Gama değeri sıfır olarak atandı.
İş bu denklemleri bilgisayarımızın anlayacağı dile çevirirsek:
img1 = cv2.imread('ml.png')
img2 = cv2.imread('opencv-logo.png')

# Görüntünün Karıştırma(Blending) İşlemi:
dst = cv2.addWeighted(img1,0.8,img2,0.2,0)

cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
Şekil-1 dekine benzer bir çıktı almalısınız.


Bitwise İşlemleri

Bu kısımda mantıksal AND, OR, NOT, XOR işlemlerini öğreneceğiz. Görüntünün herhangi bir bölümünü çıkarırken, dikdörtgen olmayan ROI çıkarırken veya bu ve buna benzer birçok işlemde çok kullanışlı olduklarını göreceğiz. Aşağıda herhangi bir görüntünün belirli bir kısmının nasıl değiştirileceğini göreceğiz.
# İki Görüntü Yükle:
img1 = cv2.imread('messi5.jpg')
img2 = cv2.imread('opencv-logo.png')
# Sol Üst Köşeye Görüntüyü Yerleştirmek İstiyoruz:
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols ]
# Şimdi Bir Maske Oluşturuyoruz, Ve O Maskenin Tersini Oluşturuyoruz:
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
# ROI Üzerindeki Siyah Bölge İçin:
img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)
# Görüntü Bölgesinin Alımı:
img2_fg = cv2.bitwise_and(img2,img2,mask = mask)
# Ana Resmi İşliyoruz:
dst = cv2.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv2.imshow('res',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
Sonuçlar aşağıdakine benzer şekilde görüntülenecektir. İyi Eğlenceler
Kaynakça: http://docs.opencv.org/3.2.0/
Kaynak dosyaları ve Resimleri indirmek için: TIKLAYINIZ

0 yorum:

Bulanık Mantık Görüntü Histogram Analizi

Pazar, Eylül 17, 2017 , , 0 Comments

Aşağıda Fuzzy C-means, Gaussian Mixture Model ve K-Means Algoritması ile histogram analizi uygulamasının raporunu ve sayfanın sonunda MATLAB örnek kodlarını bulabilirsiniz.


Kaynak Kodlar: TIKLAYINIZ

0 yorum:

Ubuntu'da TensorFlow Kurulumu

Cuma, Eylül 15, 2017 , , 0 Comments

Yüklemek için aşağıdaki TensorFlow kurulum türlerinden birini seçmelisiniz:

Yalnızca CPU desteği olan TensorFlow: Sisteminizde bir NVIDIA® GPU yoksa, bu sürümü yüklemelisiniz. TensorFlow'un bu sürümünün kurulumunun (genellikle 5 veya 10 dakika içinde) çok daha kolay olduğunu unutmayın; bu nedenle, bir NVIDIA GPU'nuz olsa bile, bu sürümü önce yüklemenizi öneririz.(Diyor pek saygı değer Google)
GPU desteği ile TensorFlow: TensorFlow programları genellikle bir GPU üzerinde CPU'dan daha hızlı çalışır. Bu nedenle, sisteminizde ön koşulları karşılayan bir NVIDIA® GPU varsa ve performans kritik uygulamalar çalıştırmanız gerekiyorsa, bu sürümü eninde sonunda kurmalısınız.

TensorFlow'u GPU desteği ile çalıştırmak için NVIDIA gereklilikleri:

Bu kılavuzda açıklanan mekanizmalardan birini kullanarak GPU desteğiyle TensorFlow'ı kuruyorsanız, aşağıdaki NVIDIA yazılımının sisteminize yüklenmiş olması gerekir:
-- CUDA® Araç Kiti 8.0--İlgili Cuda yol adlarını LD_LIBRARY_PATHNVIDIA belgelerinde açıklandığı gibi çevre değişkenine eklediğinizden emin olun
-- CUDA Toolkit 8.0 ile ilişkili olan NVIDIA sürücüleri.
-- Cenevre v6--CUDA_HOME çevre değişkenini NVIDIA belgelerinde açıklandığı gibi yarattığınızdan emin olun.
-- CUDA Hesaplama Kapasitesi 3.0 veya daha yükseği olan GPU kartı
-- NVIDIA CUDA Profil Araçları Arabirimi olan libcupti-dev kitaplığı. Bu kütüphane gelişmiş profiling desteği sağlar. Bu kitaplığı kurmak için aşağıdaki komutu çalıştırın:
sudo apt-get install libcupti-dev

Virtualenv ile Yükleme

1. Aşağıdaki komutlardan birisini kullanarak pip ve virtualenv dosyalarını yükleyin:
$sudo apt-get install python-pip python-dev python-virtualenv # Python 2.7 için
$sudo apt-get install python3-pip python3-dev python-virtualenv # Python 3 için
2. Aşağıdaki komutlardan birisini kullanarak bir virtualenv ortamı oluşturun:
$virtualenv --system-site-packages ~/tensorflow #, Python 2.7 için
$virtualenv --system-site-packages -p python3 ~/tensorflow #Python 3 için
3. Aşağıdaki komutlardan biriyle virtualenv ortamını etkinleştirin:
$source ~/tensorflow/bin/activate # bash, sh, ksh, or zsh
$source ~/tensorflow/bin/activate.csh  # csh or tcsh
4. Artık terminalde aşağıdakine benzer bir tensorflow ortamında olduğunuza dair yazı görmelisiniz.
(tensorflow)$ 
5. ≥8.1 pip kurulduğundan emin olun:
(tensorflow)$ easy_install -U pip
6. TensorFlow'u active virtualenv ortamına yüklemek için aşağıdaki komutlardan birisini kullanın:
(tensorflow)$ pip install --upgrade tensorflow      # for Python 2.7
(tensorflow)$ pip3 install --upgrade tensorflow     # for Python 3.n
(tensorflow)$ pip install --upgrade tensorflow-gpu  # for Python 2.7 and GPU
(tensorflow)$ pip3 install --upgrade tensorflow-gpu # for Python 3.n and GPU
Eğer şu ana kadar herşey yolunda gitmiş ise kurulum başarı ile gerçekleşmiş demektir. Son adım olarak kurulumu kontrol etmek için:
source ~/tensorflow/bin/activate      # bash, sh, ksh, or zsh
source ~/tensorflow/bin/activate.csh  # csh or tcsh

Kodlarını çalıştırdığınızda (tensorflow) ortamına geçiyorsanız; işlem başarılı demektir.
Kaynak: https://www.tensorflow.org/install/

0 yorum:

Opencv-Python Uygulamaları-6

Çarşamba, Ağustos 30, 2017 , , , 0 Comments

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

Hedefler:

Görüntü özelliklerine erişim
Görüntüler için sınırlar oluşturma(Padding)

Kullanılacak Fonksiyonlar:
cv2.copyMakeBorder()

Görüntünün etrafında bir fotoğraf çerçevesi(frame) oluşturmak istiyorsanız; cv2.copyMakeBorder() fonksiyonunu kullanabilirsiniz. Konvülasyon, zero padding gibi işlemleri de yine aynı fonksiyon yardımı ile gerçekleştirebilirsiniz. Fonksiyonun iç yapısına bir göz atacak olursak:

src: görüntü girdisi(input)
top,bottom,left,right sınır piksellerinin değer aralıkları
borderType: İşaret(flag)'in nasıl olacağı ile ilgili parametreler. Aşağıdaki gibi devam edebilir.
cv2.BORDER_CONSTANT : Sabit renkli çerçeve ekler. Değerin hemen bir sonraki parametrede belirtilmesi gerekmektedir.
cv2.BORDER_REFLECT : Sınırlar ayna(mirror) efekti eklenerek belirtilir. Örneğin: abc|cba gibi
cv2.BORDER_DEFAULT : Mirror efekti gibi çalışır sınırları ilk tanımlı haline döndürür.
cv2.BORDER_REPLICATE : Son element kopyalanır,çoğaltılır(replicate). Örneğin: abc|ccccc
cv2.BORDER_WRAP : Son elemanı keser(wrapping)
value: Sınırın(Border) tipinin değerini gösterir.

Hadi tüm bu parametreleri daha iyi anlayabilmek için hepsini bir örnek içinde test edelim.
import cv2
import numpy as np
from matplotlib import pyplot as plt

# Matplotlib Modülünü Kurmayı Unutmayınız!!!

BLUE = [255,0,0]
res1= cv2.imread('opencv1.png')

# Kullanılan Parametreler:

replicate = cv2.copyMakeBorder(res1,15,15,15,15,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(res1,15,15,15,15,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(res1,15,15,15,15,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(res1,15,15,15,15,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(res1,15,15,15,15,cv2.BORDER_CONSTANT,value=BLUE)

# Subplotların Atamaları İçin:

plt.subplot(231),plt.imshow(res1,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
plt.show()

Örnek resim olarak; dersler için kullandığımız resmi kullandığımızda aşağıdakine benzer bir çıktı almamız gerekmektedir. Parametreleri değiştirerek sonuçlarını gözlemleyebilirsiniz. İyi eğlenceler

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

0 yorum:

Mağaradakiler

Pazartesi, Ağustos 07, 2017 , , , , 1 Comments


Uzunca bir süre bekledim. Nitekim avcının iyisi en hızlı olan değil, sabretmesini bilendir diye okumuştum bir yerlerde. Sanırım bir ayrıntıyı gözden kaçırmışım, çok beklemek iyi fırsatları tepmek anlamına geliyormuş. Yazının başlığı Cemil Meriç'ten alıntı. O da zaten Eflatun'un ünlü metaforuna gönderme yapmış. Mağara önemli bir kavram anlayacağınız.

Bugün tesadüf eseri (bir elektronik mühendisi olarak tesadüflere inanmam ama kelime karşılığı bu oluyor programlamadaki random fonksiyonunun) Cem SEYMEN'in "Para Detektifi" adlı programına denk geldim. Gelecek ile alakalı herkesin aklındaki soruları soruyor, yetmiyor bir de cevaplarının peşine düşüyor. Güzel bir program anlayacağınız. Program sırasında, yeni kurulmuş girişimlere ve ne yaptıklarına değinilirken; çokta yeni kurulmuş sayılmayacak bir firmanın aşırı iyiyiz, iddialıyız lafları dikkatimi çekti ve ne yaptıklarını merak ettim. Özetle bir görüntü işleme işi ile meşguller.

Dünyanın en iyisi olduklarını iddia ediyorlardı ama yaptıkları sunum sırasında kullandıkları yazılımın filigranı(watermark) görülüyordu. Anlayacağınız hazır bir demo'yu almışlar ve lisans ücretini bile ödememişler ki filigran kaldırılsın. Cem SEYMEN bu işin uzmanı değil ama bu firmanın devletten hibe alması ve melek yatırımcı bulması beni gerçekten şaşırttı. Sebep?

Projemin şekli bir kusurdan dolayı. Yani proje raporunun soldan bir parmak, sağdan iki parmak boşluk kuralı gibi bir kurala( Ya da tam tersi miydi?) uymamasından dolayı hibe programına seçilmemesinin üstünden çok zaman geçmedi. Çok bekledim ama sanırım avım beklediğimden daha hızlı geçti önümden. Geriye dönüp bakınca insan gerçekten hayret ediyor. Bu kadar fırsatı kaçırmayı nasıl başardım diye. Arada güzel şeyler de olmuyor değil. Mesela Arçelik-Ettom işbirliği ile yapılan yarışmada projemiz birinci oldu. Az kalsın bu yarışmaya da katılmayacaktım ya orası da ayrı bir mevzu.
Projenin videosu:


Her gün yeni şeyler öğreniyoruz, öğreniyorum. Öğrenmek kadar uygulamakta önemli bir olay. Hatta az öğrenip, hemen uygulamak en doğrusu sanırım. Çağımızın vebası, zaman. En zenginin de, en fakirin de sadece ama sadece günlük 24 saati var. Para ile her şeyi satın alabiliriz ama zamanı değil.

Değişikliklerden korkmamak gerekiyor. Değişim kaçınılmaz. Türümüzün devamını en güçlüler, en zenginler, en zekiler değil değişime en iyi adapte olanlar sağlıyor. Bizi bekleyen hayatı kabullenebilmemiz için, planladığımız hayattan vazgeçmemiz gerekiyor. Madem mağaralardan bu kadar bahsettim. Kapanışı da yine bir mağara ile ilgili Star Wars'un yodası Joseph CAMPBELL özdeyişi ile bitireyim.

"Girmeye Korktuğunuz Mağara, Aradığınız Hazineyi Barındırır."

1 yorum:

OpenCV-Python Dersleri

Çarşamba, Ağustos 02, 2017 , , 8 Comments

OpenCV-Python Dersleri:


8 yorum:

OpenCV-Python Uygulamaları-5

Çarşamba, Ağustos 02, 2017 , , 0 Comments


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

Hedefler

Değer Çubuğu ("TrackBar" ifadesi için bildiğim en doğru karşılık bu, daha doğrusu için bilgilendirirseniz sevinirim.) 'nu OpenCV pencerelerine bağlamayı öğreneceğiz.
Kullanılacak Fonksiyonlar: cv2.getTrackbarPos(), cv2.createTrackbar()

Örnek uygulamamızda, belirttiğimiz rengi gösteren basit bir işlem yapacağız. BGR (Blue,Green,Red) renklerini gösteren, her bir renk için ayrı bir değer çubuğumuz(trackbar) olacak. Çubuğu hareket ettirmemiz ile birlikte renk paletinde değişim gözlenecek. Başlangıç rengi olarak siyah atanacak.

cv2.getTrackbarPos() fonksiyonu için, ilk argüman değer çubuğuna(trackbar) verilecek isim, ikincisi açılacak pencereye verilecek isim, üçüncü argüman; varsayılan(default) değeri, dördüncü argüman, maksimum değer, beşinci argüman ise callback(geri çağırma) fonksiyonun değeridir. Geri çağırma fonksiyonu her zaman bir varsayılan(default) değere sahiptir. Bizim örnek uygulamamızda ise yaptığı spesifik bir iş olmadığından başlangıç değerini geçiyoruz.

Bir başka önemli uygulama noktası ise değer çubuğunu bir buton veya anahtar(switch) gibi kullanmaktır. OpenCV varsayılan(default) olarak bir buton fonksiyonuna sahip değildir. O yüzden track bar bir buton gibi kullanılabilir.


import cv2
import numpy as np

def nothing(x):
    pass

# Siyah bir görüntü oluştur:

img = np.zeros((300,512,3),np.uint8)
cv2.namedWindow('image')

# Değer Çubuğu(Track Bar) Oluştur:

cv2.createTrackbar('R','image',0,255,nothing)
cv2.createTrackbar('G','image',0,255,nothing)
cv2.createTrackbar('B','image',0,255,nothing)

# Anahtar(Switch) Oluştur: AÇ/KAPA özelliği için:

switch = 'O : KAPA \n1: AC'
cv2.createTrackbar(switch, 'image',0,1,nothing)

while(1):
     cv2.imshow('image',img)
     k = cv2.waitKey(1) & 0xFF
     if k ==27:
         break

# Oluşturulan Dört Değer Çubuğunun Anlık Durumlarını Tutmak İçin:

     r = cv2.getTrackbarPos('R', 'image')
     g = cv2.getTrackbarPos('G', 'image')
     b = cv2.getTrackbarPos('B', 'image')
     s = cv2.getTrackbarPos('switch', 'image')

     if s == 0:
         img[:] = 0
     else:
         img[:] = [b,g,r]

cv2.destrowAllWindows()

Uygulamanın çıktısı aşağıdaki gibidir. Değer çubuğu ile istediğiniz rengi elde edebilirsiniz. İyi Eğlenceler..
Kaynakça:  http://docs.opencv.org/3.2.0/
Kaynak dosyaları ve Resimleri indirmek için: TIKLAYINIZ

0 yorum:

OpenCV-Python Uygulamaları-4

Salı, Temmuz 11, 2017 , , 0 Comments

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

Hedefler

OpenCV de mouse yardımı ile dinamik görüntü işleme uygulamaları
Kendi ilkel Paint uygulamamızı yapmak
Kullanılacak fonksiyonlar: cv2.setMouseCallback()

Örnek Basit Bir Uygulama


Bu örnek uygulamada; açılan panel üzerinde, çift tıklanılan herhangi bir noktada, bir daire çizen uygulama yapmayı öğreneceğiz.
İlk olarak bir mouse kontrol fonksiyonu oluşturmamız gerekmektedir. Tanımlı bu mouse fonksiyonu herhangi bir mouse ile yapabildiğimiz sol tık, sağ tık, çift sol veya sağ tıklama işlemlerine müsaade etmektedir. Tanımlı bu fonksiyonun bütün durumlarının listelendiği tabloya erişmek için aşağıdaki kodu Python terminalinde çalıştırmanız yeterlidir.

import cv2
events = [i for i in dir(cv2) if 'EVENT' in i]
print events

Mouse kontrol fonksiyonu özel bir formata sahiptir ve kullanımı neredeyse her zaman aynıdır. Tek fark fonksiyonun ne yapacağı ile ilgilidir. Bizim uygulamamızda mouse kontrol fonksiyonu, panel üzerinde çift tıkladığımız herhangi bir noktaya bir daire çizecek.
Hadi kodlara bir göz atalım. Kodun açıklamaları yorum şeklinde verilmiştir.

import cv2
import numpy as np
# Mouse kontrol fonkisyonu(mouse callback function)
def draw_circle(event,x,y,flags,param):
    if event == cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img,(x,y),50,(255,0,0),-1)
# Siyah bir panel oluştur ve fonksiyonu birleştir
img = np.zeros((512,512,3), np.unit8)
cv2.nameWindow('image')
cv2.setMouseCallback('image',draw_circle)

while(1):
    cv2.imshow('image' , img)
    if cv2.waitKey(20) & 0xFF == 27:
        break
cv2.destroyAllWindows()
Oluşturduğunuz daireler ile çizeceğiniz şahaser sizin hayal dünyanızın genişliğine kalmış. Benim hayal gücüm mü??? işte aşağıda:

Haydi Biraz Daha Eğlenelim


Şimdi biraz daha eğlenceli bir uygulama yapalım. Bu uygulamada dikdörtgenler veya daireler çizeceğiz.(Seçtiğimiz mod'a bağlı olarak.)
-Bitti mi?
-Tabi ki hayır.
Aynı zamanda mouse sol tuşunu basılı tutup hareket ettirdiğimiz zaman görüntü oluşturarak ilerlemeye devam edecek. Bu uygulama bize bazı interaktif görüntü işleme işlerini anlamada ve onları oluşturmada açıklayıcı olacak.
import cv2
import numpy as np
drawing = False # Eğer mouse'a tıklandı ise: true 
mode = True # Eğer True ise, dikdörtgen çiz. 'm' tuşu mod değişimi için tanımlı
ix,iy = -1,-1
# Mouse kontrol Fonksiyonunu Çağırıyoruz(mouse callback function)
def draw_circle(event,x,y,flags,param):
    global ix,iy,drawing,mode
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        ix,iy = x,y
    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing == True:
            if mode == True:
                cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
            else:
                cv2.circle(img,(x,y),5,(0,0,255),-1)
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        if mode == True:
            cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
        else:
            cv2.circle(img,(x,y),5,(0,0,255),-1)

Şimdi mouse kontrol fonksiyonunu(mouse callback function) OpenCV penceresine entegre edeceğiz. Ana döngüde mod değişimi için bir tuş atayacağız. Böylece istediğimiz şekli bir pencerede çizdirebileceğiz.

import cv2
img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
    cv2.imshow('image',img)
    k = cv2.waitKey(1) & 0xFF
    if k == ord('m'): # Mod değişimi tuşunun ataması 
        mode = not mode
    elif k == 27:
        break
cv2.destroyAllWindows()
Evet yukarıdaki kod bloğu yardımı ile kendi ilkel Paint programımızı yapmış bulunduk. Ben örnek olması için sadece daire ve dikdörtgen çizimini gösterdim. Daha önceki uygulamalarımızda düz çizgi, üçgen, poligon vb geometrik şekillerin işlenmesi uygulamasını yapmıştık. Eğer isterseniz siz diğer şekilleri programa entegre ederek tam teşekküllü bir Paint programına sahip olabilirsiniz.
 Çok popüler olan programların özünde bu kadar basit olması şaşırtıcı değil mi? Bu arada ikinci programın örnek çıktısı aşağıda. Ve evet biliyorum çok aptalca bir çizim.

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

0 yorum:

Microwave Techniques Ders Notları

Perşembe, Haziran 29, 2017 , 0 Comments


Prof. Dr. Gökhan ÇINAR ders materyallerinden oluşmaktadır.

Ders Notları için: TIKLAYINIZ

0 yorum:

Power System Analysis 2 Ders Notları

Cuma, Haziran 23, 2017 0 Comments



Doç. Dr. Bünyamin TAMYÜREK
ders materyallerinden oluşmaktadır.

Ders Notları için: TIKLAYINIZ

0 yorum:

Power System Analysis Ders Notları

Cuma, Haziran 23, 2017 0 Comments




Doç. Dr. Bünyamin TAMYÜREK ders materyallerinden oluşmaktadır.

Ders Notlari için: TIKLAYINIZ

0 yorum:

Power Electronics Ders Notları

Cuma, Haziran 23, 2017 , 0 Comments




Doç. Dr. Bünyamin TAMYÜREK ders materyallerinden oluşmaktadır.

Ders Notları için: TIKLAYINIZ

0 yorum:

Fuzzy Logic Ders Notları


Yrd. Doç. Dr. Hasan Serhan YAVUZ hocamızın ders materyallerinden derlenmiştir.

Ders Notları : TIKLAYINIZ
Lab Notları :  TIKLAYINIZ

0 yorum:

OpenCV-Python Uygulamaları-3

Pazartesi, Haziran 12, 2017 0 Comments


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

Hedefler

OpenCV ile farklı geometrik şekiller çizme.
Kullanılacak fonksiyonlar: cv2.line(), cv2.circle(), cv2.rectangle(), cv2.ellipse(), cv2.putText()

Kodlar Hakkında:

Yukarıdaki fonksiyonlar benzer parametreleri kullanmaktadırlar. Genel manada bir açıklama yapmak gerekirse:
img: Çizmek istediğimiz görüntü
color: Şeklin rengi, BGR(Blue,Green,Red) renklerden oluşan 8-bitlik renk tayfı(255,0,0..v.b.)
thickness: Çizilen şeklin çerçeve kalınlığı
lineType: Çizginin tipi

Çizgi Çalışması:


Görüntü işleme çalışmaları sırasında, daha doğrusu bilgisayar temelli yapılan bütün işlemlerde doğadaki karşılıkları bilgisayar için anlamlandırılmalıdır. Yani kağıt ve kalem ile bir çizgi çizerken ne yapıyorsak aynı işlemleri bilgisayarın bizim yerimize adım adım yapmasını sağlamalıyız.
Matematiksel olarak bir çizgi oluşturabilmek için başlangıç ve bitiş noktalarını belirlememiz gerekir. Aynı işlemi burada da tekrarlayacağız.
import numpy as np
import cv2
#Siyah bir zemin oluşturuyoruz
img = np.zeros((512,512,3), np.uint8)

# 5 piksel kalınlığında diagonal mavi bir çizgi çizdiriyoruz. Çizginin özellikleri size kalmış, 8 bitlik değerleri istediğiniz gibi değiştirebilirsiniz.
cv2.line(img,(0,0),(511,511),(255,0,0),5)

Dikdörtgen Çizimi:


Dikdörtgen çizmek için dikdörtgenin sol üst köşesi ve sağ alt köşesi gerekir. Bu sefer resmin sağ üst köşesinde yeşil bir dikdörtgen çizeceğiz.

cv2.rectangle (img,(384,0), (510,511), (0,255,0), 3)

Çember Çizimi:


Bir çember çizmek için merkez koordinatlarına ve yarıçapına ihtiyacımız var. Yukarıda çizilen dikdörtgenin içine bir çember çizeceğiz.

cv2.circle (img,(447,63),63,(0,0,255),-1)

Elips Çizimi:


Elips çizmek için birkaç parametreye ihtiyaç duymaktayız. Merkez noktası olarak (x,y). Sonraki parametre eksenlerin uzunlukları, Eksenlerin açısı ve dönme yönü, başlangıç ve bitiş açıları. Daha fazla bilgi için cv2.ellipse fonksiyonun dökümantasyonuna başvurabilirsiniz.

cv2.ellipse(img,(256,256), (100,50),0,0,180,255,-1)

Poligon Çizimi:


Bir poligon çizmek için öncelikle köşelerin koordinatlarına ihtiyacımız vardır. Bu noktaları bir dizi haline getireceğiz ve sarı renkte bir çokgen çizeceğiz.

pts = np.array([[10,5],[20,30],[70,20],[50,10]],np.int32)
pts = pts.reshape((-1,1,2))
cv2.polylines(img,[pts],True,(0,255,255))

Not: Eğer poligonun 3. argümanını "False" yaparsanız kapalı bir şekil yerine tüm noktaları birleştiren bir çizgi elde edersiniz. cv2.polylines() fonksiyonu birden fazla çizgi çizmek içinde kullanılabilir.

Görüntülere Yazı Ekleme:


Görüntülere yazı eklemek için:
Yazmak istediğiniz veri,
Yazmak istediğiniz konumun koordinatları(örneğin verilerin başladığı sol alt köşe),
Yazı tipi (desteklenen yazı tipleri için cv2.putText() dökümanlarını inceleyebilirsiniz.) Yazı tipi boyutu
Renk, kalınlık, çizgi türü gibi yazıyı daha iyi gösterecek özellikler için lineType = cv2.LINE_AA yı kullanabilirsiniz.

#Beyaz renkte Esogu-EEE yazdıracağız.
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'Esogu-EEE', (10,500), font, 4, (255,255,255),2,cv2.LINE_AA)

Eğer işler yolunda gittiyse aşağıdaki gibi çıktılar elde etmelisiniz. Parametreleri değiştirerek kendi hayal gücünüzü yansıtabilirsiniz. İyi Eğlenceler..

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

0 yorum:

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:

OpenCV-Python Uygulamaları-1

Pazartesi, Haziran 05, 2017 , , , , 2 Comments


Ubuntuda OpenCV-Python Nasıl Kurulur?  dedikten sonra bu yazı Opencv-Python ile görüntü işleme uygulamalarının ABC'si gibidir. Keyifli okumalar,kodlamalar.

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

Hedefler

Burada bir görüntünün nasıl okunabileceğini, nasıl düzenlenebileceğini ve nasıl geri kaydedilebileceğini öğreneceğiz.
Kullanılacak fonksiyonlar: cv2.imread () , cv2.imshow () , cv2.imwrite ()
Matplotlib ile görüntüyü nasıl kullanabileceğimizi göreceğiz.

Bir Resmi Okuma

Bir resmi okumak için cv2.imread () fonksiyonu kullanılır. Resim çalışma dizininde olmalıdır veya tam bir resim yolu verilmelidir.
İkinci parametre, resmin okunması şeklini belirten bir bayraktır(flag).

  • cv2.IMREAD_COLOR: Renkli bir resim yükler. Görüntünün saydamlığı ihmal edilir. Varsayılan bayraktır(flag).
  • cv2.IMREAD_GRAYSCALE: Gri tonlama modunda görüntü yükler.
  • cv2.IMREAD_UNCHANGED: Alfa kanalı da dahil olmak üzere görüntüyü yükler.

Biraz kodlama zamanı:
import numpy as np
import cv2
#Gri tonlarda bir resim yükle
img = cv2.imread('esogu.jpg',0)

Uyarı:

Eğer resim yolu yanlışsa, herhangi bir hata almadığınız halde hiçbir sonuç göremezsiniz.

Görüntüyü Göster

Bir resmi görüntülemek için cv.imshow() fonksiyonu kullanılır. Pencere otomatik olarak görüntü boyuna uyar.
İlk parametre bir dizi(string) adıdır. İkinci parametre ise bizim imajımızdır. İstediğimiz kadar görüntü oluşturabiliriz ama farklı isimler kullanmak şartı ile.
cv2.imshow ('resim' , img) #resim adında bir pencerenin içinde bizim görüntüyü gösterir.
cv2.waitKey(0)
cv2.destroyAllWindows ()
Pencerenin ekran görüntüsü aşağıdaki gibidir.

cv2.waitKey() bir klavye bağlama fonksiyonudur. Bu fonksiyon herhangi bir klavye olayı için belirtilen milisaniyeleri bekler. O süre zarfında bir tuşa basarsanız program devam eder. Eğer "0" ataması yapılırsa sonsuza kadar bekler.
cv2.destroyAllWindows() kabaca açıklamak gerekirse oluşturulan bütün pencereleri yok ediyor. Herhangi bir pencereyi yok etmek istiyorsak pencere adını parantez içine yazmak yeterli.

Resmi Kaydetme

Bir resmi kaydetmek için cv2.imwrite() fonksiyonu kullanılır. İlk parametre dosya adı, ikinci parametre ise kaydetmek istediğimiz görüntüyü temsil eder.
cv2.imwrite('esogu.png' , img)
Bu resmi PNG formatında çalışılan dizine kaydeder.

Özet:

Aşağıdaki program gri tonlamalı bir görüntüyü yükler, eğer 's' tuşuna basarsanız görüntüyü kaydedip çıkar. 'ESC' tuşuna basarsanız kaydetmeden çıkar.
import numpy as np
import cv2
img = cv2.imread('esogu.jpg',0)
cv2.imshow('image',img)
k = cv2.waitKey(0)
if k == 27: #ESC tuşunu bekler..
cv2.destroyAllWindows()
elif k == ord('s'): #Kayıt için 's' tuşunu bekler..
cv2.imwrite('esogu.png', img)
cv2.destroyAllWindows()

Matplotlib


Matpltlib Python için tasarlanmış, çok çeşitli çizim yöntemleri sunan bir kütüphanedir(library). Sonraki yazılarda bu kütüphane çokça kullanılacak. Burada ufak bir giriş yapmak adına görüntüyü Matplotlib ile nasıl açabileceğimizi göreceğiz. Matplotlib kullanarak resimleri kolayca yakınlaştırıp, uzaklaştırabilir ve kayıt işlemi yapabiliriz.
import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('esogu.jpg',0)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.show()
Bu işlemin sonucu aşağıdaki gibi olacaktır.

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

2 yorum:

Raspberry Pi-3 OpenCV C++//Python Kurulumu

Görüntü işleme uygulamalarını, masaüstü veya dizüstü bilgisayarlar yardımı ile gerçekleştirebiliyoruz. Peki görüntü işleme uygulamalarını taşınabilir hale getirmek için ne yapabiliriz? Bu noktada aslında mini bir bilgisayar olan Raspberry Pi kullanabiliriz. İnternette Raspberry Pi hakkında birçok bilgi mevcut. Aynı şeyleri tekrarlamakta bir fayda görmüyorum. O yüzden direkt kuruluma başlıyorum. Şimdi OpenCV 3.2'nin Raspberry Pi3 için kurulumunu gerçekleştireceğiz. Tabiki eski sürüm Raspberry Pi ler içinde kurulumu gerçekleştirmiş olacaktır.

Hangi Raspberry Pi İşletimi? Rasbian Jessie
Hangi Programlama Dilleri için? Python ve C++ 

Daha Önceki OpenCV Kurulumlarını Kaldırma

sudo apt-get remove libopencv*
sudo apt-get autoremove
Kurulum için Ön Koşullar:
Sistemin güncellenmesi:
sudo apt-get update
sudo apt-get upgrade
sudo rpi-update
sudo reboot
Eğer daha önce güncelleme yapmadıysanız bu işlemler biraz zaman alabilir. Ama sonuçta güncel bir sistem güvenlik ve kararsızlık açıklıklarından arınmış demektir.
Geliştirici Araçlarının Kurulması:
sudo apt-get install build-essential cmake cmake-curses-gui pkg-config
Kütüphanelerin Kurulması: (Kütüphane içeriklerini kendi ihtiyaçlarınıza göre düzenleyebilirsiniz.)
sudo apt-get install \
  libjpeg-dev \
  libtiff5-dev \
  libjasper-dev \
  libpng12-dev \
  libavcodec-dev \
  libavformat-dev \
  libswscale-dev \
  libeigen3-dev \
  libxvidcore-dev \
  libx264-dev \
  libgtk2.0-dev
Ek Kütüphaneler:
sudo apt-get install libatlas-base-dev gfortran
Python Kurulumu:
Raspbian Jessie üzerinde Python2 ve Python3 versiyonları zaten kurulu durumda biz OpenCV 3.2.0 ı her iki Python için kurmuş olacağız.
Python-dev ve numpy Kurulumu:
sudo apt-get install python2.7-dev python2-numpy
sudo apt-get install python3-dev python3-numpy

Şimdi sırada OpenCV'nin indirilmesi ve yüklenilmesi işleminde:
OpenCV İndirme İşlemi:
sudo mount /dev/your-dev-name /home
mkdir /home
cd  /home
wget https://github.com/opencv/opencv/archive/3.2.0.zip -O opencv_source.zip
wget https://github.com/opencv/opencv_contrib/archive/3.2.0.zip -O opencv_contrib.zip
Son iki satırdaki /3.2.0 ifadesi bizim OpenCV sürümümüzü gösteriyor. Eğer siz güncellemeyi yaparken yeni bir versiyon yayınlanmış ise sadece rakamları değiştirmeniz yeterli olacaktır.
Unzip İşlemi:
cd /home
unzip opencv_source.zip
unzip opencv_contrib.zip
OpenCV Kurulum İşlemi:
OpenCV 3.2 yi Python2, Python3 ve C++ için kurarken CMake(text based user interface) kullanmamız gerekmektedir.
Çalışılacak Konumun Oluşturulması:
cd /home
mkdir build
cd build
OpenCV'nin İhtiyaçlara Göre Konfigürasyonu:
Bu ayarlamaları kendi ihtiyaçlarınıza göre şekilledirebilirsiniz. Ben Debug ve Test versiyonlarını kapattım. Çünkü Raspberry Pi üzerinde ihtiyaç duymadım. Ancak bilgisayar kurulumu yaparken kurmadığım ama performansa kattı sağladığı için NEON optimizasyonunu açık halde konfigurasyon yaptım.
cmake -D CMAKE_BUILD_TYPE=RELEASE \
 -D CMAKE_INSTALL_PREFIX=/usr/local \
 -D BUILD_WITH_DEBUG_INFO=OFF \
 -D BUILD_DOCS=OFF \
 -D BUILD_EXAMPLES=OFF \
 -D BUILD_TESTS=OFF \
 -D BUILD_opencv_ts=OFF \
 -D BUILD_PERF_TESTS=OFF \
 -D INSTALL_PYTHON_EXAMPLES=ON \
 -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.2.0/modules \
 -D ENABLE_NEON=ON \
 -D WITH_LIBV4L=ON \
        ../
Cmake konfigurasyonu birkaç dakika sonra bitecektir ve şöyle bir uyarı görmeniz lazım:
.....
-- Configuring done
-- Generating done
-- Build files have been written to: /home/pi/usbmem/opencv/opencv-3.2.0/build
Eğer "Generating done" ifadesini görmüyorsanız. Birşeyler ters gitmiş demektir. Hata mesajını kontrol edip çözebilirsiniz. Eğer yine halledemezseniz bana mesaj atmaktan çekinmeyin.

Cmake TextGUI Gözden Geçirme:
Eğer hata mesajı aldıysanız, aşağıdaki listeyi kontrol edin ve gerekli düzenlemeleri yapın, hata mesajı almadıysanız bu adımı atlayabilirsiniz
$ ccmake ../
                                       Page  1 of ..
 ANT_EXECUTABLE                   ANT_EXECUTABLE-NOTFOUND
 BUILD_CUDA_STUBS                 OFF
 BUILD_DOCS                       OFF
 BUILD_EXAMPLES                   OFF
 BUILD_JASPER                     ON
 BUILD_JPEG                       ON
 BUILD_LIBPROTOBUF_FROM_SOURCES   OFF
 BUILD_OPENEXR                    OFF
 ... more options here ....

Press [enter] to edit option
Press [c] to configure
Press [h] for help           Press [q] to quit without generating
Press [t] to toggle advanced mode (Currently Off)
OpenCV'yi Çalıştırma:
make -j4
Compile işlemi biraz zaman alabilir. Bu arada kahvenizi alıp kitap okuyabilirsiniz.. İşlem bittikten sonra:
[100%] Built target ...
Şimdi Kelimenin Tam Anlamı ile Yükleme İşlemi Yapıyoruz:
sudo make install
sudo ldconfig
Tebrikler Raspberry Pi görüntü işleme için hazır.
/usr/local/lib/libcv*
/usr/local/lib/python2.7/dist-packages/cv*
/usr/local/lib/python3.4/dist-packages/cv*
/usr/local/include/opencv2
/usr/local/bin/opencv_*
/usr/local/share/OpenCV/
Yüklemeyi Test
Python2 ve Python3 için:
Terminal üzerinde aşağıdaki komutlar ile aynı çıktıyı almanız lazım
$ python3
Python 3.4.2 (default, Oct 19 2014, 13:31:11)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> print (cv2.__version__)
3.2.0
>>>
C++ kurulumunu Test etmek için:
Yeni bir boş text dosyası oluşturun. Adını resizing.cpp yapın.

#include "iostream"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/core/core.hpp"

using namespace std;
using namespace cv;

// this function represents the size of the image for comparing 
void printsize(Mat &,Mat &);  

int main()
{
 
 // firstly read and show an image
 Mat image,resized;
 image = imread(".../mirror.jpg",1); // address of the image in you computer
 
 namedWindow("Display image",1);
 imshow("Display image",image);
 
 // resizing the input image
 resize(image, resized, Size(), 0.5, 0.5, 1); // third parameter represents the output size
 
 namedWindow("Display resized image", 1);
 imshow("Display resized image", resized);

 // to check the resizing
 printsize(image,resized);

 waitKey(0);
    return 0;
}

void printsize(Mat &image, Mat &resized) {
 int r1, c1, r2, c2;
 r1 = image.rows;
 c1 = image.cols;
 r2 = resized.rows;
 c2 = resized.cols;
 cout << r1 << " " << c1 << endl;
 cout << r2 << " " << c2 << endl;
}
Yukarıdaki kod bloğunu boş text dosyasına kopyalayın ve terminalde:
g++ $(pkg-config --libs --cflags opencv) -o resizing resizing.cpp
Komutu ile çalıştırın. Text dosyanızın olduğu klasörde yeni bir dosyanın oluşturulduğunu göreceksiniz. Çift tıklayıp çalıştır dediğiniz zaman resmin resize edildiğini göreceksiniz.

23 yorum:

Herkesin Verisine Kimse Karışamaz!

         

Bilgisayarla bir şekilde iletişime geçmiş herkesin mutlaka kullandığı yazılımlar vardır. Türkiye'de şirketlerin fiyat politikasında dolayı, kullanılması elzem olan ürünlerin orijinal olarak edinilmesi genelde zor. Dolayısı ile son kullanıcı genelde crack'li denilen versiyonları ile ürünün ücretli kısmına ulaşıyorlar. Kelimenin tam anlamıyla Crack; Kırılmış, Bozulmuş anlamlarına gelmektedir. Peki bu Crack işini kim ne karşılığında yapıyor?
           Elbette bu konu ile ilgili belki onlarca teori üretebiliriz. Birçokları aslında şirketin içindeki iyi kalpli insanlar olduğunu söyler veya dev sermaye sahibi şirketlerin karşısındaki birkaç güzel insan derler. Peki ya gerçekten bu Crack işini yapan kimliği belirsiz gruplar iyi niyetli değillerse? Ya gerçekten amaçları insanlığa hizmet etmek değilse? Eğer iyi niyet ile yapılmıyorsa ne için yapıyorlar peki? Böyle bir teoriden sonra işin rengi değişmeye başlıyor. Birçok veri bilimi şirketi aslında hem paramızı alıp hem bizim ile alakalı birçok veriyi depoluyor. Ama en azından bu verilerin yeri geldiği zaman hesabını vermek zorundalar çünkü kurumsal bir kimlikleri ve sorumlulukları var. Peki bu pek hayırsever Crack Ekibi ile alakalı sıkıntımızı nasıl çözeceğiz? veya bu pek iyi insanlar ile nasıl iletişim kurup derdimizi anlatabileceğiz? Evet, bunlar gibi birçok cevapsız soru sorabiliriz ve elbette sonra şöyle bir sonuca varırız hep birlikte: Kim ne yapsın benim verilerimi?
           Şimdi burada veri madenciliğinden, yapay sinir ağlarından daha birçok konudan bahsedip konuyu dağıtmak istemiyorum. Yeri gelince onlardan da bahsederiz elbette. Kısa kesip sonuca bağlamak için: İnsan tercihlerinden oluşur; en sevdiği renk, en sevdiği koku, nelerden korkar, nelerden tiksinir, neleri arzular, neleri arar, neler onu hayal kırıklığına uğratır. Şöyle geçmişe dönüp bir bakınca aslında yaşadığımız hayatın tümü bu ve bunun gibi birçok sorunun cevabından oluşuyor değil mi? Eee peki tüm bu veriler okunup, işlenirse bana ne zararı olacak diyorsunuz değil mi? İşte orada da toplum mühendisliği işin içine giriyor. Gauss Eğrisi (Normal Dağılım Eğrisi, Çan Eğrisi) diye bir matematiksel fonksiyon var ki işlemek istediğiniz veriyi yeterli sayıda örnek ile olasılıksal sonuç elde edebiliyorsunuz.
           Yani sade bir vatandaş olmanız hiçbir şey ifade etmiyor. Bu verinin sahipleri sizi ve toplumu çok ciddi bir oranda analiz etmiş oluyorlar. Yine de diyebilirsinizki zaten 60-70 yıl bir ömrüm var onu da bu kadar paranoyakça geçirmek istemiyorum. Kendi içinde bu önerme de kabul ama senin verilerin ile milyon dolarlar kazanan şirketlerden bence hak talep edebilmelisin. Peki bu nasıl mümkün olacak? Şu anda bildiğimiz internetin kurucusu Tim Berners-Lee her şirketten verimizi sınıflandırarak depolamasını sağlayacak bir bir sistem kurmalarını istiyor. Böylece veri sahibi istediği veriyi paylaşıma sunacak istemediği veriyi serverdan engelleyecek. Tabi izin verdiğiniz veri deposundan size de pay vermek zorunda kalacak mega şirketler. Gelelim bu yazının asıl konusuna peki bu sistem kurulana kadar ne yapalım? Hem cracksiz hem de bedava olarak işimizi halletmemiz mümkün mü? Cevap: Evet.

Paralı Programların Ücretsiz Alternatifleri



1. MicrosoftOffice--LibreOffice

İlk uygulamamız yaptığımız işe göre değişmek ile birlikte en azından okul hayatımız boyunca kullandığımız Microsoft Office. Alternatifimiz ise LibreOffice. Eğer ön yargılı olmazsanız kullanınca her tuşun sizin ihtiyacınıza göre tasarlandığını düşünmeye başlayacaksınız.LibreOffice İndirme Linki

2. Internet Download Manager--EagleGet Download Manager


Şimdi sırada günümüzün çok popüler uygulamalarından Internet Download Manager. Evet biliyorum çok kullanışlı olduğunu düşünüyorsunuz ama emin olun daha güzeli var hem de ücretsiz. İndirme Linki: http://www.eagleget.com/download/ Kurulum yaparken iNewTab adında bir eklenti daha kuruyor web tarayıcı üzerine. Eğer onu kurmak istemez iseniz işaretini kaldırmanız yeterli.

3. Adobe Reader--Foxit Reader

Aslında Adobe Reader para karşılığı yüklenen bir uygulama değil ama yine de Adobe firmasının reader programı bilgisayarı fazla yoruyor ve pdf üzerinde yapmak istediğiniz birçok işleme izin vermiyor. O yüzden hem bilgisayarı yormayan hem de çok kullanışlı bir program olan Foxit Reader'ı kullanmanızı tavsiye ederim. Tabi hem ücretli hem de ücretsiz versiyonları bulunmakta. Ücretsiz versiyonu ile zaten Adobe ne yapıyorsa ondan daha fazlasını sunuyor. İşte linki: https://www.foxitsoftware.com/products/pdf-reader/

4. Matlab--GNU Octave

Aslında Matlab alternatifi bir iki açık kaynak uygulama daha mevcut ama gerek kütüphaneleri olsun gerek arayüz kullanımı olsun Matlab'e benzerlik konusunda sanırım GNU Octave ilk sıraya yerleşir. Matlab'i tahtından indirmemesi için hiçbir sebep yok. Ya da vardır bilemiyorum şimdi. İndirme linki: https://www.gnu.org/software/octave/

    Örnekleri daha da arttırabiliriz elbette. İşte onlardan bir grup liste: https://en.wikipedia.org/wiki/List_of_free_and_open-source_software_packages . Ben sadece günlük olarak kullandığımız birkaç programdan örnek vermeye çalıştım. İnternette birkaç küçük araştırma ile bulabilirsiniz. Bu arada siz hala Google yerine DuckDuckGo yu denemediniz mi? Sadece ana sayfasında bulunan iki satır uyarı yazısını okumanız bile tercihinizi etkileyecektir diye düşünüyorum. Bu arada bu yazı bu şirketleri kötülemek için yazılmadı. Sadece kendi ürettiğimiz veri üzerinde söz hakkımız olsa fena mı olur diye düşünsek istedim. Unutmayın sizin veriniz, sizin kararınız ;)

0 yorum: