Module: Appium::Core::Device::ImageComparison

Defined in:
lib/appium_lib_core/device/image_comparison.rb

Constant Summary collapse

MODE =
[:matchFeatures, :getSimilarity, :matchTemplate].freeze
MATCH_FEATURES =
{
  detector_name: %w(AKAZE AGAST BRISK FAST GFTT KAZE MSER SIFT ORB),
  match_func: %w(FlannBased BruteForce BruteForceL1 BruteForceHamming BruteForceHammingLut BruteForceSL2),
  goodMatchesFactor: nil, # Integer
  visualize: [true, false]
}.freeze
MATCH_TEMPLATE =
{
  visualize: [true, false]
}.freeze
GET_SIMILARITY =
{
  visualize: [true, false]
}.freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.add_methodsObject

class << self



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/appium_lib_core/device/image_comparison.rb', line 104

def self.add_methods
  ::Appium::Core::Device.add_endpoint_method(:match_images_features) do
    def match_images_features(first_image:, # rubocop:disable Metrics/ParameterLists
                              second_image:,
                              detector_name: 'ORB',
                              match_func: 'BruteForce',
                              good_matches_factor: nil,
                              visualize: false)
      unless ::Appium::Core::Device::ImageComparison::MATCH_FEATURES[:detector_name].member?(detector_name.to_s)
        raise "detector_name should be #{::Appium::Core::Device::ImageComparison::MATCH_FEATURES[:detector_name]}"
      end
      unless ::Appium::Core::Device::ImageComparison::MATCH_FEATURES[:match_func].member?(match_func.to_s)
        raise "match_func should be #{::Appium::Core::Device::ImageComparison::MATCH_FEATURES[:match_func]}"
      end
      unless ::Appium::Core::Device::ImageComparison::MATCH_FEATURES[:visualize].member?(visualize)
        raise "visualize should be #{::Appium::Core::Device::ImageComparison::MATCH_FEATURES[:visualize]}"
      end

      options = {}
      options[:detectorName] = detector_name.to_s.upcase
      options[:matchFunc] = match_func.to_s
      options[:goodMatchesFactor] = good_matches_factor.to_i unless good_matches_factor.nil?
      options[:visualize] = visualize

      compare_images(mode: :matchFeatures, first_image: first_image, second_image: second_image, options: options)
    end
  end

  ::Appium::Core::Device.add_endpoint_method(:find_image_occurrence) do
    def find_image_occurrence(full_image:, partial_image:, visualize: false, threshold: nil)
      unless ::Appium::Core::Device::ImageComparison::MATCH_TEMPLATE[:visualize].member?(visualize)
        raise "visualize should be #{::Appium::Core::Device::ImageComparison::MATCH_TEMPLATE[:visualize]}"
      end

      options = {}
      options[:visualize] = visualize
      options[:threshold] = threshold unless threshold.nil?

      compare_images(mode: :matchTemplate, first_image: full_image, second_image: partial_image, options: options)
    end
  end

  ::Appium::Core::Device.add_endpoint_method(:get_images_similarity) do
    def get_images_similarity(first_image:, second_image:, visualize: false)
      unless ::Appium::Core::Device::ImageComparison::GET_SIMILARITY[:visualize].member?(visualize)
        raise "visualize should be #{::Appium::Core::Device::ImageComparison::GET_SIMILARITY[:visualize]}"
      end

      options = {}
      options[:visualize] = visualize

      compare_images(mode: :getSimilarity, first_image: first_image, second_image: second_image, options: options)
    end
  end

  ::Appium::Core::Device.add_endpoint_method(:compare_images) do
    def compare_images(mode: :matchFeatures, first_image:, second_image:, options: nil)
      unless ::Appium::Core::Device::ImageComparison::MODE.member?(mode)
        raise "content_type should be #{::Appium::Core::Device::ImageComparison::MODE}"
      end

      params = {}
      params[:mode] = mode
      params[:firstImage] = Base64.encode64 first_image
      params[:secondImage] = Base64.encode64 second_image
      params[:options] = options if options

      execute(:compare_images, {}, params)
    end
  end
end

Instance Method Details

#compare_images(mode: , first_image: , second_image: , options: ) ⇒ Object

Performs images comparison using OpenCV framework features. It is expected that both OpenCV framework and opencv4nodejs module are installed on the machine where Appium server is running.



# File 'lib/appium_lib_core/device/image_comparison.rb', line 84


#find_image_occurrence(full_image: , partial_image: , visualize: false, threshold: nil) ⇒ Object

Performs images matching by template to find possible occurrence of the partial image in the full image with default options. Read docs.opencv.org/2.4/doc/tutorials/imgproc/histograms/template_matching/template_matching.html for more details on this topic.

Examples:

@driver.find_image_occurrence full_image: "image data 1", partial_image: "image data 2"

visual = @@driver.find_image_occurrence full_image: image1, partial_image: image2, visualize: true
File.write 'find_result_visual.png', Base64.decode64(visual['visualization']) # if the image is PNG


# File 'lib/appium_lib_core/device/image_comparison.rb', line 48


#get_images_similarity(first_image: , second_image: , detector_name: 'ORB', visualize: false) ⇒ Object

Performs images matching to calculate the similarity score between them with default options. The flow there is similar to the one used in ‘find_image_occurrence` but it is mandatory that both images are of equal size.

Examples:

@driver.get_images_similarity first_image: "image data 1", second_image: "image data 2"

visual = @@driver.get_images_similarity first_image: image1, second_image: image2, visualize: true
File.write 'images_similarity_visual.png', Base64.decode64(visual['visualization']) # if the image is PNG


# File 'lib/appium_lib_core/device/image_comparison.rb', line 67


#match_images_features(first_image: , second_image: , detector_name: 'ORB') ⇒ Object

match_func: ‘BruteForce’, good_matches_factor: 100, visualize: false)



# File 'lib/appium_lib_core/device/image_comparison.rb', line 24