Ekrandaki Görüntüyü Algılama

Merhaba arkadaşlar etabsten otmatik ekran görüntüsü alan bir uygulama geliştirmek istiyorum otomasyon şeklinde şuana kadar ekran görüntüsünü alan iş görebilecek bir uygulama geliştirdim ama uygulamaya şuan bir güncelleme getirmek istiyorum. Burada tıkandım ve sizin yardımınıza ihtiyacım var.

Amacım temel olarak buradaki pembe kısmın agılayıp sarı kalemle belirtilen yere tıklayan ve o algıladığı kısmı sürükleyerek seçen bir sistem. Bu işlemin amacı o pembe kısmın etrafından birazcık boşluk bırakarak yaklaştırmasını istiyorum. OpenCV ve YOLO ile karşılaştım ama nasuk yapacağımı bilmiyorum yardım ederseniz sevinirim.

Merhaba;

Konuya başlık yönünden mi bakmak gerekir yoksa yazılım yönünden mi emin olamadım.

Ekrandaki görüntüyü algılama yönünden bakarsak;

Ekran yakalamak dışında farklı istekleriniz var.

Pembe kısmı algılamak için, bir kaç yöntem var ama sizin Etaps içerisindeki bir butona tıklanmasını istemeniz ve ve daha sonra da çizimi seçmek için mouse ile iki koordinat arasındaki sürükleme ihtiyacınız için ikinci bir eylem gerekiyor.

Birinci aşamada, görüntü işleme ikinci aşamada pyautogui benzeri bir modül ile tıklama eylemlerini gerçekleştirmek gerekiyor.

Sorun şurada, burada bir çok kişinin inşaat mühendisi olmadığı ve çelik konstrüksiyon yada statik hesaplarla uğraşmadığında ETAPS kullanmama ihtimali yüksek.

Bu nedenle tam olarak ne yaptığınızı bilemiyoruz. Autocad’deki zoom extend gibi bir komuta karşılık geliyor gibi yaptığınız ama emin değilim çünkü Etaps kullanmadım hiç.

Eğer böyle bir eylem ise python kodu denemeden önce, kullandığınız yazılımın macro ve otomasyon için api kütüphaneleri var mı bilmekte fayda vardı.

Yani, eğer gördüğüm kadarıyla VBA ile otomasyon ihtimali varsa şu an ilerlemeye çalıştığınız yol zor yol.

Tam olarak, ekrandaki butonun eylemini karşılayan bir VBA makrosu varsa ve selection için koordinat yerine mevcut çizimi zoom yapacak bir alt yordam varsa bir kaç satırlık Visual Basic For Applicantions (VBA) kodu yazarak yapmak daha kolay olabilir.

Şöyle bir internet araştırmasında;

C:\Program Files\Computers and Structures\ETABS 19\CSA API ETABS v1.chm

Gibi size göre değişebilecek bir konumda bu konuda apileri bulabileceğiniz bir yardım dosyası olabilir ve bunu araştırırsanız belki faydası olur.

İlginçtir ki çok dökümantasyon ve kaynak yok ETAPS konusunda.

Yani örnek bulmakta zorlanabilirsiniz ama VBA kullanmayı biliyorsanız çabuk çözeceğinizi tahmin ediyorum.

İkinci ve zor yola gelirsek;

Bu konuda örnek bir kod yazabiliriz evet;

Mantık olarak görüntü çerçevelenir ve bir tolerans dahilinde görüntünün dışında çerçevelemek mümkün.

Bunu yaptığınızda dört koordinatınız olacaktır.

Sürükle bırak seçme için sol üst köşe koordinatları ile sağ alt köşe koordinatlarını pyautogui gibi bir modüle parametre olarka verisek seçecektir diye tahmin ediyorum.

Teorisi bu ama pratiğini kodlayarak aksaklıkları görmek gerekebilir.

Eğer böyle bir kodunuz varsa başlangıç noktamızın bu olması için kodu da paylaşmanız gerekebilir.

Yoksa sıfırdan yeni bir yöntemle kodlamamız gerekecektir.

Evet opencv kullanarak görütnü tespiti yapabilirsiniz yolo gerektirecek kadar hassas mı bilemiyorum. Elinizde butonun resmi olacağından pyimagesearch ile de butonu bulma ihtimaliniz yüksek. Bir renk parametresi ile yada kenar yakalama yaklaşımıyla çiziminizin kenarlarını bulmak mümkün.

Örnek kodlar denenebilir.

Ama öncelik sizin baz alacağımız örnek kodunuz ve ETAPS ın macro yada benzeri bir kodlama arayüzü olup olmadığı.

Yani python kullanmanız da gerekmiyor olabilir.

