'How to compare the contents of two images using sikuli?

import shutil
import os
wait(5)
dir = os.path.dirname(getBundlePath()) # the folder, where your script is stored
img = capture(SCREEN) # snapshots the screen
shutil.move(img, os.path.join(dir, "shot.png")) # to make it persistent
wait(10)
dir = os.path.dirname(getBundlePath()) # the folder, where your script is stored
img2 = capture(SCREEN) # snapshots the screen
shutil.move(img2, os.path.join(dir, "shot2.png")) # to make it persistent
if img == img2:
    popup("hello")
else:
    popup("hi")

It is always giving pop up hi not hello... though i haven't changed the screen.

I can understand that these two are two different images names that's why always the else block is working. But is it possible to compare these two images. Contents of two images where there is some difference between the two. Was unable to upload the code so have commented it.. Help if anyone knows.



Solution 1:[1]

http://doc.sikuli.org/finder.html <-- another way for looking inside of something

Ideally Sikuli works if you already have an image that your comparing against what's found on the screen. Below I dynamically create a region, then snap a picture, and finally compare the saved picture against what in the dynamically created region.

imagePath1 = capture()  #snapshots the screen
image1 = exists(imagePath1)  #Create a Match object
imagePath2 = capture()  #snapshots the screen
image2 = Pattern(imagePath2)  #Create a Matach Object
myRegion = Region(image1)  #make new region from the match object
if myRegion.exists(image2): #look in the region
    print "hello" #yeah it's in the region of the screen
else:
    print "hi"  #nope not there....

This one is more like what you want i beleive. You can take three different pictures and then a smaller picture of the one yout want. If you call getScore() it will return precent match http://doc.sikuli.org/match.html#Match

imagePath1 = capture('Match obj take large picture') # snapshots the screen
matchObj1 = exists(imagePath1) #Make match object

imagePath2 = capture('Match obj take large picture') # snapshots the screen
matchObj2 = exists(imagePath2) #Make match object

imagePath3 = capture('Match obj take large picture') # snapshots the screen
matchObj3 = exists(imagePath3) #Make match object

imagePath4 = capture('Target, take small picture') # snapshots the screen 
patternIwant = Pattern(imagePath4) #Make a pattern object search against

matchList = [matchObj1, matchObj2, matchObj3]

for m in matchList:
    arg = m.exists(patternIwant)
    if arg != None:
        print 'image score  ', arg.getScore()
    else:
        print 'no match'
    if m.exists(patternIwant):
        print "hello"
    else:
        print "hi"

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Vadim Kotov