Python Opencv

Python Opencv 102

Fare Olayları

Fare Çift Tıklama İle Daire Çizen Program

  • Fare Olaylarııını öğrenip
  • cv2.setMouseCallback() fonksiyonunu tanıyacağız.
import cv2
import numpy as np

#Fare Tıklama Fonksiyonu
def __daireciz__(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img,(x,y),100,(255,0,0),-1)

#Siyah bir resim oluşturuyorum
img = np.zeros((512,512,3),np.uint8)
cv2.namedWindow('Pencere')
cv2.setMouseCallback('Pencere',__daireciz__)

while(1):
    cv2.imshow('Pencere',img)
    if cv2.waitKey(20) & 0xFF == 27:
        break
cv2.destroyAllWindows()

Yukarıdaki kodu çalıştırdığımızda görseldeki çıktyı almış olacağız.

sil.JPG

import cv2
import numpy as np


cizim = False #Fareye tıklandıysa True

mod = True #Eğer True ise dikdörtgen çiz. 'm' ye basılıysa eğrili çiz

ix, iy = -1, -1

def daireCiz(event, x,y,flags,param):
    global ix, iy,cizim,mod

    if event == cv2.EVENT_LBUTTONDOWN:
        cizim = True
        ix, iy = x,y

    elif event == cv2.EVENT_MOUSEMOVE:
        if cizim == True:
           if mod == 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:
        cizim = False
        if mod == True:
            cv2.rectangle(img,(ix,iy),(x,y),(0,0,255),-1)
        else:
            cv2.circle(img,(x,y),5,(0,0,255),-1)

img = np.zeros((512,512,3),np.uint8)

cv2.namedWindow('image')
cv2.setMouseCallback('image',daireCiz)

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


cv2.destroyAllWindows()

m tuşuna basınca mod değiştirebiliyoruz. Yani normal çizim veya direkt kare – dikdörtgen çizimi yapabiliriz.

Dinamik Bellek Yönetimi

void* malloc(int size): Bellek ayrımı yapabileceğimiz bir fonksiyon kullanımı. Heap bellekten, gönderilen değer kadar yer ayırmamız sağlanır. Eğer dönen veri yani pointer değeri boş ise yeterli belleğimiz yok demektir. İlgili örneklerde daha iyi anlaşılacaktır.

free(void *ptr): İşletim sistemine belleği iade ettiren fonksiyon. Parametre pointer olmalı. Malloc ile ayrıdığımız bellek alanını mutlaka tekrar serbest bırakmamız gerek. Zira Stack Overflow durumunu yaşamamız muhtemel olur.

Örnekler;

 int main()
{
setlocale(LC_ALL, "Turkish");

int *p;

p = (int*)malloc(sizeof(int) * 3);//3 tane int tipinde (sizeof(int) ile ne kadar yer
//kapladığını bulup) yer ayır.

if (p == NULL) {
printf("Yetersiz Bellek!");
return -1;
}

*p = 3;//Birinci sayıyı ayırdığımız yere koy
*(p + 1) = 5;//İkinci sayıyı ayrıdığımız yere koy
*(p + 2) = *p + *(p + 1);//Üçüncü bellek alanına ise bu iki sayının toplamını yaz
printf("*p = %d\n", *p);
printf("*(p+1) = %d\n", *(p + 1));
printf("*(p+2) = %d\n", *(p + 2));
free(p);

system("pause");

return 0;
}

Belleğimizi ayrımayı birde şu örnekle inceleyip daha iyi anlayalım.
Program bizden ne kadarlık yer ayırmamızı isteyecek. Ben 300 mb’lık bir alanın byte değeri olarak c sayısını aldım. İlk resim değeri vermeden önce fizksel belleğin durumunu ikincisi ise değer sonrasını göstermekte.

1.JPG2.JPG

Görüldüğü üzere fiziksel bellekte belirli bir alanda ayırma işlemi yaptık. Tabi toplama sonucu biraz geç gelecek zira döngü uzun sürecek. Dersimizde tüm belleği kullanmyı denemiş ve sistemi patlamıştık. Yani kullanım bilinmezse sistem kilitlenebilir.

