easy-mhi 1.3
Simple library that can be used to generate motion history images from video frames

MotionHistoryImage Python Library
===================================
Image-Processing library built in Python 3.7 allowing developers to easily
generate MHI images from from a list of frames. A motion history image (MHI) is a static image template
that helps in understanding the motion location and path as it progresses. Using MHI, moving parts of a video
sequence can be engraved within a single image, from where the motion flow can be predicted.
<br>

Essentially this library is concatenating a series of frames into one single image, where brighter values correspond
to a more recent motion
 
<h5>Example:</h5>
<p align="center">
     <img src="https://i.imgur.com/JthsG7X.png?1">
</p>

<p align="center">
    <img src="https://i.imgur.com/WEeijLL.png?1">
</p>
 
 I'd recommend using OpenCV to perform background subtraction on frames being processed.
 I'll add a code snippet below to demonstrate how I got the above background subtraction images from raw frames.
 
```python
import cv2 as cv
IMG_SIZE = 224
frame = cv.resize(frame, (IMG_SIZE, IMG_SIZE))

# Filters tend to provide smoother subtraction with less background noise
frame = cv.medianBlur(frame, 5)
frame = cv.filter2D(frame, -1, kernel)

fgbg = cv.createBackgroundSubtractorMOG2()
mask = fgbg.apply(image)
```

Setup
==========   

You can either setup this library by cloning this repo and running setup.py from the install directory.

```
$  git clone https://github.com/larrett/mhi.git
$  cd mhi
$  python setup.py install
```

Alternatively, use this command to install via pip:

```
$ sudo pip install easy-mhi
```
     
Usage
==========
* Import the MotionHistoryImage library

```python
from easy-mhi import generate_mhi
```

* Below is an demonstration of how I used the library to generate MHI's from 
        a directory containing background subtracted images I wanted to combine in incremental order, 
        and saving them.


```python
from PIL import Image
import os
import shutil
from easy-mhi import generate_mhi


def generate_mhi_frames(
    file_dir,
    num_frames_per_mhi,
    start_index=1,
    output_dir='mhi_output',
    ):

    all_frames = []  # Create list of frames
    i = start_index
    while True:  # For all files
        file = file_dir + '/' + str(i) + '.jpg'  # File from starting index
        try:
            img_pixels = Image.open(file).convert('RGB').load()  # Open and load the file
            all_frames.append(img_pixels)  # Append file to list of frames
            print('Loaded frame ' + file)
        except IOError:
            print('Assuming all images are loaded... (next sequential file ' \
                + file + ' does not exist)')
            break
        i += 1  # Increment index
    print('Loaded ' + str(len(all_frames)) + ' raw motion frames!')

    # Generate each MHI frame
    num_mhis = len(all_frames) - num_frames_per_mhi + 1  # Calculation how many MHI images should be generated
    for i in range(num_mhis):

        # Compile list of frames to be used for this MHI
        mhi_frames = []  # Create a list of MHI frames
        for j in range(num_frames_per_mhi):  # Loop for amount of frames inside each MHI
            mhi_frames.append(all_frames[i + j])  # Specify which frames to get added to MHI
        
        # Generate MHI
        img = generate_mhi(mhi_frames, 224, 224)  # Generate 224x224 MHI based on frames in mhi_frames list
        output_path = output_dir + '/' + str(i + 1) + '.png'  # Create string for outputPath
        img.save(output_path)  # Save new MHI to outputPath
        print('MHI ' + str(i + 1) + ' saved to ' + output_path)
        # Return to top of loop, generate next MHI for the frames

    print('Generated and saved a total of ' + str(num_mhis) \
        + ' MHI frames to ' + file_dir + '/mhi_output/')
```

<sup>Use this project for whatever you want, I built this for my machine-learning thesis on fall detection.<sup>