Perşembe, Eylül 14, 2017

Satranç tahtasında bir birini yemeyen Kaleler (Python 2)

Python ile Satranç tahtasına 8 Kaleyi, bir birini yemeyecek şekilde nasıl yerleştirirsiniz?

sorusuna cevap vermek için uğraşırken, aşağıdaki gibi bir kod yapısına ulaştım.

Bu esnada;
for item in liste döngüsü içinde ;
 liste.remove(item) işlemi yaparken, her seferinde listedeki item sayısı değiştiği için kodun sağlıklı işlemediğini öğrendim.

Bunu çözmek için ya iki ayrı liste kullanmak
ya da for item in list(liste) yapısını tercih etmek gerekiyormuş.

Kod aşağıdaki gibi,
bir birini yemeyecek şekilde Random Kale yerleşimleri üretiyor.







# Birbirini Yemeyen Kaleler
# twitter.com/MuratTatar


from random import choice

harfler=["a","b","c","d","e","f","g","h"]
x=8

tahta=[]
ar=[]
for i in harfler:
        for j in range(1,x+1):
                ar = [i,j]
                tahta.append(ar)


kaleler=[]
for k in range(1,x+1):
        r = choice(tahta); kaleler.append(r)
        print "random yerlesim:", r

        bas=r[0]; son=r[1]

        for t in list(tahta):
                if t[0]==bas: print "yatay elenen kesisim karesi",t; tahta.remove(t)
                if t[1]==son:
                        print "dikey elenen kesisim karesi",t
                        try: tahta.remove(t)
                        except: pass


print "\n\n Birbirini Yemeyen Kale yerlesimleri:\n", kaleler, "\n\n"


Cuma, Ağustos 04, 2017

Python OpenCV2 ile Yüz tanıma

Tanışma faslı..
Antreman faslı..
Tanıma faslı..

Klasör ve Dosya yapımız şöyle:




https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml
buradaki xml dosyasını alıp
yuz.xml olarak kayıt edelim




KutuphaneOlustur.py içeriğimiz:
===================================

import numpy as np
import cv2
import time
import win32gui

detector = cv2.CascadeClassifier('yuz.xml')

cam = cv2.VideoCapture(0)


ks = open("kisiler.txt","r"); kisiler = ks.read(); ks.close()
kisiler = kisiler.split('\n')
sonno = len(kisiler); kayitno = sonno + 1

isimler=[]
for kisi in kisiler:
    no, isim = kisi.split(':')
    isimler.append(isim)
 


def KontrolKayit(yeniad):
    if not yeniad in isimler:
        ky = open("kisiler.txt","a"); ky.write(str("\n"+str(kayitno)+":"+str(yeniad))); ky.close()
     
    else:
        yeniad = raw_input(u'Bu isimde birini tanıyorum. \n Karışmaması için Soyisim vb. alabilir miyim: ')
        KontrolKayit(yeniad)


#+++++++++++++++++++++++++++++++++++++++++++++++++++
     
yeniad = raw_input(u'Tanışalım isminiz nedir?: ')
     
KontrolKayit(yeniad)



Id=kayitno

time.sleep(1)

sampleNum = 0
while 1:
    ret, img = cam.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = detector.detectMultiScale(gray, 1.3, 5)
 

    for (x,y,w,h) in faces:
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)


        time.sleep(.5)
        #kisinin cok sayida resmini kayit
        sampleNum = sampleNum+1
        cv2.imwrite("dataSet/User."+str(Id) +'.'+ str(sampleNum) + ".jpg", gray[y:y+h,x:x+w])

     
        cv2.imshow('KutuphaneKayit',cv2.flip(img,1))





 
    #wait for 100 miliseconds
    if cv2.waitKey(10) & 0xFF == ord('q'):
        break
    # break if the sample number is morethan 20
    elif sampleNum>20:
        break




cam.release()
cv2.destroyAllWindows()

import Antreman

============================

Antreman.py içeriğimiz:

======================
import os
import cv2
import numpy as np
from PIL import Image

