Python mit Opencv zur App-icons Erkennung

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Mus Sli
User
Beiträge: 1
Registriert: Donnerstag 14. April 2016, 15:20

Hallo Leute,

ich habe vor paar Monaten angefangen mich mit Python-Opencv zu beschäftigen.
Ich erkläre es was mein Problem ist.
Meine Aufgabe ist mittels Python und Opencv mit einer Webcam zu Kombinieren. Das heißt mein Kamera soll apps erkennen, die auf dem Homescreen meines Handys erkennen und die Koordinaten davon zurückgeben.
Ich habe mich bssl schlau :wink: gemacht und habe ich etwas was mit Template-Matching zu tun hat, gefunden. Leider dieses Verfahren war nur erfolgreich wenn ich ein Image in einem anderen Image suche. Jetzt will ich dieses Verfahren während einen Live-Streaming implementieren.
ich hoffe ich konnte bssl erklären was mein Problem ist . :oops: :K
ich werde mich auf ihre vorschlage freuen

vielen dank im voraus
Mus
hier ist das Beispiel zu Template-Matching ( Image in Image)
ich weiss das man etwas cv2.VideoCapture(0) machen muss aber mehr weiss ich leider nicht wie es weitergehen soll :K
ich hoffe ihr werdet mir helfen :?:

Code: Alles auswählen

import numpy as np
import argparse
import imutils
import cv2

ap = argparse.ArgumentParser()
ap.add_argument("-p","--Originale",required = True, help = "Path to Original image")
ap.add_argument("-w","--Template",required = True, help = "Path to Template image")
args = vars(ap.parse_args())

Original = cv2.imread(args["Originale"])
Template= cv2.imread(args["Template"])

(TemplateHeight , TemplateWidth) = Template.shape[:2]

result = cv2.matchTemplate(Original, Template, cv2.TM_CCOEFF)
(_,_, minLoc, maxLoc) = cv2.minMaxLoc(result)

topLeft = maxLoc
botRight = (topLeft[0] + TemplateWidth, topLeft[1] + TemplateHeight)
roi=Original[topLeft[1]:botRight[1], topLeft[0]:botRight[0]]

mask = np.zeros(Original.shape, dtype = "uint8")
Original = cv2.addWeighted(Original, 0.25, mask, 0.75,0)

Original[topLeft[1]:botRight[1], topLeft[0]:botRight[0]]=roi

cv2.imshow("original"  , imutils.resize(Original, height = 650 ))
cv2.imshow("template" , Template)
cv2.waitKey(0)
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na, im Raspberry PI Forum nicht weiter gekommen? Wie ich dir auch schon da gesagt habe - es gibt genug Code in der OpenCV-Dokumentation, der zeigt, wie man Bilder von der Kamera bekommt. Ich habe den sogar verlinkt.

Und danach ist das genau das gleiche Problem ein Template zu finden - ein Frame von einer Kamera ist nichts anderes als ein Bild.
BlackJack

@Mus Sli: Ein paar Anmerkungen zum Quelltext:

Auf Modulebene gehören nur Definitionen von Konstanten, Funktionen, und Klassen. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Spätestens wenn das Programm so komplex wird, dass es Sinn macht es in Funktionen aufzuteilen, und das ist im Grunde schon erreicht, ist es unsauber und fehleranfällig Variablen auf Modulebene zu haben.

Bezüglich der Namensschreibweisen und Leerraum könntest mal einen Blick in den Style Guide for Python Code werfen.

Optionen die nicht optional sind, sind ein Widerspruch. Oder anders herum, wenn man den Wert zwingend angeben muss, dann sollte es keine Option sein, sondern ein Argument.

Optionsnamen mit Grossbuchstaben sind ungewöhnlich. Ich sehe auch den Zusammenhang zwischen der Kurzoption und dem langen Namen‽

Was soll der `vars()`-Aufruf? Diese Umwandlung macht keinen Sinn.

`maxLoc` wird nicht wirklich verwendet, man kann stattdessen gleich den richtigen Namen an diesen Wert binden.

Ich lande da ungefähr bei so etwas (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
import argparse
import cv2
import imutils
import numpy as np


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        'original', required=True, help='Path to original image'
    )
    parser.add_argument(
        'template', required=True, help='Path to template image'
    )
    args = parser.parse_args()

    original_image = cv2.imread(args.original)
    template_image = cv2.imread(args.template)

    _, _, _, top_left = cv2.minMaxLoc(
        cv2.matchTemplate(original_image, template_image, cv2.TM_CCOEFF)
    )

    template_height, template_width = template_image.shape[:2]
    bottom_right = (top_left[0] + template_width, top_left[1] + template_height)
    indices = (
        slice(top_left[1], bottom_right[1]),
        slice(top_left[0], bottom_right[0])
    )
    region_of_interest = original_image[indices]

    mask = np.zeros(original_image.shape, dtype=np.uint8)
    dimmed_image = cv2.addWeighted(original_image, 0.25, mask, 0.75, 0)
    dimmed_image[indices] = region_of_interest

    cv2.imshow('original', imutils.resize(dimmed_image, height=650 ))
    cv2.imshow('template', template_image)
    cv2.waitKey(0)
    

if __name__ == '__main__':
    main()
Antworten