-
Notifications
You must be signed in to change notification settings - Fork 12
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #12 from AAnirudh07/main
add image & video reading tutorial
- Loading branch information
Showing
9 changed files
with
655 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
## Reading-Image-Video | ||
|
||
### Reading an image using OpenCV | ||
- Images can be read using OpenCV's imread() function. | ||
|
||
**Syntax:** cv2.imread(path, flag) | ||
|
||
**Parameters:** | ||
path: A string representing the path of the image to be read. | ||
flag: It specifies the way in which image should be read. It’s default value is cv2.IMREAD_COLOR | ||
|
||
**Return Value:** This method returns an image object that is loaded from the specified file. | ||
|
||
For more implementation details, please refer to the associated Python notebook: `read_image_opencv.ipynb`. | ||
|
||
### Reading an image using PIL | ||
- Images can also be read using the Pillow's Image() function. | ||
**Syntax:** PIL.Image(path,mode="r") | ||
|
||
**Parameters:** | ||
path: A string representing the path of the image to be read. | ||
mode – The mode. If given, this argument must be “r”. Hence, this parameter is superfluous. | ||
|
||
**Return Value:** This method returns an image object that is loaded from the specified file. | ||
|
||
For more implementation details, please refer to the associated Python notebook: `read_image_pil.ipynb`. | ||
|
||
### Reading videos using OpenCV | ||
- A video is simply a sequence of frames. | ||
- OpenCV provides functions for reading video streams as a sequence of frames. | ||
- OpenCV's video reading methods are widely used. | ||
|
||
1. Reading a video using OpenCV | ||
|
||
**Syntax - I:** cv2.VideoCapture(path) | ||
|
||
**Parameters:** | ||
path: A string representing the path of the image to be read. | ||
|
||
**Return Value:** This method returns a VideoCapture object that can be used to read the file. | ||
|
||
**Syntax - II:** \<\<VideoCapture object\>\>.read() | ||
|
||
**Parameters:** | ||
path: A string representing the path of the image to be read. | ||
|
||
**Return Value:** This method returns two values: | ||
1. ret - a flag indicating if the last frame has been read. This value is always false till the last frame. | ||
2. frame - frame of a video | ||
|
||
For more implementation details, please refer to the associated Python script: `read_video_opencv.py`. | ||
|
||
2. Reading webcam stream using OpenCV | ||
- Reading a webcam stream is almost the same as reading a video. | ||
- First, the path attribute in the VideoCapture() function has to be set to 0 to refer to the default computer webcam. | ||
- Second, the ret value in the read() function does not matter. The stream is stopped as and when the user wishes to. | ||
|
||
|
||
### BONUS: Speed up frame processing using multi-threading | ||
- Despite its evident advantages, OpenCV is often very slow when it comes to reading video streams. This is because OpenCV reads a video frame-by-frame. | ||
- The frame rate can be increased by performing the read() method in a separate thread. The main execution thread can then be use the frames generated by the other thread. | ||
- A popular open-source library, imutils, uses this concept to speed up frame reading. Please refer to the associated python script for more details. (`read_video_imutils.py`) |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
363 changes: 363 additions & 0 deletions
363
Image Processing/Reading-Image-Video/read_image_opencv.ipynb
Large diffs are not rendered by default.
Oops, something went wrong.
158 changes: 158 additions & 0 deletions
158
Image Processing/Reading-Image-Video/read_image_pil.ipynb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,158 @@ | ||
{ | ||
"nbformat": 4, | ||
"nbformat_minor": 0, | ||
"metadata": { | ||
"colab": { | ||
"provenance": [] | ||
}, | ||
"kernelspec": { | ||
"name": "python3", | ||
"display_name": "Python 3" | ||
}, | ||
"language_info": { | ||
"name": "python" | ||
} | ||
}, | ||
"cells": [ | ||
{ | ||
"cell_type": "markdown", | ||
"source": [ | ||
"### This python notebook shows how to read images using PIL's Image() function. \n", | ||
"Image() supports various file formats including, but not limited to, .bmp, .webp, .jpg, .jpeg, and .png." | ||
], | ||
"metadata": { | ||
"id": "QvWIh7h0hurM" | ||
} | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 3, | ||
"metadata": { | ||
"id": "992nZ6S0hk66" | ||
}, | ||
"outputs": [], | ||
"source": [ | ||
"#Import the necessary libraries\n", | ||
"import os\n", | ||
"from google.colab import drive\n", | ||
"from google.colab.patches import cv2_imshow #used to display images on colab\n", | ||
"from PIL import Image" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"source": [ | ||
"#Connect to Google Drive\n", | ||
"drive.mount('/content/drive',force_remount=True)\n", | ||
"os.chdir('/content/drive/My Drive')\n", | ||
"print(\"Change successful.\")" | ||
], | ||
"metadata": { | ||
"colab": { | ||
"base_uri": "https://localhost:8080/" | ||
}, | ||
"id": "3gS6Rx6ch6n7", | ||
"outputId": "45854639-8687-4771-f834-7c7b43990f64" | ||
}, | ||
"execution_count": 2, | ||
"outputs": [ | ||
{ | ||
"output_type": "stream", | ||
"name": "stdout", | ||
"text": [ | ||
"Mounted at /content/drive\n", | ||
"Change successful.\n" | ||
] | ||
} | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"source": [ | ||
"#### Reading an image using Image() [Image(path)]" | ||
], | ||
"metadata": { | ||
"id": "3-doVYQ4h80E" | ||
} | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"source": [ | ||
"img = Image.open(\"python_logo.png\")\n", | ||
"img #this work-around is only for Google Colab. On your local machines please use img.show() to display the image." | ||
], | ||
"metadata": { | ||
"colab": { | ||
"base_uri": "https://localhost:8080/", | ||
"height": 242 | ||
}, | ||
"id": "Jw5KsuFWiJeT", | ||
"outputId": "fe1e289b-a5d0-4900-8e41-b4c1e55eed5b" | ||
}, | ||
"execution_count": 5, | ||
"outputs": [ | ||
{ | ||
"output_type": "execute_result", | ||
"data": { | ||
"text/plain": [ | ||
"<PIL.PngImagePlugin.PngImageFile image mode=P size=225x225 at 0x7FEAD36C64D0>" | ||
], | ||
"image/png": "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\n" | ||
}, | ||
"metadata": {}, | ||
"execution_count": 5 | ||
} | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"source": [ | ||
"#### PIL Image() mode attribute\n", | ||
"The mode attribute of the image tells the type and depth of the pixel in the image. A 1-bit pixel has a range of 0-1, and an 8-bit pixel has a range of 0-255. There are different modes provided by this module:\n", | ||
"\n", | ||
"1 ==> 1-bit pixels, black and white\n", | ||
"\n", | ||
"L ==> 8-bit pixels, Greyscale\n", | ||
"\n", | ||
"P ==> 8-bit pixels, mapped to any other mode using a color palette\n", | ||
"\n", | ||
"RGB ==> 3×8-bit pixels, true color\n", | ||
"\n", | ||
"RGBA ==> 4×8-bit pixels, true color with transparency mask" | ||
], | ||
"metadata": { | ||
"id": "nzsrfm_alTTU" | ||
} | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"source": [ | ||
"img.mode" | ||
], | ||
"metadata": { | ||
"colab": { | ||
"base_uri": "https://localhost:8080/", | ||
"height": 36 | ||
}, | ||
"id": "270Dia4njPlJ", | ||
"outputId": "92bd14a7-82d4-4730-af51-e465749c6175" | ||
}, | ||
"execution_count": 6, | ||
"outputs": [ | ||
{ | ||
"output_type": "execute_result", | ||
"data": { | ||
"text/plain": [ | ||
"'P'" | ||
], | ||
"application/vnd.google.colaboratory.intrinsic+json": { | ||
"type": "string" | ||
} | ||
}, | ||
"metadata": {}, | ||
"execution_count": 6 | ||
} | ||
] | ||
} | ||
] | ||
} |
23 changes: 23 additions & 0 deletions
23
Image Processing/Reading-Image-Video/read_video_imutils.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
#This Python script shows how to use the imutils library to speed up frame reading | ||
|
||
#Import the necessary libraries | ||
import cv2 | ||
import time | ||
from imutils.video import WebcamVideoStream | ||
|
||
|
||
#Initialize the WebcamVideoStream object; src=0 refers to the webcam | ||
vs = WebcamVideoStream(src=0).start() | ||
|
||
while True: | ||
imutils_frame= vs.read() | ||
|
||
cv2.imshow("IMUTILS",imutils_frame) | ||
key = cv2.waitKey(1) | ||
if key == 27: #esc key stops the process | ||
break | ||
|
||
|
||
## When everything done, release the object and close all opened windows | ||
vs.stop() | ||
cv2.destroyAllWindows() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
#This Python script shows how to read a video using OpenCV | ||
|
||
#Import the necessary libraries | ||
import cv2 | ||
|
||
#Initialize the VideoCapture object | ||
cap = cv2.VideoCapture('assets/video.mp4') | ||
|
||
# Check if camera opened successfully | ||
if (cap.isOpened()== False): | ||
print("Error opening video") | ||
|
||
while cap.isOpened(): | ||
ret, frame = cap.read() | ||
if ret: | ||
# Display the resulting frame | ||
cv2.imshow('Video',frame) | ||
# Press Q on keyboard to exit (or) move to the next frame after 1 milliseconds | ||
if cv2.waitKey(1) & 0xFF == ord('q'): | ||
break | ||
else: | ||
break | ||
|
||
# When everything done, release the video capture object and close all opened windows | ||
cap.release() | ||
cv2.destroyAllWindows() | ||
|
22 changes: 22 additions & 0 deletions
22
Image Processing/Reading-Image-Video/read_webcam_opencv.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
#This Python script shows how to read a video using OpenCV | ||
|
||
#Import the necessary libraries | ||
import cv2 | ||
|
||
#Initialize the VideoCapture object | ||
cap = cv2.VideoCapture(0) | ||
|
||
# Check if camera opened successfully | ||
if (cap.isOpened()== False): | ||
print("Error opening video") | ||
|
||
while True: | ||
_, frame = cap.read() | ||
cv2.imshow('Video',frame) | ||
if cv2.waitKey(1) & 0xFF == ord('q'): | ||
break | ||
|
||
# When everything done, release the video capture object and close all opened windows | ||
cap.release() | ||
cv2.destroyAllWindows() | ||
|