#creating a recognizer

recognizer = cv2.face.createLBPHFaceRecognizer()
path = 'dataSet'

def getImagesWithID(path):
    imagePaths=[os.path.join(path, f) for f in os.listdir(path)]  
    faces=[]
    IDs=[]
    for imagePath in imagePaths:
        faceImg = Image.open(imagePath).convert('L')
        faceNp = np.array(faceImg, 'uint8')
        ID=int(os.path.split(imagePath)[-1].split('.')[1])
        print ID
        faces.append(faceNp)
        IDs.append(ID)
        cv2.imshow('training', faceNp)
        cv2.waitKey(5)
    return np.array(IDs), faces

Ids, faces = getImagesWithID(path)
recognizer.train(faces, Ids)

if not os.path.exists('trainer'):
    os.makedirs('trainer')

recognizer.save('trainer/training_data.yml')
cv2.destroyAllWindows()


============================

_ismenKisiTani.py içeriğimiz:

======================

import cv2
import numpy as np
import time

recognizer = cv2.face.createLBPHFaceRecognizer()
recognizer.load('trainer/training_data.yml')
cascadePath = "yuz.xml"
faceCascade = cv2.CascadeClassifier(cascadePath)

cam = cv2.VideoCapture(0)
#font = cv2.FONT_HERSHEY_SCRIPT_SIMPLEX
font = cv2.FONT_HERSHEY_DUPLEX

ks = open("kisiler.txt","r"); kisiler = ks.read(); ks.close()
kisiler = kisiler.split('\n')
sonno = len(kisiler)


isimler=[]
for kisi in kisiler:
    no, isim = kisi.split(':')
    isimler.append(isim)


