PYSIMPLEGUI İLE PYTHON GÖRSEL PROGRAMLAMA
İçeriği Word ortamında oluşturduğum için net olarak buraya aktaramadım. Bu şekilde paylaşmanın sağlıklı olacağını düşündüm.
İçeriği Word ortamında oluşturduğum için net olarak buraya aktaramadım. Bu şekilde paylaşmanın sağlıklı olacağını düşündüm.
Fare Çift Tıklama İle Daire Çizen Program
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.
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.
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.
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ı;
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.
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 ("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.
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.
Bu konu detaylı olarak bir sonra ki başlıktan itibaren örnekler içinde anlatıldı.
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?")
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ı.
https://belgeler.yazbel.com/python-istihza/input.html#eval-ve-exec-fonksiyonlari
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
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.
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!")
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")
if koşul:
ifade
else:
ifade
Bunu da kısa kesiyorum.
Programcılar için fazlasıyla önem arz eden bir konu.
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 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.
İçerik eklenecek….
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.
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()
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;
(Normal bir ağaç resmi)
(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
Son Olarak Proje
*(Bu çalışma Codeproject sitesinden alınarak en sade biçimde tekrar işlenmiştir)