Autodesk yazılmlarına aşinayım, VBA, ObjectArx, Autolisp gibi seçeneklerle kendi içinde otomasyon sağlayabiliyor ama ETAPS bu gibi seçenekler sunuyor mu ne seviyede yapıyor sizin araştırmanızda fayda var.

Biraz daha bilgi verirseniz daha sağlıklı kod örnekleri üzerinde konuşabiliriz.

Merhabalar,

OpenCV ile su islemler yapilabilir:

  1. inRange
    Pembeyi bulmak icin, bir nevi thresholding.

  2. erosion + dilation
    Ayni kerneli kullanirsaniz buna “opening” deniyor. Erosion, deniz seviyesini yukseltmek suretiyle kucuk adalari haritadan eliyor. Dilation bunun tam tersini yapip kalan adalari geri buyutuyor. Sonucta geriye sadece kernelden buyuk adalar kaliyor, hafifce yontulmus olarak.

  3. Blob / bounding rectangle bulma
    Basitce boundingRect ile yapilabilir.

Sonuc soyle bir sey:

2 Beğeni

Ben bu yapmaya çalıştığım uygulamayı hali hazırda olan bir inşaat mühendisi grubu için yapıyorum kullanan grup zaten inşaat mühendisi olucak ama belirtmemiştim size.

Evet bende yanlış anlamadıysam aynı amaç sürükle bırak yaptığımız yere maksimum yaklaşabileceği kadar yaklaşıyor direk.

Bir araştırmamda fayda var vba kullanmayı bilmiyorum ama eğer varsa makrosu ihtiyacım olduğu kadarıyla projeye entegre etmeye çalışırım

Bende baktım ama dediğiniz gibi maalesef kaynak yok denecek kadar az.

Benimde teoride yapmak istediğim şey bu ama çerçeleve kısmında takıldım

import sys
import time
import pyautogui
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox

import InputluWindow as ıw


class Check(QtWidgets.QMainWindow):
    def __init__(self):
        super(Check, self).__init__() 
        self.ui = ıw.Ui_MainWindow()
        self.ui.setupUi(self)

        self.ui.baslat_ss_pushButton.clicked.connect(self.ss_Al)

    def ss_Al(self):

        pyautogui.moveTo(120,540)
    #    # time.sleep(3)
        sayac = 1
        a = 466

        self.katsayisi = int(self.ui.katsayisi_lnEdit.text())
        print(self.katsayisi)
        while self.katsayisi >= 1 :
            self.katsayisi-= 1
            print(self.katsayisi) 
            # ad = "kotlu_alıntı" + str(sayac) + ".png"
            ad = "alıntı" + str(sayac) + ".png"

            pyautogui.moveTo(105,180)
            pyautogui.click(button='left', clicks=1, interval=0.01)
            pyautogui.moveTo(270,60)
            time.sleep(0.5)
            pyautogui.screenshot(ad, region=(30,140,925,830)) #KOTSUZ
            # pyautogui.screenshot(ad, region=(30,110,925,830)) #KOTLU
            pyautogui.click(button='left', clicks=1, interval=0.01)
            pyautogui.moveTo(580,60)
            time.sleep(0.5)
            pyautogui.click(button='left', clicks=1, interval=0.01)                        
            time.sleep(0.5)

            sayac += 1
            a += 13

        pyautogui.alert(text='Ekran görüntüleriniz hazırlandı.', title='Baslik', button="Tamam")

def app():
    app = QtWidgets.QApplication(sys.argv)
    window = Check()
    window.show()
    sys.exit(app.exec_())

app()

Kendi kendime uğraşarak böyle bir şey yapabildim. Basit olarak mantığı etabs de tuşların koordinatlarını tespit ettim sonra pyautogui kullanarak bu tuşlara tıklattım sonra bir döngüye aldığım zaman basitçe istenilen şeyi yapabildim birde pyqt5 ile basit bir pencere yaptım. Çok profesyonel bir şey değil ama benden istedikleri şeye basitçe ulaşıyorum.

