OpenCV is a powerful and versatile open-source library for Computer Vision tasks. It is supported in many languages, including Python, Java and C++. It is packed with more than 2500 algorithms to perform almost any Computer Vision task with just a single library. OpenCV is well known for its interactive windows and real-time processing capabilities.
In this quick tutorial, basic image processing and video processing with this library are discussed using Python codes. It should be noted that Jupyter Notebook environments such as Colab and JupyterLab clash with some interactive methods of OpenCV. However, these issues can be easily overcome with the help of some external libraries. Nevertheless, the codes discussed in this tutorial are carried out in a Spyder environment for the best performance.
Install the library in your local machine to have fun with images and videos. Install OpenCV Python from the PyPi package.
!pip install opencv-python
Read and Write an Image
Before starting the image processing, make sure that the working directory has an image. In OpenCV, an image can be read as a color or a grayscale image with corresponding flags. Read a coloured image with the imread method as shown below:
import cv2
# read an image in colour mode
img = cv2.imread('daria.jpg', 1)
Argument 1 in the above imread method is a flag that directs that the image has to be read in colour. Flag 0 refers to grayscale image reading. The read image can be displayed in a window using imshow method.
# display the image in a window
cv2.imshow('Image Window', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
OpenCV allows performing multiple inputs and outputs simultaneously through multiple windows. The waitKey method is used to inform OpenCV the time duration over which a window can be kept open. This method takes time as an argument in milliseconds. If 0 is provided as the argument, the user should close the window manually. It can be noted that the window has a name of its own. Therefore, when there comes a window into play, it must be named. Here, the window name is ‘Image Window’. destroyAllWindows method is used to force all the open windows to close at once.
To read the above image as a grayscale image,
# read an image in grayscale mode
img = cv2.imread('daria.jpg', 0)
# display the image
cv2.imshow('Image Window', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Write an image to the local directory using the imwrite method. The method takes two arguments: name of image about to be written and the read/processed image.
# write the image
cv2.imwrite('daria_gray.jpg', img)
Read and Write a Video
A video is a collection of frames displaying at speed termed frames per second (fps). Each frame is an image. Excluding the specific properties such as frames per second and codec format, OpenCV processes videos the same way it processes images. OpenCV reads a video either from a file or directly from the device’s camera. This feature makes OpenCV the de facto choice for navigation systems such as robots and drones, embedded systems such as Raspberry Pi and Arduino, and autonomous vehicles.
# read a video from file
capture = cv2.VideoCapture('swan.mp4')
# display the read video file
while capture.isOpened():
ret, frame = capture.read()
if not ret:
break
cv2.imshow('Video Window’, frame)
cv2.waitKey(25)
capture.release()
cv2.destroyAllWindows()
A frame in video output:
Video plays until there is a frame to read in the file. If we wish to read the device’s camera, the file name in the VideoCapture method should be replaced with number 0 (zero). In that case, the user needs to enable keyboard shortcut to stop capturing. The following example shows camera capturing along with keyboard shortcut of letter ‘q’ to interrupt capturing.
# read real-time video from device’s camera
capture = cv2.VideoCapture(0)
# display the capturing
while capture.isOpened():
ret, frame = capture.read()
cv2.imshow('Video Window’, frame)
if cv2.waitKey(20) & 0xFF == ord(‘q’):
break
capture.release()
cv2.destroyAllWindows()
Writing a video into a file needs some properties such as frame width, frame height and frame rate (fps). The following codes enable us to learn the input video properties.
capture = cv2.VideoCapture('swan.mp4')
# get frame properties
print(capture.get(cv2.CAP_PROP_FRAME_WIDTH))
print(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
print(capture.get(cv2.CAP_PROP_FRAME_COUNT))
Output:
Write the video file to disk in any format you wish. It is required that the right fourcc codec format, frame size and frame rate should be provided as arguments to enable proper saving of the video file. Here, in the below example code, the file is saved in the working directory in the name of ‘output.mp4’.
# read a video and write it to another file
capture = cv2.VideoCapture('swan.mp4')
# create a write file - arguments: file_name, fourcc_code, fps, size
out = cv2.VideoWriter('output.mp4', cv2.VideoWriter_fourcc(*'XVID’'), 20.0, (640,360))
while capture.isOpened():
# read frame by frame
ret, frame = capture.read()
out.write(frame)
if not ret:
break
cv2.imshow('Video Window', frame)
cv2.waitKey(25)
capture.release()
out.release()
cv2.destroyAllWindows()
Draw Shapes in an Image
In OpenCV, shapes such as a line, arrowed line, circle, rectangle, ellipse and polygons can be drawn over an image. Start and end coordinates, color of the shape, thickness of the border line are the common parameters in drawing a shape. It should be noted that OpenCV supports colours in BGR format, in contrast to most libraries such as Matplotlib and Seaborn where they support colours in RGB format.
# read a coloured image
img = cv2.imread('mason.jpg', 1)
print(img.shape)
Output:
Draw a vertical green coloured line on the image
# arguments: image, start, end, colour, thickness
img = cv2.line(img, (50,100), (50,300), (0,255,0), 10)
# display the image
cv2.imshow('Image Window', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Draw a blue coloured circle and a red coloured rectangle on top of it.
img = cv2.imread('mason.jpg', 1)
# draw a green vertical line in it
# arguments: image, start, end, colour, thickness
img = cv2.line(img, (50,100), (50,300), (0,255,0), 5)
# draw a blue circle on it
# arguments: image, centre, radius, colour, thickness
img = cv2.circle(img, (150,250), 60, (255,0,0), 5)
# draw a red rectangle on it
# arguments: image, diagonal_start, diagonal_end, colour, thickness
img = cv2.rectangle(img, (300,140), (400,270), (0,0,255), 5)
# display the image
cv2.imshow('Image Window', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Write Text on an image
Text can be written on an image. Its location, size, font and colour can be customized as per the user’s wish.
img = cv2.imread('senjuti.jpg')
# display the Original image without Text
cv2.imshow('Original Image', img)
# add text on the image
# arguments: image, text, start_location, font, font_size, colour, thickness
text_image = cv2.putText(img, 'I love Colours', (40,50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255),2)
# display the image with Text in a new Window
cv2.imshow('Image with Text', text_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Running date-time on videos can be made in real-time using Python’s datetime library and OpenCV’s putText method. The below code example shows real-time date-time display on a video. It is especially useful in real-time camera capturing.
# import the library
from datetime import datetime
text = str(datetime.now())
# read a video from file
capture = cv2.VideoCapture('drive_6.mp4')
# display the read video file
while capture.isOpened():
ret, frame = capture.read()
# add date-time to the frames
frame = cv2.putText(frame, text, (30,40), cv2.FONT_HERSHEY_PLAIN, 1, (0,0,255), 2)
if not ret:
break
cv2.imshow('Video Window', frame)
cv2.waitKey(30)
capture.release()
cv2.destroyAllWindows()
Colour Analysis on an Image
We discussed that colour images in OpenCV are read and processed in BGR colour format. An image can be split into three separate images for each of the Blue, Green and Red channels. On the other hand, the split image can be back to original colour or different channel combinations as shown in the example below.
# read an image
img = cv2.imread('daria.jpg', 1)
# split the colour image and merge back
B, G, R = cv2.split(img)
img_BGR = cv2.merge((B,G,R))
img_RGB = cv2.merge((R,G,B))
img_BRG = cv2.merge((B,R,G))
# display the merged images
cv2.imshow('Image in BGR', img_BGR)
cv2.imshow('Image in RGB', img_RGB)
cv2.imshow('Image in BRG', img_BRG)
cv2.waitKey(0)
cv2.destroyAllWindows()
Alterations in Images
A portion of an image can be extracted or replaced with a similar-sized image patch or any simple math alterations similar to that. Here, we perform some replacements in an image with its own sub-portion in an example.
# coffee cup alteration
img = cv2.imread('brooke.jpg')
# extract a portion of the image
coffee = img[150:235,200:300]
alter = img.copy()
# perform multiple alterations
alter[0:85,0:100] = coffee
alter[85:170,0:100] = coffee
alter[170:255,0:100] = coffee
alter[20:105,220:320] = coffee
# display the Original image
cv2.imshow('Original Image', img)
# display the altered image
cv2.imshow('Altered Image', alter)
cv2.waitKey(0)
cv2.destroyAllWindows()
Merging Multiple Images
Two or more images can be merged either by simple addition or by weighted addition. However, adding together images should be the same size and have the same number of channels.
# read two images and resize them
img_1 = cv2.imread('xuan.jpg', 1)
img_1 = cv2.resize(img_1, (320,225))
img_2 = cv2.imread('daria.jpg',1)
img_2 = cv2.resize(img_2, (320,225))
# display original images
cv2.imshow('Image 1', img_1)
cv2.imshow('Image 2', img_2)
cv2.waitKey(0)
cv2.destroyAllWindows()
# simple addition
simple = cv2.add(img_1, img_2)
cv2.imshow('Simple Addition', simple)
cv2.waitKey(0)
cv2.destroyAllWindows()
# weighted addition
weight_70 = cv2.addWeighted(img_1, 0.7, img_2, 0.3, 0)
weight_30 = cv2.addWeighted(img_1, 0.3, img_2, 0.7, 0)
cv2.imshow('70-30 Addition', weight_70)
cv2.imshow('30-70 Addition', weight_30)
cv2.waitKey(0)
cv2.destroyAllWindows()
Wrapping Up
In this tutorial, we discussed the OpenCV library and its fundamental implementation in Python.
We discussed loading an image or a video file and saving them to the disk. Further, we drew some standard shapes such as line, circle and rectangle over an image. We looked at writing texts, including real-time running texts of date and time. We learned how OpenCV handles colour channels (B,G,R) and split and merged in different colour combinations. Finally, we discussed alterations in an image and merging different images to create a new interactive image.
Note: Images and videos used are open source images that need no license to reuse.


