[request] use a saved image the same way as a screen (virtual screen)
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
SikuliX |
In Progress
|
Medium
|
RaiMan |
Bug Description
Attempting to scan a previously saved screen capture. The screen capture contains multiple (similar) blocks of data. Each block contains three fields. Field 1 is a unique identifier, Field 2 will vary and must be ignored, Field 3 contains the content that will pass/fail this test step, but that content can also appear in other blocks of data.
Desired Algorithm Pseudo Code:
full_block = Pattern( "image1.png" ).similar(0.70) # image of block to find
field1 = Pattern(
field2 = Pattern(
field3 = Pattern(
f = Finder( "path\previousl
f.findAll(
while f.hasNext():
current_match = f.next()
if current_match.find( field1 ):
# We've uniquely the block, check unique identifier field1
if current_
else:
# We can exit now because we found unique identifier field1
break
else:
# no match on unique identifier field 1, this means current_match is a different block, so skip to the next one
This style of code works when using the Screen as the target of the find commands, but doesn't appear to work when using a previously saved image of the screen as the target. Any ideas on how to accomplish something similar? If my example isn't clear enough please let me know.
Changed in sikuli: | |
status: | New → In Progress |
importance: | Undecided → Medium |
assignee: | nobody → RaiMan (raimund-hocke) |
milestone: | none → 1.1.0 |
Changed in sikuli: | |
milestone: | 1.1.0 → 1.2.0 |
Changed in sikuli: | |
milestone: | 2.0.0 → 2.1.0 |
This is principally not possible with the current implementation: you can only use one level of find operations with a Finder() and you cannot restrict the Finders find operation to a subregion of the given image.
With this sequence of primary and secondary find operations on a real screen, with every find, there will be made a new screenshot and internally a new Finder(screenshot) for the respective area/subarea.
This does not happen in your Finder based solution with match.exists( field1 ), to make the if work ;-)
current_match.find( field1 ) (which should be current_
current_match is a region in the image, relative to its top left corner, but with current_match.find( field1 ) it is used as coordinates relative to the screen (the match currently does not "know", that it was made from a Finder( image). find() operation).
So if you want to solve this with a captured image, then you have to use Finder().findAll() for all objects and compare their coordinates, to find out, wether one match lies inside of another match (version 1.0.0 has the respective functions like region. contains( another_ region) )
I think your approach is very interesting and Sikuli should have the possibility, to use a stored image the same way it uses a screen.
I put it on the request list: use image as a virtual screen