\( \newcommand{\P}[]{\unicode{xB6}} \newcommand{\AA}[]{\unicode{x212B}} \newcommand{\empty}[]{\emptyset} \newcommand{\O}[]{\emptyset} \newcommand{\Alpha}[]{Α} \newcommand{\Beta}[]{Β} \newcommand{\Epsilon}[]{Ε} \newcommand{\Iota}[]{Ι} \newcommand{\Kappa}[]{Κ} \newcommand{\Rho}[]{Ρ} \newcommand{\Tau}[]{Τ} \newcommand{\Zeta}[]{Ζ} \newcommand{\Mu}[]{\unicode{x039C}} \newcommand{\Chi}[]{Χ} \newcommand{\Eta}[]{\unicode{x0397}} \newcommand{\Nu}[]{\unicode{x039D}} \newcommand{\Omicron}[]{\unicode{x039F}} \DeclareMathOperator{\sgn}{sgn} \def\oiint{\mathop{\vcenter{\mathchoice{\huge\unicode{x222F}\,}{\unicode{x222F}}{\unicode{x222F}}{\unicode{x222F}}}\,}\nolimits} \def\oiiint{\mathop{\vcenter{\mathchoice{\huge\unicode{x2230}\,}{\unicode{x2230}}{\unicode{x2230}}{\unicode{x2230}}}\,}\nolimits} \)

OpenCV is a very popular computer vision and image processing library.
There are bindings for C++, Java, JavaScript, and Python

Installation

  • Download Python 3

Free algorithms only

pip install opencv-contrib-python
  • Missing SURF and SIFT.
    • The patent for SIFT expired on March 6, 2020 so it might be added to opencv-contrib-python in a future update.
    • The patent for SURF should expire around 2029.

Non-free Algorithms

You need to compile OpenCV from source alongside OpenCV-contrib.
Email me if you want a prebuilt wheel for Python 3.6 or 3.7.

Compile opencv-contrib-python

You can build a wheel to install which includes NONFREE modules as follows:

sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev
sudo apt install -y libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev
sudo apt install -y libpng-dev libjpeg-dev libopenexr-dev libtiff-dev libwebp-dev libjasper-dev
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install -y libjasper1 libjasper-dev
# sudo apt install -y tesseract-ocr* liblept5 leptonica-progs libleptonica-dev
  • Setup a build environment
conda create -n opencvbuild python=3.7
conda activate opencvbuild
conda install -c conda-forge pyqt
  • Make a wheel
git clone --recurse-submodules [email protected]:skvark/opencv-python.git
cd opencv-python
export ENABLE_CONTRIB=1
export CMAKE_ARGS="-DOPENCV_ENABLE_NONFREE=ON -DWITH_QT=5"
python setup.py bdist_wheel
Compilation Instructions

See https://www.pyimagesearch.com/2018/08/15/how-to-install-opencv-4-on-ubuntu for instructions.

cd ~
git clone [email protected]:opencv/opencv.git
git clone [email protected]:opencv/opencv_contrib.git
cd opencv
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
	-D CMAKE_INSTALL_PREFIX=/usr/local \
	-D INSTALL_PYTHON_EXAMPLES=ON \
	-D INSTALL_C_EXAMPLES=OFF \
	-D OPENCV_ENABLE_NONFREE=ON \
	-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
	-D PYTHON3_EXECUTABLE=~/anaconda3/envs/tf2/bin/python \
	-D PYTHON3_INCLUDE_DIRS=~/anaconda3/envs/tf2/python3.7m \
	-D PYTHON3_LIBRARIES=~/anaconda3/envs/tf2/lib/libpython3.7m.so \
	-D BUILD_EXAMPLES=ON ..
make -j16
sudo make install
sudo ldconfig

Usage

Getting Started

import cv2

# cv2.IMREAD_ANYCOLOR = 4
# cv2.IMREAD_ANYDEPTH = 2
# cv2.IMREAD_COLOR = 1
# cv2.IMREAD_GRAYSCALE = 0

# Use cv2.IMREAD_GRAYSCALE to read in grayscale
my_image = cv2.imread("my_image.png", cv2.IMREAD_GRAYSCALE)

# Perform some modification
# Do your machine learning here

# Write your output image
cv2.imwrite("my_modified_image.png", my_image)

Resizing an Image

Reference

import numpy as np
import cv2

img = cv2.imread('messi5.jpg')
new_img = cv2.resize(img, (500,200), interpolation = cv.INTER_CUBIC)

Video

Reading Video

video_capture = cv2.VideoCapture(path.join(videos_folder, video_filename))
if not video_capture.isOpened():
    print("Error opening video stream or file")
    sys.exit(0)

frame_num = 0
while video_capture.isOpened() and frame_num < 30:
    ret, frame = video_capture.read()
    if ret:
        cv2.imshow('Frame', frame)

        frame_num = frame_num + 1
        if cv2.waitKey(25) & 0xFF == ord('q'):
            break
    else:
        break
Parameters
# Resolution
width = int(video_capture.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(video_capture.get(cv2.CAP_PROP_FRAME_HEIGHT))

total_frames = int(video_capture.get(cv2.CAP_PROP_FRAME_COUNT))
frame_pos = int(video_capture.get(cv2.CAP_PROP_POS_FRAMES))

Writing Video

C++ Video Write
Note that OpenCV does not handle audio.

output_video = cv2.VideoWriter()
codec = cv2.VideoWriter_fourcc(*"avc1")
fps = 15
image_size = (100, 100)
output_video.open("video_output.mp4", codec, fps, image_size, True)
if not output_video.isOpened():
    print("Error opening output video")

# Write all of your frames
# while have_frames:
#   output_video.write(my_frame)

# Release the video
output_video.release()

Resources