The default parameters for the image-matching algorithm have changed from MatchParameters(confirm_method="absdiff", confirm_threshold=0.16) to MatchParameters(confirm_method="normed-absdiff" confirm_threshold=0.30).
This has been our recommended setting for several years; now it's the
default. The "normed-absdiff" algorithm works better in most cases, except
when you're looking for an image with very little structure (for example a
plain patch of a single colour). We recommend that you always include some
structure (edges) in your reference images; if you really need to match a
plain blob of colour, you can override the algorithm for specific invocations
of stbt.match by passing a match_parameters argument.
To keep using the previous defaults, add this to the [match] section of
your stbt config file:
confirm_method=absdiff confirm_threshold=0.16
Note that users of the Stb-tester hardware have always been been using
these new values, as we provide a custom stbt.conf file to our customers.
The default interpress_delay_secs for stbt.press is now 0.3 instead of 0.
This matches best practices and what the documentation actually says. To keep
using the previous default, add this to the [press] section of your stbt
config file:
interpress_delay_secs = 0
Thanks to Rinaldo Merlo for the bug report.
Note that users of the Stb-tester hardware have always been using the
best-practices default value of 0.3, as we provide a custom stbt.conf file to
our customers.
Passing region=None to stbt.ocr raises a TypeError. Use region=stbt.Region.ALL instead. Note that passing None has printed a
deprecation warning since v0.21 (three years ago); raising an exception will
force users to update their test scripts, allowing us to change the behaviour
again in a future release to be consistent with stbt.match_text where None means an empty region.
Passing type_=bool to stbt.get_config now returns False for values of
"0", "false", "off", and "no" (all of these are checked in a case-insensitive
manner). Previously it would always return True for any non-empty value.
Removed workaround for 4 year old deadlock bug in decklinksrc. If this is
still necessary, set source_teardown_eos = True in the [global] section
of your stbt config file, and let us know on the mailing list as we may
remove the workaround completely in a future release.
A call to stbt.get_frame() is no-longer guaranteed to return a new frame, it
may return the same frame that the previous call to stbt.get_frame() returned. This may have subtle effects on the timing of existing test-scripts.
Functions that depend on this behaviour should be refactored to use the stbt.frames() iterator method instead.
If this change causes you problems you can add:
[global] use_old_threading_behaviour = true
to your stbt.conf to restore the old behaviour. This option may be removed
in the future. Please let us know on stb-tester/stb-tester#449 if this will
cause you problems.
The benefit is that you can now call stbt.get_frame() from multiple threads
and usage like wait_until(lambda: match('a.png') or match('b.png')) will run
faster as the second match will no longer block waiting for a new frame.
stbt.get_frame() and stbt.frames() now return read-only frames for better
performance. Use frame.copy() to get a writeable copy of the frame.
Python API: stbt can now be used from multiple threads simultaneously. Each
call to stbt.frames() returns an independent iterator that can be used
concurrently. Example, wait for tv to start playing or an error screen:
pool = multiprocessing.pool.ThreadPool() result = pool.imap_unordered(apply, [ lambda: wait_for_motion(), lambda: wait_for_match("error-screen.png") ]).next() if isinstance(result, MotionResult): print "TV is playing ok" else: print "Error screen"
New Android control mechanism to send taps, swipes, and key events. See the stbt.android.AdbDevice docstrings for usage instructions. You can capture
video from an Android mobile device using HDMI video-capture via an "MHL"
USB-to-HDMI cable, or with the Stb-tester CAMERA pointed at the
device's screen, or even by taking screenshots via AdbDevice.get_frame (but
if you're using AdbDevice.get_frame the Android device wont be visible in
the output video as this mechanism bypasses stb-tester's GStreamer pipeline).
See https://stb-tester.com/blog/2017/02/21/testing-video-playback-on-mobile-devices for a discussion of the trade-offs of each video-capture mechanism.
New control mechanism using the VNC RFB protocol. This protocol is used by
Cisco to control some of their set-top boxes. Thanks to Antonio Fin and
Fabrice Triboix, both at Cisco.
Python API: New function stbt.crop to crop a region from a video-frame.
Python API: New function stbt.load_image to load an image from disk, using
the same path lookup algorithm that stbt.match uses.
Python API: The mask parameter to stbt.detect_motion, stbt.wait_for_motion, and stbt.is_screen_black can be an OpenCV image
(previously it could only be a filename). This makes it easier to construct
masks programmatically.
Python API: stbt.detect_motion, stbt.wait_for_motion, and stbt.is_screen_black can take a new region parameter.
Python API: stbt.wait_until has two new parameters: predicate and stable_secs. Together they allow waiting for something to stabilise (for
example to wait for the position of a moving selection to stop moving).
Python API: stbt.ocr and stbt.match_text have a new parameter text_color. Specifying this can improve OCR results when tesseract's
default thresholding algorithm doesn't detect the text, for example for
light-colored text or text on a translucent overlay.
Python API: The pre-processing performed by stbt.ocr and stbt.match_text can now be disabled by passing upscale=False. This is useful if you want
to do your own pre-processing.
Python API: The default lang (language) parameter to stbt.ocr and stbt.match_text is now configurable. Set lang in the [ocr] section
of your configuration file.
Python API: Added region parameter to stbt.press_until_match. Thanks
to Rinaldo Merlo for the patch.
OpenCV 3 compatibility: stb-tester will now work with either OpenCV 2.4 or
OpenCV 3. This support is in beta, please let us know if you see anything not
working properly with OpenCV 3. OpenCV 2.4 is still our primary supported
target version of OpenCV.
Output video now runs a the full frame-rate of the input video rather than
slowing down during wait_for_match. As a side-effect the latency of the
video has increased by 0.5s and if the image processing is particularly slow
the annotations won't appear on the output video. Apart from that caveat,
annotations now appear if you got the frame using stbt.get_frame() (previously the annotations only appeared if the frames came from a stbt.frames() iterator). "Annotations" means the yellow & red rectangles
showing the current match, etc.
The irnetbox control now understands "double signals" in the irNetBox
config file generated by the RedRat IR Signal Database Utility. Thanks to
Rinaldo Merlo for the fix.
Fixed stbt power for ATEN power supplies with more than 8 ports. Thanks to
Lucas Maneos at YouView for the patch.
stbt batch run: New option --no-save-video disables video recordings of
each test-run. This can be used to reduce CPU consumption when video
recordings aren't required or are being captured in some other way.
stbt lint: Catch & ignore pylint inference exceptions.
stbt auto-selftest: Fix when running for the first time (when the
auto_selftest directory doesn't exist).
Python API: The is_visible property of stbt.FrameObject subclasses can
call other public properties. Furthermore, the value of is_visible is
always a bool, so you don't have to remember to cast it to bool in your
implementation.
Python API: stbt.wait_until will try one last time after the timeout is
reached. This allows you to use a short timeout_secs with operations that
can take a long time.
Python API: The stbt.MotionResult object returned by stbt.detect_motion and stbt.wait_for_motion includes the video-frame that was analysed.
This allows you to perform additional analysis -- for example if there was
no motion is the frame black?
Configuration: global.sink_pipeline can now be set to an empty value
(sink_pipeline=). This will have the same effect as sink_pipeline = fakesink but with lower resource utilisation.