RV Image is a Remote viewer for images written in Rust. You can view images, e.g., on remote SSH servers or Azure blob storages. Further, RV Image comes with a simple bounding box labeling tool supporting import and export of the Coco-format. So far only tested on Windows 10 and Mac OS. RV Image is mainly based on egui
, image
, and pixels
.
Currently, we do not provide pre-built binaries. With Rust installed
you can
cargo install rvimage
RV Image connects to
ssh2
crate, python -m http.server
, andExample configuration for the connection types can be found below. Images are cached locally in a temporary directory.
When RV Image is started, also an http server is launched as aditional navigation option besides the graphical user interface. The default address is 127.0.0.1:5432
. If occupied, the port will be increased. When sending a
get-request to /file_label
the image file_label
is loaded. For this to work, file_label
must
be in the currently opened folder.
Create a file rv_cfg.toml
in %USERPROFILE%/.rvimage/rv_cfg.toml
(or probably $HOME/.rvimage/rv_cfg.toml
under Linux, untested) with the following content. For SSH currently, only authorization with key-files without passphrase is supported.
```
# We support the connections "Local", "Ssh", "PyHttp", or "AzureBlob"
connection = "Ssh"
cache = "FileCache"
[filecacheargs] nprevimages = 2 # number of images to be cached previous to the selected one nnextimages = 8 # number of images to be cached following the selected one n_threads = 4 # number of threads to be used for background file caching
[ssh_cfg]
remotefolderpaths = [ "folder on your server", "another folder" ] address = "address:port" # port is usually 22 user = "your username" sshidentityfilepath = "somepath/.ssh/idfilewithprivate_key"
[pyhttpreader_cfg]
python -m http.server
in some folder.server_address = 'http://localhost:8000/'
[azureblobcfg]
connectionstring = '' containername = ''
prefix = ''
```
RV Image comes with a simple bounding box labeling tool that can export to and import from the Coco format.
For an import to work, the folder that contains the images needs to be opened beforehand. To filter for files that contain bounding boxes of a specific label, one can put label:<name-of-label>
into the filter text field. Thereby, <name-of-label>
needs to be replaced by the real name of the label. To filter for unlabeled files use unlabeled:
.
| event | action | | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------- | | first left click | start drawing box | | second left click | finish drawing box | | left click on corner of box | move corner of box | | hold right button | move selected boxes | | Ctrl + left click on box | select box | | Alt + left click on box | select box and deselect others and switch to currently selected label | | Shift + left click on box | select all boxes with overlap with the maximal span of this box and other selected boxes | | Ctrl + A | select all boxes | | Delete | remove selected boxes | | Ctrl + D | deselect all boxes | | C | clone selected boxes at mouse position and move selection to new box | | Ctrl + C | copy all selected boxes to clipboard | | Ctrl + V | paste boxes without existing duplicate from clipboard | | V | activate auto-paste on image change | | Left⬅/Right➡/Up⬆/Down⬇ | move bottom right corner of all selected boxes | | Ctrl + Left⬅/Right➡/Up⬆/Down⬇ | move top left corner of all selected boxes | | Alt + Left⬅/Right➡/Up⬆/Down⬇ | move all selected boxes | | Ctrl + L | toggle category names |
* The connection to Azure blob storages has tokio
, futures
, azure_storage
, and azure_storage_blob
as additional dependencies, since the used Azure SDK is implemented async
hronously and needs tokio
. However, the rest of RV Image uses its own small threadpool implementation. Hence, the Azure blob storage connection is implemented as Cargo-feature azure_blob
that is enabled by default.