Pencerenin kodlarıda lazım olur mu bilemedim ama ben her halikarda ekleyeceğim kullanırsınız belki.

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):

    def setupUi(self, MainWindow):

        MainWindow.setObjectName("MainWindow")

        MainWindow.resize(270, 200)

        self.centralwidget = QtWidgets.QWidget(MainWindow)

        self.centralwidget.setObjectName("centralwidget")

        self.baslat_lbl = QtWidgets.QLabel(self.centralwidget)

        self.baslat_lbl.setGeometry(QtCore.QRect(40, 70, 191, 20))

        self.baslat_lbl.setObjectName("baslat_lbl")

        self.baslat_ss_pushButton = QtWidgets.QPushButton(self.centralwidget)

        self.baslat_ss_pushButton.setGeometry(QtCore.QRect(90, 100, 75, 23))

        self.baslat_ss_pushButton.setObjectName("baslat_ss_pushButton")

        self.katsayisi_lbl = QtWidgets.QLabel(self.centralwidget)

        self.katsayisi_lbl.setGeometry(QtCore.QRect(40, 40, 101, 16))

        self.katsayisi_lbl.setObjectName("katsayisi_lbl")

        self.katsayisi_lnEdit = QtWidgets.QLineEdit(self.centralwidget)

        self.katsayisi_lnEdit.setGeometry(QtCore.QRect(120, 40, 113, 20))

        self.katsayisi_lnEdit.setObjectName("katsayisi_lnEdit")

        MainWindow.setCentralWidget(self.centralwidget)

        self.menubar = QtWidgets.QMenuBar(MainWindow)

        self.menubar.setGeometry(QtCore.QRect(0, 0, 458, 21))

        self.menubar.setObjectName("menubar")

        MainWindow.setMenuBar(self.menubar)

        self.statusbar = QtWidgets.QStatusBar(MainWindow)

        self.statusbar.setObjectName("statusbar")

        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)

        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):

        _translate = QtCore.QCoreApplication.translate

        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))

        self.baslat_lbl.setText(_translate("MainWindow", "Ekran görüntüsü için \"Başlat\'a\" basınız."))

        self.baslat_ss_pushButton.setText(_translate("MainWindow", "Başlat"))

        self.katsayisi_lbl.setText(_translate("MainWindow", "Kat sayısı giriniz:"))

if __name__ == "__main__":

    import sys

    app = QtWidgets.QApplication(sys.argv)

    MainWindow = QtWidgets.QMainWindow()

    ui = Ui_MainWindow()

    ui.setupUi(MainWindow)

    MainWindow.show()

    sys.exit(app.exec_())

Yolo bilmiyorum kullanmaıdm ama internette araştırmama göre baya kapsamlı ve detaylı resimler için o kadar detaylı bir duruma ihtiyacım olduğunu sanmıyorum.

Eğer sizi doğru anladıysam araştırmamda çıkan temel sorun burada çıkıyor ben bir resimden değil hali hazırda etabs çalışırken algılamasını istiyorum.

Yukarıda paylaştığım kodlardan sonra amacımı tekrardan yazarsam belki daha anlaşılır olur.

Şuan zaten ekran görüntüsü alabilen çok kapsamlı olmayan ama iş gören bir uygulama geliştirdim. Yapmak istediğim şey şu etabsden bu uygulama ekran görüntüsü almadan önce o sarı işaretlediğim yere tıklayıp görüntünün bir ucundan diğer ucuna sürükle bırak eylemi yapmasını istiyorum. Sebebi de şu görüntü uzakta kaldığı için çizime yaklaşması gerekiyor bildiğim en ideal çizimi kaybetmeden yaklaştırmanın yolu da bu.

Bende ihtiyacım olan tipte bir macro veya benzeri tipte bir şey var mı onu araştıracağım.

Umarım şimdi verdiğim bilgiler yeterli olmuştur zaman ayırdığınız için teşekkür ederim biraz geç cevap verdim kusura bakmayın perşembe günleri ofiste olabiliyorum sadece.

Evet gayet yeterli oldu bilgiler.

Pyautoqui kullandığınızı biliyoruz. Artık zoom yapmak için iki koordinat arasında bir nevi sürükle bırak yaptıracağız. Yani button pressed event’i ile ikinci koordina kadar bekleyik button release event’i bekleyeceğiz.

python - How to simulate a mouse click and drag? - Stack Overflow

Bura dragTo kullanmak uygun görünüyor.

Peki bu koordinatları nasıl alacağız? Bunun için görseli işlemek ve çerçevelemek gerekecek.

Görüntü işlemek için en basitinden opencv kullanmanız gerekebilir. Open cv ile nesnenin/ çevresini yakalar ve bu koordinatları ne kadar dışından sürükle bırak yapmak isterseniz o kadar dışından koordinat verisi üretebilirsiniz.

Size bir örnek bırakırım. Vakit bulursam.

1 Beğeni

Pyautogui ve opencv ile etabs üzerinde tıklatacağınız düğmenin resmini alıp, ekran görüntüsü alıp karşılaştırma yaptırarak bulmanız , koordinat vermekten daha doğru olacaktır. Koordinat verdiğinizde pencerenin konumu değiştiğinde doğru yere tıklayamaz. Ekran görüntüsü almak kolay fakat siz sadece pembe kısmın mı görüntüsünü almak istiyorsunuz ? Ben de inşaat mühendisiyim . Kullanacak arkadaşlara ne için kullanacaklarını sorarsanız daha hedefe doğru yardımcı olabilirim. Ayrıca resme tıklatma kafanıza yattıysa buradan kod paylaşabilirim.