realloc Kullanımı — Bakılacak

Kelime Sansürleme Programı

(Programda hata çıktı garip bir şekilde bakılıyor 22.10.2018)

Recursive Fonksiyonlar(Özyinelemeli Fonksiyon)

Bir fonksiyonun kendi içinde kendisini çağırabilir. Mesela C#’ta proje yapıyorum. Bir diskteki klasörleri taramak için Recursive fonksiyon kullanılır. En uçtaki klasöre ulaşana kadar recursive fonksiyon kendini çağırır. Mutlaka sonlandırılması gerek. Stack overflow hatası alırsın.

Recursive bir fonksiyon ile faktöriyel hesabı yapan program.


int f;
int faktoriyel(int n) {
if (n == 1) {
return 1;
}
f = n*faktoriyel(n - 1);//Bir eksiği gidecek giden bu bir eksik değer
//bir önceki n değeriyle çarpılacak.
return f;
}

int sayi;

int main(){

setlocale(LC_ALL, "Turkish");
printf("Fakı Alınacak Sayı:");
scanf("%d", &sayi);
f = faktoriyel(sayi);
printf("%d\n", f);
system("pause");

return 0;

}

 

ASP .NET HILI GİRİŞ

Buz dağının ucundan bir kaç parça kar taneciği gösterilmiştir…

ASP .NET DOT NET ifadesinden anlaşılacağı üzere Microsoft firması tarafından geliştirilmiş bir WEB uygulama geliştirme ortamıdır. .NET FREAMWORK’ un bir parçasıdır.

ASPX Dosya Yapısı

ASP .NET dosyaları ASPX yapısını kullanırlar. Peki nedir bu ASPX yapısı?

ASPX dosyası, statik HTML tabanlı, WEB sayfasında belirecek olan içeriği ayrı tutar.

WEB Uygulaması

Internet bağlantısı ve tarayıcı üzerinden erişilebilen uygulamalardır.

WEB Uygulamalarının Avantajları;

  • Sadece WEB sunucusuna kurulup çalıştırılırken masaüstü uygulaması bilgisayara kurulur.
  • Uygulama bakımı basittir. Sadece tek nokta değiştirilir.
  • Çalışması için yalnızca tarayıcı gerekmekte.

ASP .NET Web Uygulaması Çalışma mantığı

Web uygulamaları İstemci/Sunucu (Client/Server) mimarisinde çalışır.

İstemci tarafında sadece HTML anlayan bir tarayıcıya gereksinim vardır.

Sunucu tarafında ise, web uygulaması bir web sunucusu üzerinde çalışır. Asp.net uygulamaları web sunucusu olarak Microsoft IIS (Internet Information Server) kullanır.

Bir WEB Formun uzantısı ASPX’ tir. Bir web sayfası oluşturulduktan sonra iki dosya daha gelir;

ASPX.cs bu dosya arkada çalışan sayfadır yanş Code-Behind sayfasıdır. Code-Behind sayfasında PAGE LOAD, BUTTON CLICK gibi EVENT(olay) bazlı metotlar bulunur ve kodlar buraya ayzılır.

ASPX.designer.cs uzantılı dosya ise kontrollere ait kodlar bulunur (TextBox, button). Bu dosya otomatik oluşur. Kurcalamamak lazım.

Özellikler

Bir HTML sayfası STATIK bir Web sayfasıdır. Web Form sayfası dediğimiz şey ise programlanabilir sayfalardır. Bunlara ise dinamik WEB sayfaları adı verilir. Sunucu üzerinde çalışır.

Bir ASP kodu Form sayfası incelendiğinde “asp: ile başlayan ve runat=”server”” ifadelerinden anlaşılabilir.

ASP .NET kontrolleri HTML koduna dönüştürülmektedirler. Bu dönüştürme işlemleri sunucu tarafında yapılmaktadır.

ASP .NET Nesne yönelimlidir.

Şu bilinmelidir ki tüm Web formları PAGE sınıfından türetilmektedirler. Bu sınıf;

<%@ Page Title=”About” Language=”C#” MasterPageFile=”~/Site.Master” AutoEventWireup=”true” CodeBehind=”About.aspx.cs” Inherits=”WebApplication2.About” %>

