27 Mart 2009 Cuma

Opencv Modülü İle Kamera Görüntüsü Alma

Bu yazımızda python, opencv modülü ve qt ile kamera görüntüsü alıp göstereceğiz, hatta resim de çekeceğiz.


# -*- coding: utf-8 -*-

from PyQt4 import QtGui, QtCore

import Image
import ImageQt
import opencv
from opencv import highgui

# kamera yakalayıcı...
camera = highgui.cvCreateCameraCapture(0)

# kamera işlemimiz sürekli olarak ekrana görüntüyü basıyor...
class camThread(QtCore.QThread):
def run(self):
while True:
# görüntüleri basarken her aralıkda 60ms bekliyoruz, buda 60fps demek...
# eğer sizde görüntü yavaş olursa yani fps yi düşürün...
self.msleep(60)
# görüntüyü alıyoruz...
self.image = highgui.cvQueryFrame(camera)

# resim sinyalini yayıyoruz ve gidecek fonksiyona self.image değişkenini,
# gönderiyoruz...
self.emit(QtCore.SIGNAL("image"), (self.image))

class camoruxWindow(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)

self.resize(650, 450)

self.camThread = camThread()

self.showLabel = QtGui.QLabel(self)
self.showLabel.resize(640, 480)

# camThread den gelen sinyali alıyoruz ve self.showImage ye bağlıyoruz...
self.connect(self.camThread, QtCore.SIGNAL("image"), self.showImage)
self.camThread.start()

self.button = QtGui.QPushButton(self)
self.button.setText(u"Resim çek")
self.connect(self.button, QtCore.SIGNAL("clicked(bool)"), self.cek)

def cek(self):
# flash
self.flash = QtGui.QWidget()
self.flash.setStyleSheet("background-color: rgb(255, 255, 255);")
self.flash.showFullScreen()

# resim çekiliyor...
i = highgui.cvQueryFrame(camera)
opencv.adaptors.Ipl2PIL(i).save("deneme.png")

# flash kapanıyor
self.flash.close()

def showImage(self, image):
# burada: gelen resmi ImageQt ile QLabel in istediği şekile dönüştürüyoruz...
self.image = ImageQt.ImageQt(opencv.adaptors.Ipl2PIL(image).transpose(Image.FLIP_LEFT_RIGHT))
# ve gösteriyoruz...
self.showLabel.setPixmap(QtGui.QPixmap.fromImage(self.image))

app = QtGui.QApplication([])
mw = camoruxWindow()
mw.show()
app.exec_()

Dikkat etmeniz gereken nokta şu:
camThread görüntüyü gösterirken 60ms bekliyor yani 60fps ile görüntü gösteriliyor, sizde eğer görüntü yavaş olursa fps yi düşürmeniz gerekiyor demektir. 30-40 fps arası deneyin…

11 yorum:

  1. Bu yorum yazar tarafından silindi.

    YanıtlaSil
  2. ben de python öğrenmek istiyorum yavvv

    YanıtlaSil
    Yanıtlar
    1. 4 sene oldu neredeyse. Öğrendin mi bari?

      Sil
    2. baba 2017 oldu ölmeden öğren şunu artık...

      Sil
  3. Kodlarin arasina OpenCV ile "yuz algilama" ekledigim zaman gozle gorulur bir bicimde (neredeyse yari yariya) performans dusuyor. Goruntuyu Qt-OpenGL kullanarak ekrana getirmenin yollarini ariyorum. Sanirim en hizlisi boyle olacaktir. Baska fikri olan var mi?

    YanıtlaSil
  4. Sanmam, opengl sadece ekrana yansıtılma kısmında hız katar ki kodun yavaşlığının sebebi yüz tanımlama algoritmasının kendisi. Yapılabilecek bir şey yok gibi duruyor.

    Ayrıca bende garip bir şekilde kare sayısı düşük oluyor ışığın azlık-çokluğuna göre. Sürücüler offical olmadığı için (ve ortada offical bir webcam sürücüsü olmadığı için :/) oluyor olabilir diye düşünüyorum.

    YanıtlaSil
  5. Öncelikle anlatım için teşekkür etmek isterim.
    Ancak Bir hatayla karşı karşıyayım.Şöyle ki:
    Kodları aynen kopyla yapıştır yapmama rağmen çalışmadı pardus ta ilgili kütüphanelerim kurulu aldığım hata ise şöyle

    File "camera.py", line 19
    self.msleep(60)
    IndentationError: expected an idented bloack

    cevabınız için şimdiden teşekkür ederim.

    YanıtlaSil
  6. IndentationError: expected an indented block, hata mesajının anlamı girinti beklenen bir yerde gerekli girintinin verilmemiş olmasıdır. Sevgili Mirat konuyla ilgilenecektir.

    YanıtlaSil
  7. "her aralıkda 60ms bekliyoruz, buda 60fps demek"

    Bu 1000/60'tan 16.7 fps demektir. Kodlayıcının bilgisine...

    YanıtlaSil
  8. Sayın Aydın Şen
    Öncelikle cevabınız için teşekkür ederim.
    sorun o kadar basitmişki.2 sn ye sürmedi halletmem.
    Bu basit hatanın nedeni ise konuyu incelediğim gece bi hayli yorgun ve kafamın bi o kadarda karışık olmasıymış.

    tekrar teşşekkür ederim

    saygılarımla

    Can TORUN

    YanıtlaSil
  9. bu kodlada python ımage ve Imageqt felan görnüyor bunun icin anaconda yı kuruyorum ve derleyeici onu gösteiriyorum ama ne yazık ki aynı bana yardım edebilk var mı

    YanıtlaSil