'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 |
