Bild in einem anderen Bild suchen

keksdose132

Mitglied
Guten Morgen/Mittag/Abend,
ich möchte überprüfen ob sich ein Bild in einem andren Bild befindet und wenn ja, dessen Koordinaten im anderen Bild auslesen.
Also ob z.B. ein bestimmtes Icon auf dem Desktop vorhanden ist und wenn ja an welcher Stelle.

Dieser Ordner zum Beispiel:

12198

Ist er auf dem Desktop vorhanden?
An welcher Stelle befindet er sich?

keksdose132.
 

fhoffmann

Top Contributor
ich möchte überprüfen ob sich ein Bild in einem andren Bild befindet und wenn ja, dessen Koordinaten im anderen Bild auslesen.
Also ob z.B. ein bestimmtes Icon auf dem Desktop vorhanden ist und wenn ja an welcher Stelle.
Willst du wirklich untersuchen, ob sich ein Bild in einem anderen Bild befindet? Oder willst du nur überprüfen - wie es dein Beispiel suggeriert - , ob sich ein Icon (unter Windows) auf dem Desktop befindet (dazu könntest du beispielsweise einfach in C:\Users\Peter\Desktop\ nachgucken).
 
X

Xyz1

Gast
Wie ich ihn verstanden habe, will er ein (gleiches oder ähnliches) Bild in einem Bild suchen... und das ist kein leichter Tobak.
 

keksdose132

Mitglied
Willst du wirklich untersuchen, ob sich ein Bild in einem anderen Bild befindet? Oder willst du nur überprüfen - wie es dein Beispiel suggeriert - , ob sich ein Icon (unter Windows) auf dem Desktop befindet (dazu könntest du beispielsweise einfach in C:\Users\Peter\Desktop\ nachgucken).

Ich möchte wirklich nach Bildern bzw. Grafiken suchen und dessen Position ermitteln, um dann z.B. die Distanz zwischen diesen Objekten zu berechnen. Bzw. vielleicht gibt es ja sogar eine bessere Methode um die Distanzen zu berechen, ohne nach Grafiken zu suchen, nur kenne ich keine andere.

Also das ich beispielsweise diese eingezeichnete Distanz in Mario ermitteln kann:

12219
 
X

Xyz1

Gast
Bibs die das können sind hunderte an Megabyte groß, ich denke nicht dass Du in der Lage dazu wärst.
Außerdem wäre es vielmals einfacher das Spiel zu hacken :D
 

mihe7

Top Contributor
Hat da jemand eine Idee, wie man das ganze umsetzten könnte?
Zähl halt einfach von unten die blauen Pixel.

Java:
import java.awt.*;
import java.awt.geom.Line2D;
import java.awt.image.BufferedImage;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate;
import javax.imageio.ImageIO;
import javax.swing.*;

public class Test {
    private BufferedImage img;
    private Line2D line;

    private class ImagePanel extends JComponent {
        public Dimension getPreferredSize() { return new Dimension(img.getWidth(), img.getHeight()); }
        public void paintComponent(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;
            g2.drawImage(img, 0, 0, null);
            if (line != null) {
                g2.draw(line);
            }
        }
    }

    public Test(BufferedImage img) { this.img = img; }

    public void run() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        ImagePanel p = new ImagePanel();
        AtomicInteger x = new AtomicInteger();

        Timer t = new Timer(100, e -> {
            Timer tmr = (Timer) e.getSource();
            int cx = x.getAndIncrement();
            if (cx >= img.getWidth()) {
                tmr.stop();
                line = null;
                frame.dispose();
            } else {
                measure(new Point(cx, img.getHeight()));
            }
            p.repaint();
        });
        t.setRepeats(true);

        frame.add(p);
        frame.pack();
        frame.setResizable(false);
        frame.setVisible(true);
        t.start();
    }

    public void measure(Point p) {
        int y1 = find(p.x, img.getHeight(), equalColor(new Color(0x63, 0x86, 0xfb), 4));
        int y2 = find(p.x, y1, equalColor(new Color(0x63, 0x86, 0xfb), 4).negate());
        line = new Line2D.Float(p.x, y2, p.x, y1);
    }

    private int find(int x, int bottom, Predicate<Integer> p) {
        for (int y = bottom - 1; y >= 0; y--) {
            if (p.test(img.getRGB(x, y))) {
                return y;
            }
        }
        return -1;
    }

    private Predicate<Integer> equalColor(Color c, double tolerance) {
        return color -> {
            int redDiff = ((color & 0xff0000) >>> 16) - c.getRed();
            int greenDiff = ((color & 0xff00) >>> 8) - c.getGreen();
            int blueDiff = (color & 0xff) - c.getBlue();

            double err = Math.sqrt(redDiff*redDiff + blueDiff*blueDiff + greenDiff*greenDiff);
            return err <= tolerance;
        };
    }
   
    public static void main(String[] args) throws Exception {
        Test app = new Test(ImageIO.read(Test.class.getResource("mario.png")));
        SwingUtilities.invokeLater(() -> app.run());
    }
}
 