while True:
    ret, im =cam.read()
    im = cv2.flip(im,1)
    gray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
    faces=faceCascade.detectMultiScale(gray, 1.2,5)
    for(x,y,w,h) in faces:
        cv2.rectangle(im,(x,y),(x+w,y+h),(225,0,0),2)
        Id, conf = recognizer.predict(gray[y:y+h,x:x+w])

        Id =  isimler[Id-1]

        if(conf<45 div="">
          Id="-cikaramadim-"

            
        cv2.putText(im,str(Id),(x,y-10),font,0.55,(0,255,0),1)
        #cv2.cv.PutText(cv2.cv.fromarray(im),str(Id), (x,y+h),font, 255)



    cv2.imshow('im',im)
    
    k = cv2.waitKey(30) & 0xff
    if (cv2.waitKey(30) & 0xFF==ord('q')) or (k == 27) :
        break


cam.release()
cv2.destroyAllWindows()

============================

Çarşamba, Ağustos 02, 2017

Win7

Windows 7, açık ara windows 8 ve windows 10'dan daha güzel.

Pazartesi, Temmuz 31, 2017

Python + Selenium ile Telefon numarasi yakalamaca

Webde tonlarca örnek bulmak mümkün belki ama insanın denediği şey "Türkiye Şartları"na (haha) uymayınca biraz motivasyonu düşüyor.

Şimdi DevNami'nin şurada anlattığı örneği, yerelleştirelim.


Öncelikle web sayfasından veri alıp işlemek için selenium modülünü kuralım:
Bunun için
Başlat>çalıştır> cmd.exe
ile açılan dos/komut penceresinde
pip install selenium
yazıp enterlamak yeterli olacaktır.

Web tarayıcı olarak Chrome kullanmak için 
https://sites.google.com/a/chromium.org/chromedriver/downloads 
adresinden chromedriver.exe indirelim.

Not defteri, SublimeText ya da Python IDE editörlerinden birisini açıp aşağıdaki kodları Sel-Telefon.py adıyla kayıt edelim.

(Az önce indirdiğimiz chromedriver.exe dosyası da Sel-Telefon.py ile aynı klasörde olsun.)

from selenium import webdriver as web
import re

url = "https://www.turhost.com/"

d = web.Chrome("chromedriver.exe")
d.get(url)
doc = d.page_source

telefonlar = re.findall(r'[(\s][\d]{3,4}[\s)-]+[\d]{1,4}[\s-]+[\d]{1,4}[\s-]+[\d]{2,4}',doc)

for tel in telefonlar:
    print tel
    
d.quit()


Burada;
from selenium import webdriver as web

Selenium modülü içinden webdriver'ı içeri aktardık. Ve buna arkadaşlar arasında kısaca web diyeceğiz dedik. Adı ibrahim ama biz ibo diye sesleneceğiz ;)

Burada;
import re
Regular Expression / Düzenli İfade modülü import ettik. Düzenli ifadeler biraz karmaşık gibi durabilir ama mantığı yerleşince hayli zaman kazandıracak işler de yapabilir.

Burada;
url = "https://www.turhost.com/"
Telefounu almak istediğimiz bir adres girdik

Burada;
d = web.Chrome("chromedriver.exe")
d.get(url)
doc = d.page_source

d isimli değişkenimizi adeta Chrome yaptık.
çocuğum d, şu adresi getir,
doc senin içeriğin ise, d'nin getirdiği adresin kaynak kodları olsun dedik.


Burada;
telefonlar = re.findall(r'[(\s][\d]{3,4}[\s)-]+[\d]{1,4}[\s-]+[\d]{1,4}[\s-]+[\d]{2,4}',doc)

for tel in telefonlar:
    print tel

telefonlar değişkenine, re ile sayfada yakaladıklarımızı atadık.
sonra her atanan telefonu tek tek listelemek için bir döngüye soktuk.

Türkiye'de telefon yazım şekli genelde (0212) 555 44 33 şeklinde yani;
[Parantez]+[4 Rakam]+[Parantez]+[boşluk]+[3 Rakam]+[boşluk]+[2 Rakam]+[boşluk]+[2 Rakam]
formatında. Bunu ReGex olarak yazarsak şöyle:
[(]+[\d]{4}+[)]+[\s]+[\d]{3}+[\s]+[\d]{2}+[\s]+[\d]{2}


 Ancak (0212) 555-44-33 şeklinde boşluk yerine Tire işareti kullanımı da olabiliyor
O zaman formatımız şu hale geliyor
[Parantez]+[4 Rakam]+[Parantez]+[boşluk ya da tire]+[3 Rakam]+[boşluk ya da tire]+[2 Rakam]+[boşluk ya da tire]+[2 Rakam]


O halde bizde [\s] yerine [\s-] yazıyoruz.

Ama bir de kurala uyamayanlar, parantez koymayan 0212 yerine 212 yazanlar var.
Ya da numara daha güzel görünmesi için 899 1 899 şeklinde yazanlar.
Bu durumda minimum ve maximum digit/rakam adeti için formatımızı düzenleyelim:
[(]+[\d]{3,4}+[)]+[\s]+[\d]{1,4}+[\s]+[\d]{1,4}+[\s]+[\d]{2,4} 

Burada da;
d.quit()
d'yi yani bir nevi chormu kapatıyoruz. (30 tane chrome açıksa makina üzülür malum, üzülmesin) 


Başka sayfalarda da denemek için url kısmını https://tr.godaddy.com/ ve https://www.natro.com/ ile değiştirince de çalışıyor. Tabi burada düşünemediğiz yazım şekillerini yakalamayacaktır.
onlar için format düzenlemesi yada telefonlar2 gibi yeni bir değişken ataması yapılabilir.

##  Bu paylaşımlardaki amacım, Python dersi vermek değil. Çünkü ben de yeni öğreniyorum.
##  Birlikte öğrenelim ;)

Uzuun Ara

Çook uzun bir aradır yazmıyordum.
Ve yazacak çook şey oldu.

Bi' şekilde Python'a bulaştım. Sanırım, Birlikte öğrenmek ve öğrendiğim bazı şeyleri paylaşmak için yeniden yazmak geldi içimden.
Belki arada geçen bazı şeyleri de yazarım ara ara.. belki ama.

Şimdi biraz Python'layalım ;)