İyi günler.
Mehmet Can Çalışkan

Evet sadece o kısmın ekran görüntüsü lazım.

Hazırladıkları raporda kullanmak için dediler bana.

Resim olarak değil de etabs penceresinde sürükle bırak yapmam gerekiyor.

Projeden projeye çizimin yerleri değişebiliyor bundan yana bir sıkıntı olmaz değil mi. Hiçbir koordinant birbirini tutmayacak çünkü.

Birde bu çerçeve yakalama ve dışarıdan koordinant verme olayını nasıl yapabilicem kaynak öneriniz var mıdır.

Evet. Open cv ile görüntü yakalamak ve koordinatlarını tespit etmek mümkün. Zaten burada amaç farklı koordinatlardaki nesnelerin koordinatlarını almak.

İlk önerim öncelikle opencv kurmanız.

Sonra, Detect an object with OpenCV-Python - GeeksforGeeks
gibi basit örneklerle nesneler nasıl tespit etmeye göz atmak.

Sizin durumda iş biraz daha kolay. Çünkü bir renk belirttiniz renkli bir alanı yakalamak daha da kolay.

OpenCV and Python Color Detection - PyImageSearch

Gibi örneklerle istediğiniz renkteki alanı tespit edebilirsiniz. Söylediğim gibi fırsat bulursam size bu konuda örnek kodlar da yazarım.

Anlamak istediğim tek şey programda hangi kütüphaneleri kullandığınız, hangilerini kullanabilir durumda olduğunuz ve aslında bir tasarımprogramında sürükle bırak ile bir alana zoom yapmak istediğinizi öğrenmekti.

Bu gayet yapılabilir bir iş. Siz deneyin takıldığınız yerlere bakarız.

Kolay gelsin.

Belli projelerde birden fazla renkte olabiliyor ama biraz araştırma yapayım ben o konuda.

Yardımlarınız için çok teşekkür ederim ben takıldığım bir kısım olursa tekrardan yazarım buraya.

Yapmak istediğiniz şey ETABS ın içinde sanırım . Tam anlamadım ama sadece seçtirtip zoom yapmak istiyorsanız. Yani dışardan görüntü alıp kullanmayacaksanız .

import win32com.client
etabs_object = win32com.client.Dispatch(“CSI.ETABS.API.ETABSObject”)

win32com ile etabs a komut gönderilebilir. Dışarıdan müdahale daha zor sanki .

Bu daha mantıklı. Bunu yolu önermiştim. Ama sanırım dokümantasyon ve bir kaç farklı faktörden dolayı ilk tercih olmadı.

Hatta bu bence de en kolay yol. ETAPS kullanıyor olsaydım yada kuracak olsaydım bu işi içinde kolayca çözebilecek tümleşik bir makro programlayıcısı olacağını ve komutların gönderilebileceğini düşünüyorum.

Tek sorun, iyi bir dokümantasyon görmedim.

İçinde tümleşik bir vba outomation var gibi görünüyor. api - How to Link a VBA code with opened ETABS OAPI? - Stack Overflow

Her türlü yapılır, lakin gönderilecek komutun referans dokümanlarını da bulmak gerekiyor.

Tekrar edeyim. Yerleşik bir metod varsa harici metod gereksiz bence de lakin zor değil. Yapılacak şey programın ekran görüntüsünü işleyip ki bu işlemek zaten hazır kütüphaneler tarafından hızlıca hallediliyor. işlediğiniz görüntüde bir kontrast ayarı ile beyaz alanları siyah diğer renkleri de beyaz yaparak kolayca bir alan tespiti mantığına dayanıyor. Yani kütüphaneler o kadar gelişkin ki 3-5 satır kodla bunu yapabiliyorsunuz.

Diğer kısmı mouse’u koordinatlarda hareket ettimek ki bu da pyautoqui ile çok basit.

Gözde büyütülecek bir durum değil.

1 Beğeni

Bende ilk başta çeşitli kütüphanelerle dediğiniz gibi yapmaya çalıştım hatta comtypes kütüphanesi ile direk müdahale edilebiliyor etabse diye baktım ama ne dökümantasyon ne de başka bir şey bulamaıdm ondan dolayı pyautogui ile yapmaya başladım.

Dediğiniz gibi opencv ile yapmaya çalışacağım hazır metodlar konusunda dökümantasyon bulamadım.