Similar-vid is a library for finding similar frames between videos
Project description
Similar Vid
Similar-vid is a library for finding similar frames between videos. It is written as a thin wrapper aroung the Decord and OpenCV libraries. It was inspired by Netflix's "Skip Intro" feature which allows users to skip intro portions of a tv show.
Table of Contents
Dependencies
Similar-vid depends on the following:
- pillow
- numpy
- decord
- imagehash
- opencv-python
Fortunately, there's a Pipfile that contains virtual environment configurations as will be explained below.
Installation
The most straightforward way to install the library is via pipenv:
- Clone the repository
- cd to the repository and install the dependencies using pipenv
- activate the directory
git clone https://github.com/jahwi/similar-vid.git
cd similar-vid
(optionally install pipenv) pip install pipenv
pipenv install
pipenv shell
Alternatively, you can install the dependencies above manually using pip.
pip install pillow numpy decord opencv-python imagehash
Usage
Using Similar-vid within other python projects
- Loading and Matching
- Saving hashes and match data for future use
- Loading saved hashes into fields
- Using Aliases
The CLI
Within the project is also a cli wrapper around the library. It is the most straightforward way to use Similar-vid.
similar_cli.py "path_to_refrence_video_or_hash" "path_to_other_video another_file_path yet_another_video_file_path"
Using Similar-Vid within other python projects
1. Loading and Matching
The Similar class' match method compares frames between a reference video and an array of at least one other video.
# import the class
from similar_vid.similar_secs import Similar
if __name__=="__main__":
# The library uses multiprocessing, so protect the entry point
# load videos
video_task = Similar(ref=path_to_reference_video, comp_arr=[path_to_other_video_1, path_to_other_video_2, path_to_other_video_3])
# match videos in comp_arr against reference video
video_task.match()
# print matches
print(video_task.matches)
2. Saving hashes and match data for future use
The library also provides a save function, which is a wrapper around the json.dumps method of the json library. It allows saving fields of the Similar class to a json file for future use. These can then be reloaded as will be discussed in 3. Loading saved hashes into fields.
# import the class
from similar_vid.similar_secs import Similar, save
if __name__=="__main__":
# load videos
video_task = Similar(ref=path_to_reference_video, comp_arr=[path_to_other_video_1, path_to_other_video_2, path_to_other_video_3])
# save the video's fields for future use
save(video_task.ref, path_to_output_file.json) # field holds the reference video hash
save(video_task.comp, path_to_another_output_file.json) # field holds the hashes of the comparision array
3. Loading saved hashes into fields
After saving fields using the save function, the load function allows loading saved hashes into fields.
# import the class
from similar_vid.similar_secs import Similar, load
if __name__=="__main__":
# load videos via hashes
video_task = Similar() # first, declare an empty instance
video_task.ref = load(path_to_ref_video_hash.json) # then edit the fields directly
video_task.comp = load(path_to_comp_videos_hash.json)
# It can then be matched, as usual
video_task.match()
print(video_task.matches)
# You can also add individual hashfiles to the comp_array
video_task.comp.append(load(path_to_a_hashed_video.json))
4. Using Aliases
The library assigns aliases to videos. The reference video has an alias named ref, while the videos to be compared against are named compare_n, where n is the zero-indexed position of the video in the array. The library provides a method get_by_alias which allows selecting class objects by their aliases. Additionally, the class has a field, named aliases which shows the list of aliases in use for that instance.
# import the class
from similar_vid.similar_secs import Similar
if __name__=="__main__":
# load videos
video_task = Similar(ref=path_to_reference_video, comp_arr=[path_to_other_video_1, path_to_other_video_2, path_to_other_video_3])
reference_by_alias = video_task.get_by_alias("ref") # selects the reference video object, if it exists.
# The above is equivalent to:
reference_directly = video_task.ref
# list aliases, if any
print(video_task.aliases)
TODOs
- Add ability to compare videos files to hashes directly..
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file similar_vid-0.0.11.tar.gz.
File metadata
- Download URL: similar_vid-0.0.11.tar.gz
- Upload date:
- Size: 9.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e804b7ac002d6b5a6d2764437430efdc81a731c23d3fb60ba95f85bcd52ab350
|
|
| MD5 |
e2a77ce5dd8abd9f6f9c72eca246ecd1
|
|
| BLAKE2b-256 |
07e17bee99bd97fe3054f06e03a54d2e12e16b894527eef9c2cdb8d2a9367a37
|
File details
Details for the file similar_vid-0.0.11-py2.py3-none-any.whl.
File metadata
- Download URL: similar_vid-0.0.11-py2.py3-none-any.whl
- Upload date:
- Size: 8.9 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b73d34e9c6ac68736d88ca8faeecc5d28a18ea0ddc6274ded66668e22ee800e1
|
|
| MD5 |
fe455accd4d64af3f79f879af3317294
|
|
| BLAKE2b-256 |
51f534ec11fff5386c31c2a082b78cb60951ab3ef4481046472fa773450201f3
|