ntt is a Python module that provides simple and consistent interfaces for common image and video processing tasks. It wraps around popular libraries such as Pillow, OpenCV, imageio, and scikit-image to simplify their usage and make them interchangeable, to build complex pipelines.
- Pillow – image file handling
 - OpenCV – computer vision, image and video processing
 - imageio – read/write images and videos
 - scikit-image – scientific image processing
 
- Create a virtual environment:
 
python -m venv venv- Activate the environment:
 
- On macOS/Linux:
 
source venv/bin/activate- On Windows:
 
venv\Scripts\activate- Install the module:
 
pip install nttimport ntt
 
ntt.__version__  # Check the versionAssuming you have cloned the repository or installed the source package, you can run tests with pytest:
$ pytest testsTo download the data samples (videos, images, sounds, etc.) used in tests and examples, clone the repository and update the .env file with the path to the cloned folder:
git clone https://github.com/centralelyon/ntt-samples.git
Alternatively, you can generate fake videos samples by running the following script:
from ntt.videos.video_generation import random_video
video = random_video(320, 240, 10, 2)The ultimate goal of ntt is to build complex pipelines for video and image processing. For that, we also built a separate tool, the pipeoptz library, which provides a simple way to create and manage pipelines of functions.
import random
from ntt.frames.frame_generation import random_frame
from ntt.frames.display import display_frame
from pipeoptz import Pipeline, Node
def random_number():
    num = random.randint(100, 600)
    return num
pipeline = Pipeline("Simple Pipeline", "Generate a random image.")
node_gen_width = Node("GenWidth", random_number) 
node_gen_height = Node("GenHeight", random_number)
node_random_frame = Node(
    "random_frame", random_frame, fixed_params={"width": 10, "height": 3}
)
pipeline.add_node(node_gen_width)
pipeline.add_node(node_gen_height)
pipeline.add_node(
    node_random_frame, predecessors={"width": "GenWidth", "height": "GenHeight"}
)
outputs = pipeline.run()
display_frame(outputs[1][pipeline.static_order()[-1]])You may look at the examples folder to see how to use ntt functions. Also a look a the tests folder to see how functions are tested. And of course, the documentation at https://ntt.readthedocs.io.
Assuming you have a crop.mp4  video in a samples folder and an output
folder, here is how to use extract_first_frame function.
import os
from dotenv import load_dotenv
from ntt.frames.frame_extraction import extract_first_frame
if __name__ == "__main__":
    load_dotenv()
    output = extract_first_frame(
        video_path_in=os.environ.get("NTT_SAMPLES_PATH"),
        video_name_in="crop.mp4",
        frame_path_out=os.environ.get("PATH_OUT"),
        frame_name_out="crop-ex.jpg",
    )
    print(f"Frame successfully extracted at {output}") if output is not None else print(
        "Frame extraction failed"
    ).
├── .circleci: configuration for CircleCI
│   ├── config.yml
│   └── ...
├── examples: simple examples on how to use ntt functions
│   ├── (files)
│   └── ...
├── samples: sample videos, images and data
│   ├── (files)
│   └── ...
├── src: the package source code
│   └── ntt: the main module
│       ├── README.md
│       ├── __init__.py
│       ├── frames: module for frame extraction
│       │   └── ...
│       ├── ...
│       └── ...
├── tests: pytest files
│   ├── (files)
│   └── ...
├── .gitignore
├── Dockerfile
├── README.md
├── pyproject.toml: ntt Python packaging file, contains ntt dependencies
├── requirements.txt
└──Each module structure is as follows:
.
├── ...
├── ntt/
│   ├── __init__.py
│   ├── README.md
│   ├── name_of_the_module/
│   │   ├── __init__.py
│   │   ├── README.md
│   │   ├── name_of_the_function1.py
│   │   ├── name_of_the_function2.py
│   │   └── ...
│   ├── ...
│   └── ...
└── ...The project is configured to run tests on CircleCI. The configuration file is
.circleci/config.yml.
- build the image
 
docker build -t ntt .
$ docker build -t ntt .- run the image (rm is to remove the container after it is stopped)
 
docker run --rm -v ${PWD}:/app ntt
- show the list of containers
 
docker ps -a
- run a custom script
 
docker run --rm -v ${PWD}:/app -e PYTHONPATH=/app/src ntt python tests/test_random_strings.py
- run in interactive mode
 
docker run --rm -it -v ${PWD}:/app -e PYTHONPATH=/app/src ntt bash
- run the image
 
docker run -v "$(pwd)":/app ntt python ntt/frames/test/test_frame_extraction.py