bu şekilde belirlenir….

Code Behind

ASP’ de spagetti koddan kaçınmak gereklidir. Karman çorman kodlarla kimse çalışmak istemez. Bu sebeple Code Behind dediğimiz yapı çokça önemlidir.

Web Site – Web Application Faydaları Zararları

Web site hazır şeylerle çalışır. Kodlar derlenmeden direkt sunucuya yüklenir. Buda kaynak kodlara erişimi kolaylaştırır Web Uygulamasında bu söz konusu değildir.

Web uygulaması projelerinde web sunucusuna aspx uzantılı dosyalar ile dll dosyaları atılır. Program kodları derlenmiş haliyle, yani dll uzantılı haliyle sunucuya atıldığı için bu yöntem diğerine göre daha güvenlidir. dll uzantılı dosyalar bin dizininde yer almaktadır.

IspostBack Nedir?

Sunucuya giden ilk istek (request) sunucuya ulaşır. Bu ilk isteğe http GET REQUEST adı verilir. Sunucuda oluşturulan sayfa çıktısı istemciye gönderilir. Böyle bir sayfa kullanıcının tarayıcısına ilk  defa yüklenmiş olur. Sonra kullanıcı buton’a tıklayarak yada farklı bir işlemle sayfayı yenilerse yada işlem yaparsa bilgiler tekrar sunucuya gönderilir. Bu ikinci istek ise http POST REQUEST olarak isimlendirilir.

Bazı durumlarda sayfanın ilk kez mi çağırıldı yoksa sunucuya geri mi gönderildiğini bilmek gerekebilir. Bunu anlamak için Page sınıfına ait IsPostBack özelliği kullanılır. Meali Sayfa Sunucuya Geri Gönderilmiş isedir.

HTML kontrolleri POST istekleri arasında durum bilgilerini saklayamaz!

If(!IsPostBack) bunun meali ise sayfa ilk kez çağrılıyor isedir.

ViewState Nedir Ne Değildir?

ASP Kontrolüne girilen verinin silinmemesini sağlayan bir değişkendir.

Ancak bir diğer sayfaya geçince ViewState kaybolur. Birden fazla formda değer kaybı olmamasını istiyorsak *SessionState kullanılmalıdır.

Form her seferinde baştan oluşturulmaktadır. Sayfa DESTROY edilip tekrar çalıştırılınca ViewState yaşamaktadır.

SessionState web form projesinde GLOBAL.asax dosyası içinde bulunur.

SessionState’e kullanıcı sepeti örneği verilebilir.

PYTHON HIZLLI GİRİŞ

Merhaba. Bir başka hızlı rehberde Python dilini göstermek istiyorum.

KURULUM

http://www.python.org adresine gidip en son sürümü indiriyoruz. İndikten sonra kuruyoruz. Kurulum aşamasında garip bir yol yok. Herkes kolaylıkla kurabilir. Daha sonra tavsiye ettiğim ide’yi yani PyCharm’ı kurabilirsiniz. Son olarak Bu Bilgisayar veya Bilgisayarıma sağ tıklayıp –> Özellikler –> Gelişmiş Sistem Ayarları –> En Altta Ortam Değişkenleri –> Path –> Düzenle –> Yeni diyerek python’un kurulu olduğu dizini ekliyoruz.

Print Fonksiyonu

print ("Merhaba Python")

yazarak kodu çalıştırdığımızda malum olan sonucu görmüş olacağız. Daha detaylı kullanım için buraya tıklayarak öğrenebilirsin.

Şununda altını çizmek gerekirse Python’da yorum satırı için # (diyez) kullanılır.

#Bu bir yorum satırı.

Üç adet çift tırnak kullanılırsa “”” birden fazla satırda yorum yapabiliriz.

Değişkenler ve Tip Dönüşümleri

Aslında yanlış hatırlamıyorsam PHP’de olduğu gibi değiken adını yazıp hangi değeri verirsek yazılan ad o değerin türünü içeriyor. Yani

tamSayi = 10

yaptığımızda tamSayi isimli değişken Integer bir değişken olacaktır.