mihe7

Top Contributor
Tja, dann musst Du wohl Bilder vergleichen.
Java:
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.beans.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate;
import javax.imageio.ImageIO;
import javax.swing.*;

import java.util.ArrayList;
import java.util.List;

public class Test {
    private BufferedImage template;
    private BufferedImage img;
    private List<Point> positions = new ArrayList<>();

    private class ImagePanel extends JComponent {
        public Dimension getPreferredSize() { return new Dimension(img.getWidth(), img.getHeight()); }
        public void paintComponent(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;
            g2.drawImage(img, 0, 0, null);

            g2.setColor(Color.GREEN);
            g2.setStroke(new  BasicStroke(2));

            for (Point p : positions) {
                Rectangle2D r = new Rectangle2D.Float(p.x, p.y, 
                        template.getWidth(), template.getHeight());
                g2.draw(r);
            }
        }
    }

    public Test(BufferedImage img, BufferedImage template) {
        this.img = img;
        this.template = template;
    }

    public void run() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        ImagePanel p = new ImagePanel();
        JButton button = new JButton("Find");
        JProgressBar pbar = new JProgressBar();
        button.addActionListener(e -> 
            new Thread(() -> find(p, ev-> pbar.setValue((int)ev.getNewValue()))).start());

        JPanel controls = new JPanel();
        controls.add(pbar);
        controls.add(button);
        
        frame.add(p);
        frame.add(controls, BorderLayout.SOUTH);
        frame.pack();
        frame.setResizable(false);
        frame.setVisible(true);
    }

    private void find(JComponent c, PropertyChangeListener l) {
        int maxX = img.getWidth() - template.getWidth();
        int maxY = img.getHeight() - template.getHeight();

        int oldProgress = 0;
        for (int i = 0; i < maxY; i++) {
            for (int j = 0; j < maxX; j++) {
                int progress = (i*maxX+j)*100/(maxY*maxX);
                if (oldProgress != progress && progress % 10 == 0) {
                    final int old = oldProgress;
                    SwingUtilities.invokeLater(() -> l.propertyChange(
                            new PropertyChangeEvent(this, "progress", old, progress)));
                }
                oldProgress = progress;

                if (matchesTemplate(j, i)) {
                    Point p = new Point(j, i);
                    SwingUtilities.invokeLater(() -> positions.add(p));
                    j += template.getWidth() - 1;
                }
            }
        }
        final int old = oldProgress;
        SwingUtilities.invokeLater(() -> l.propertyChange(
                new PropertyChangeEvent(this, "progress", old, 100)));
    
        SwingUtilities.invokeLater(() -> c.repaint());
    }

    private boolean matchesTemplate(int x, int y) {
        int maxY = template.getHeight();
        int maxX = template.getWidth();
        int n = maxX * maxY;
        int maxMisses = 8*n / 100;
        int misses = 0;        

        for (int cy = 0; cy < maxY; cy++) {
            for (int cx = 0; cx < maxX; cx++) {
                int templateCol = template.getRGB(cx, cy);
                int imgCol = img.getRGB(x + cx, y + cy);
                if (!similarColor(imgCol, templateCol, 25.0)) {
                    misses++;
                    if (misses > maxMisses) {
                        return false;
                    }
                }
            }
        }
        return true;
    }

    private boolean similarColor(int c1, int c2, double maxErr) {
        int redDiff = ((c1 & 0xff0000) >>> 16) - ((c2 & 0xff0000) >>> 16);
        int greenDiff = ((c1 & 0xff00) >>> 8) - ((c2 & 0xff00) >>> 8);
        int blueDiff = (c1 & 0xff) - (c2 & 0xff);

        double err = Math.sqrt(redDiff*redDiff + blueDiff*blueDiff + greenDiff*greenDiff);
        return err <= maxErr;
    }
   
    public static void main(String[] args) throws Exception {
        BufferedImage img = ImageIO.read(Test.class.getResource("mario.png"));
        BufferedImage template = img.getSubimage(378, 27, 80, 69); 
        Test app = new Test(img, template);
        SwingUtilities.invokeLater(() -> app.run());
    }
}
 