Aynı şekilde

virgulSayi = 5.2
karakter = 'a'
yaziDizisi = "hacı naber"

gibi örneklerle kullanım alanını gösterebiliriz.

Tip Dönüşümleri

Bu konu detaylı olarak bir sonra ki başlıktan itibaren örnekler içinde anlatıldı.

Kullanıcıdan Veri Almak (Girdi)

Ekrana adımı soran ve aldığı isme göre hitap ederek yardımcı olmaya çalışan programcık.

ad = input("Adın:") 
print ("Merhaba "+ ad +" Sana Nasıl Yardımcı Olabilirm?")

Olmazsa Olmaz Hesap Makinesi Örneği

Bir hesap makinesi yazalım.

tamSayi = input("Birinci Sayı: ")
sayi1 = int(tamSayi)
tamSayi2 = input("İkinci Sayı:")
sayi2 = int(tamSayi2)
sonuc = sayi1 + sayi2
sonucYaz = str(sonuc)
print(tamSayi + "+" + tamSayi2 + "=" + sonucYaz)

görüldüğü üzere birden fazla tip dönüşüm kullanıldı ve ortaya basit bir toplama çıkarma yapabilen hesap makinesi çıktı.

Eval() ve Exec() Fonksiyonları

https://belgeler.yazbel.com/python-istihza/input.html#eval-ve-exec-fonksiyonlari

Format() Fonksiyonu

String ifade bulunan bir programda {} yani süslü parantezleri doldurmak için kullanılan bir fonksiyondur.

Örnek

formt = "Merhaba Sn. {} {}. {} Nolu telefonunuz İçin Herhangi Bir Sonuç Bulunamadı"
isim = input("Adınız:")
soyisim = input("Soyadınız:")
no = input("Telefon Numaranız:")
print(formt.format(isim,soyisim,no))

Çıktı

Adınız:Ömer
Soyadınız:Kocaman
Telefon Numaranız:05436766666
Merhaba Sn. Ömer Kocaman. 05436766666 Nolu telefonunuz İçin Herhangi Bir Sonuç Bulunamadı

Bir başka örnek

metin = "{} ve {} Türkiye'nin İki ilidir"
a = metin.format("İstanbul","Bayburt")
print(a)

Çıktı

İstanbul ve Bayburt Türkiye'nin İki ilidir

Operatörler ve Matematiksel Fonksiyonlar

Tek farklı operatör üs alma işlemi. O da ** ile yapılmakta. 2**3=8 Buna ek olarak ==, != gibi ifadeler diğer dillerden bildiğimizle aynısı.

import math

help(math)

yazarak matematiksel fonksiyonları görebiliriz. Burada uzun uzun nasıl kullanılır diye yazmayacağım nede olsa hızlı rehber.

Koşul Sistemi

If
If koşul: 
    ifade

olarak kullanılır.

sayi = 50
if sayi != 5:
    print("Sayı beş Değil hocam!")

güzel bir örnek. Şekilli olarak şöyle yapalım;

sayi = input("Sistem Değeri:")
s = int(sayi)
if s > 10:
    print(sayi+" Değeri Sistem Sınırı Dışında!")
Elif

Yani else if’in kısaltılmış hali.

s = input("Sayı girin:")
sayi = int(s)
if sayi < 0:
    print("Sayı 0'dan Küçük")
elif sayi == 10:
    print("Sayı 10'dur")
Else
if koşul:
    ifade
else:
    ifade

Bunu da kısa kesiyorum.

Döngüler

Programcılar için fazlasıyla önem arz eden bir konu.

While ile başlayalım.
sayi = input("Sayı Girin:")
girildi = int(sayi)
while girildi < 20:
    print("20 ve Üzeri Sayı Girmelisin!")
    sayi = input("Sayı Girin:")
    girildi = int(sayi)

Görüldüğü üzere sayı 20’den küçük “iken” 20 üzeri sayı girilmesi isteniyor.

For

For kullanımı farklı. Şöyle, range() fonksiyonu ile kullanılıyor. range(başlangıç,bitiş,artış miktarı) olarak kullanılmakta.

 for sayi in range(1,51,1):
    print(sayi)

Örnekte 1 ve 50 arasında ki sayılar 1’er artarak yazılıyor.

Hata Yakalama

İçerik eklenecek….

Listeler (Diziler)

Bildiğimiz dizi kullanımı.

liste = ["İstanbul","Pendik"]
print(liste[1])

Bu örnekte ilk satırda liste oluşturduk. Aynı şekilde başlangıç indisi 0’dır. İkinci satırda 1. indis olan Pendik verisini yazdırdık. Tabi bu String türünde bir liste.

liste = ["İstanbul","Pendik"]
print(len(liste))

len() ile liste elemanlarının sayısını öğrenip ekrana yazdırdım. Listeler fazlasıyla geniş bir konu. Detaylı bilgi küçük bir araştırmaya bakıyor.

 

(Yazı burada kaldı. Önümüzde ki zamanlarda vakit olduka geliştirmeye çalışacağım.)

Python İle OPENCV #101

Orta seviyeye yönelik python projeleri ile ders tarzı bir içerik olacak. Devamında gelişmiş projeler olabilir.

İlk dersimiz Pycharm için openCV kurulumu ve trackbar uygulaması olacak.

Opencv kurmak için Pycharm’da Settings–>Project Interpreter kısmına gelip aşağıdan artıya basıp arama yerine opencv yazıyoruz. Opencv-python kütüphanesini ekliyoruz.

Ekran Alıntısı.JPG

Proje

import cv2
import numpy as np

def nothing(x):
    pass

#Siyah resim oluşturuyorum
img = np.zeros((300,512,3), np.uint8)
cv2.namedWindow('resim')

#ilk değer trackbar adı, ikinci değer bulunacağı pencere,üçüncüsü varsayılan değer,
#dördüncüsü max değer, beşincisi,geri dönen değer.
cv2.createTrackbar('R','resim',0,255,nothing)
cv2.createTrackbar('G','resim',0,255,nothing)
cv2.createTrackbar('B','resim',0,255,nothing)


anahtar = '0 : K \n1 : A'
cv2.createTrackbar(anahtar, 'resim',0,1,nothing)

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

#varsayılan trackbar konumunu ayarlama
    r = cv2.getTrackbarPos('R','resim')
    g = cv2.getTrackbarPos('G','resim')
    b = cv2.getTrackbarPos('B','resim')
    s = cv2.getTrackbarPos(anahtar,'resim')

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

cv2.destroyAllWindows()

2.JPG

Merhabalar.

Başlıktan anlaşılacağı üzere bu yazı içerisinde veri saklama yöntemlerinden biri olan Steganografi tekniği nedir ne değildir bunlar hakkında birkaç bilgi verip, C# ile yazılmış bir programı kodlarıyla birlikte paylaşacağım. En basit şekilde fazla anlaşılmayan ifadelerden uzak bir anlatımla içeriği sunmaya çalışacağım.*

Steganografi Nedir?

Eski Yunancada “gizlenmiş yazı” anlamına gelir ve bilgiyi gizleme bilimine verilen isimdir. Kriptoloji ile arasında bir fark bulunur, kriptolojide saklanan veri fark edilebilirken Steganografide böyle bir durum söz konusu değildir. Steganografide saklanacak bilgi kamufle edilmiş bir biçimde gizlenir. Kriptolojide siz bir veriyi sakladığınızda bu genellikle dikkat çekici olmaktadır. Bu sebepledir ki veri tam olarak gizlenmiş sayılmaz, bir şekilde şifrelenen veri çözülür. Lakin artı olarak verinin çözülmesi Steganografiye göre daha zordur. Steganografide fark edilen gizlenmiş veri kolaylıkla ortaya çıkarılabilir.

Eski zamanlardan bir iki örnek;

  • Herodot’un bir hikâyesine göre Pers saldırısının öncesinde saçları tıraşlanan bir kölenin kafasına yazılan uyarı mesajı, saçlarının uzaması sayesinde saklanmıştır. Bu sayede, mesaj dikkat çekmeden gerekli yere ulaşabilmiş, ulaştığında da kölenin saçları tekrar kesilerek uyarı okunabilmiştir
  • Eski Yunanistan’da, insanlar mesajları tahtaya yazıp üzerini mumla kaplarlardı. Böylece cisim kullanılmamış bir tablete benzerdi öte yandan mumun eritilmesiyle birlikte içindeki gizli mesaj okunabilirdi.1

Steganography_original.png

(Normal bir ağaç resmi)

Steganography_recovered.png

(Yukarıda ki Ağaç resmine gizlenmiş kedi resmi)1

Fark edildiği üzere çözülen kedi resminde bozulmalar meydana gelmiş…

Nerelerde Kullanılır Bu Steganografi? Veriler Nerede Saklanır?

Bu teknik, bir resim içerisine (bizim yöntemimiz), ses dosyası içerisine veya bir video içerisine veri saklamamızı sağlamaktadır. Bu veri yazı olabilir, resim olabilir. Evet, bir resim içerisinde başka bir resim saklayabilirsiniz. Eb buna Resimception ya da Fotoception diyorum.

Program Nasıl İşliyor Kodlar Ne Anlatmak İstiyor?

Evet, ilk önemli kısmımıza geldik. Öncelikle programın nasıl çalıştığını anlatayım. Daha doğrusu göstereyim. Videoda sesli anlatıma gerek duymadım. Video;

Kod Kısmı

İkinci önemli hatta en önemli kısmımız kodlar nasıl işliyor kısmı. Steganografide birkaç yöntem bulunur. Bu projede LSB yani en önemsiz bite ekleme yöntemi kullanıldı.

LSB Yöntemi Nedir?

İkilik sistemi ondalık sisteme çevirmeyi biliyoruzdur. (101)2 binary ifadesi sağdan başlayarak 1*20 + 0*21 + 1*22 olarak yazılır ve işleme tabi tutulur. Buda ondalık olarak 5 rakamını verir.

Şimdi, LSB yani en anlamsız bit 1’e veya 1’den 0’a çevrildiğinde üzerinde belirgin bir değişiklik meydana gelmeyecek olan bittir. En solda ki bit 100 yerine 101 değerini alarak değişim yaşar buda gözümüzle pek fark edemeyeceğimiz bir değişikliktir. Piksel işlediğimiz için bu bitleri tabi ki piksellerde bulacağız. RGB 0 – 255 arası değer alır malumumuz. Şimdi, görüntünün 300 x 400 boyutunda olduğunu düşünelim. O zaman 300 * 400 * 3 = 360000 LSB buluruz. Ve her karakter 8 bit ile temsil edildiğinden 360000/8  = 45000 karakteri resime gizleyebiliriz.

Adım Adım

  1. İşleme
  • Pikseller alınır.
  • R, G ve B’nin her bir değeri için LSB sıfıra eşitlenir. Bu alınan bitler karakterleri gizlemek için kullanılacaktır.
  • Her karakter tek tek işleneceği için ele alınan karakter tam sayıya çevrilir. 8 bit işleneceği (her karakter 8 bit ile temsil edilir) için R1, G1, B1 biçiminde bitler ardışık olarak gizlenir.
  • 8 bit işlendiğinde bir sonraki karaktere geçilir ve tüm işlem bitene kadar bu böyle devam eder.
  • Metin kısa olabilir. Buda resmin sadece küçük bir bölümüne işlenmesi demektir. Bu durumda çözüldüğünde problem yaşamamak için 8 ardışık sıfır metnin sonuna ulaşılınca konulur.
  1. Çıkarma
  • Karakteri gizleme işleminden daha basittir.
  • 8 ardışık sıfır bulunana kadar pikseller alınır.
  • Yine sürekli bahsettiğimiz LSB bitleri bulunur.
  • Bu karakterler bitene kadar devam eder ve çıktı verecek olan sonuç metnine aktarılır.
  • Bunlara ek olarak kodların yanında açıklamalar verildi…

Son Olarak Proje

Ekran Alıntısı.JPG

 Proje

*(Bu çalışma Codeproject sitesinden alınarak en sade biçimde tekrar işlenmiştir)

  1. https://tr.wikipedia.org/wiki/Steganografi