Nummer6800

Aktives Mitglied
Hallo keksdose132.

Habe das Problem zwar nicht richtig verstanden. Aber fuer image classification Machine Learning , also Gesichter in Bildern erkennen etc,
gibt es tolle Algorithmen und Software. Je nachdem, kann dies sehr schnell und genau sein. Man beachtet dann nur ein paar features.
Wenn man nach genug Tests und Anpassungen die Fehlerrate gering genug ist, sollte es auch ausreichen (z.B. in welchem Bereich des Bildes es sich befindet).

Gruß

Axel Pfennig, Duesseldorf
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Input/Output Kassenzettel lesen aus einem Bild Allgemeine Java-Themen 2
E am häufigsten vorkommenden Farben aus einem Bild Allgemeine Java-Themen 5
F Punkte in einem Bild finden Allgemeine Java-Themen 10
K Quadrat in einem Bild erkennen Allgemeine Java-Themen 33
R Texterkennung - Text aus einem/r Bild/Grafik auslesen Allgemeine Java-Themen 2
P Ascii Bild aus einem input file nur kommt nix im outputfile an?????? Allgemeine Java-Themen 5
V Wie kann ich ein Bild in einem Zip Archiv abspeichern? Allgemeine Java-Themen 3
berserkerdq2 Habe ein svg bild, kann ich das zu svg koordinaten umrechnen, damit ich den Umriss zeichnen kann? Wenn ja wie? Allgemeine Java-Themen 1
berserkerdq2 Wenn ich einfach eine GIF in den Scenebuilder als Bild reinpacke, wird das dann asl Gif angezeigt Allgemeine Java-Themen 1
OnDemand Prüfen ob Bild defekt ist Allgemeine Java-Themen 4
Y Bild in JPanel setzen Allgemeine Java-Themen 2
Kirby.exe Bild im Zentrum spiegeln Allgemeine Java-Themen 14
I Apache POI Bild in Word ersetzen Allgemeine Java-Themen 15
OnDemand Bild prüfen ob defekt Allgemeine Java-Themen 3
R Compiler-Fehler Bild per E-Mail versenden Allgemeine Java-Themen 3
M Java- Bild gewissen Anzahl von Sekunden anzeigen?! Allgemeine Java-Themen 4
RalleYTN 2D-Grafik Bild mit bilinearer Interpolation skalieren Allgemeine Java-Themen 31
RalleYTN 2D-Grafik Bild ohne AWT, Swing und JavaFX rotieren Allgemeine Java-Themen 12
S Telefonbuch mit Bild Allgemeine Java-Themen 4
A 2D-Grafik Text in ein Bild schreiben Allgemeine Java-Themen 11
Tacofan GIF-Bild wird "zerstört" Allgemeine Java-Themen 3
B Bild aus Jar kann nach Export nicht mehr gefunden werden Allgemeine Java-Themen 13
T Neuen Kanal in Bild (TIFF) einfügen à la Photoshop Allgemeine Java-Themen 2
Z Zahlen aus Bild auslesen Allgemeine Java-Themen 1
X Bild -> lokale Variable -> DB -> lokale Variable Allgemeine Java-Themen 3
E 3D Objekte in 2D Bild finden Allgemeine Java-Themen 5
R HtmlUnit: Canvas als Bild speichern Allgemeine Java-Themen 0
S Bild in Raster Allgemeine Java-Themen 1
S Bild in Frame Allgemeine Java-Themen 0
A Bild aufteilen für getData Allgemeine Java-Themen 3
P Wie füge ich ein Bild in die GUI ein? Allgemeine Java-Themen 7
F ImageJ: Linien und Schnittpunkte in Bild Allgemeine Java-Themen 1
A mit getClassLoader Bild laden Allgemeine Java-Themen 8
E Bild abspeichern Allgemeine Java-Themen 5
D Face.com - Gesicht im Bild finden Allgemeine Java-Themen 3
N Input/Output Bild von WebSite laden? Allgemeine Java-Themen 3
A Input/Output Bild in Java einlesen und analysieren! Allgemeine Java-Themen 8
S programm um bild auszulesen Allgemeine Java-Themen 2
R Bild offenbar zu groß um geladen zu werden? Allgemeine Java-Themen 12
B Bild verschieben Allgemeine Java-Themen 6
T Bild in jar Paket einbinden Allgemeine Java-Themen 9
D Bild Typ bestimmen Allgemeine Java-Themen 9
0 2D-Grafik Bild einfärben Allgemeine Java-Themen 8
A Bild zusammenbauen! Allgemeine Java-Themen 5
A Bild von Webcam aufzeichnen Allgemeine Java-Themen 14
V 2D-Grafik Bild transparent machen. Allgemeine Java-Themen 4
H Bild einscannen und speichern Allgemeine Java-Themen 29
E Bild mit Listener einfügen Allgemeine Java-Themen 3
B Bild in String einbauen? Allgemeine Java-Themen 3
C Bild auf HDD speichern Allgemeine Java-Themen 4
X Bild aus dem Netz von URL runterladen und in GUI einbinden. Allgemeine Java-Themen 3
F Bild (Point) mit scrollen lassen Allgemeine Java-Themen 5
B Bild- und Texterkennung Allgemeine Java-Themen 4
S Tracing eines Bildes (a.ka. Bild vektorisieren)..? Allgemeine Java-Themen 2
destroflyer *.dds-Bild anzeigen Allgemeine Java-Themen 12
F Bild aus externer Quelle laden und Skalieren? Allgemeine Java-Themen 11
X Bild im Memory zwischen speichern Allgemeine Java-Themen 11
R JAI - RGB Bild in 3 Einzelbilder zerlegen Allgemeine Java-Themen 4
A Möglichkeiten, ein Bild schnell auszuwerten Allgemeine Java-Themen 56
D Java Thread, Bild wird nur am Ende gezeichnet Allgemeine Java-Themen 5
K Zeichnen auf ein Bild und Scrollen Allgemeine Java-Themen 7
data89 Barcodes in Bild erkennen Allgemeine Java-Themen 17
S Bild anhand von Koordinaten einteilen Allgemeine Java-Themen 7
K Transparente Bilder in Bild positionieren und speichern. Allgemeine Java-Themen 5
W Bild Spiegeln, aber Originalbild ausblenden Allgemeine Java-Themen 2
B Bild wird nicht angezeigt. Allgemeine Java-Themen 10
Developer_X Avatar/Bild ins Profil einbinden Allgemeine Java-Themen 10
C Bild in .txt speichern und wieder als Bild speichern Allgemeine Java-Themen 2
D Bild in text tabelle umwandeln Allgemeine Java-Themen 2
G bild in package Allgemeine Java-Themen 6
MQue bild zoomen Allgemeine Java-Themen 2
R Farbe im Bild ersetzen Allgemeine Java-Themen 11
R PDF einlesen und als Bild abspeichern Allgemeine Java-Themen 8
P Bild aus dem Internet speichern Allgemeine Java-Themen 4
K Schreiben von Bildern: Bild bleibt leer Allgemeine Java-Themen 7
ARadauer Bild verkleinern. Allgemeine Java-Themen 9
F Bild (File) komplett serialisieren Allgemeine Java-Themen 9
H Wie erstelle ich ein Bild ( GeoTIFF ) ? Allgemeine Java-Themen 2
Ark Bild immer als ARGB laden Allgemeine Java-Themen 2
N Hochgeladenes Bild verkleinern und speichern Allgemeine Java-Themen 2
N Graphics2D als Bild abspeichern Allgemeine Java-Themen 6
M bild verkleinern Allgemeine Java-Themen 9
MQue svg- Bild Allgemeine Java-Themen 34
S JPEG Bild übertragen mit RMI ? Allgemeine Java-Themen 4
ToNyXXL Als Mauszeiger eigenes Bild verwenden! Allgemeine Java-Themen 3
M bild erkennung Allgemeine Java-Themen 2
S Bild durchs Label laufen Allgemeine Java-Themen 14
T Bild verliert Inhalt. Allgemeine Java-Themen 6
T Icon -> Bild einladen Allgemeine Java-Themen 18
G Bild neu zeichnen Allgemeine Java-Themen 13
S Bild Größe verändern Allgemeine Java-Themen 2
R Bild flackert nach Java-Install - nur bei Laufschriften. Allgemeine Java-Themen 2
H Bild base64encode als String Allgemeine Java-Themen 9
S Bild aus Zwischenablage in Applet einfügen Allgemeine Java-Themen 2
T Ich bin unfähig ein Bild relativ zu addressieren ... Allgemeine Java-Themen 12
D JPEGEncoder -> Schwarz Weiß Bild Allgemeine Java-Themen 2
M Eingelesene Bild wird automatisch skaliert Allgemeine Java-Themen 4
R Bild wird trotz allem einfach nicht angezeigt. - AHHHHH!!!!! Allgemeine Java-Themen 30
R Bild downloaden und darstellen lassen Allgemeine Java-Themen 5
R Bild downloaden und dann Applet ausfüllen Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben