How to check if an image contour is convex or not in OpenCV Python?
OpenCV Python is a versatile tool used for computer vision tasks such as image and video processing. An important aspect of image processing is the ability to identify the contours in an image. In this article, we will discuss the steps to check if an image contour is convex or not in Python using OpenCV library.
Understanding Contours in OpenCV
Contours are simply the boundaries of objects present in an image. In OpenCV, contours are a set of points representing the boundary of the object. Contours can be used for object detection, shape analysis, and classification.
In OpenCV, a contour is represented as a list of points. Each point in the list corresponds to a pixel in the image. The contours can be stored in memory as either a list of points or as a hierarchy of contours.
Convex and Concave Contours
In mathematical terms, convex and concave contours are defined as follows:
- A convex contour is a contour where any line segment joining two points on it lies entirely inside or on the contour.
- A concave contour is a contour where there exists at least one line segment joining two points in the contour, which lies outside the contour.
In simpler terms, a convex contour is a contour that does not have any inward curves, while a concave contour has inward curves.
Checking for Convexity
To check if a contour is convex or not, we can make use of the cv2.isContourConvex() function present in OpenCV. This function takes a contour as an input and returns a boolean value indicating whether the contour is convex or not.
Here’s the code for checking convexity of a contour:
import cv2
import numpy as np
# Load an image
img = cv2.imread('image.jpg')
# Convert the image to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Get the contours in the image
_, contours, _ = cv2.findContours(gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# Iterate through each contour
for contour in contours:
# Check if the contour is convex
if cv2.isContourConvex(contour):
print('Convex')
else:
print('Concave')
In the above code, we first load an image and convert it to grayscale. We then get the contours in the image using the cv2.findContours() function. We iterate through each contour and check if it is convex using the cv2.isContourConvex() function. If the contour is convex, we print ‘Convex’, else we print ‘Concave’.
Practical Example
Let’s take a practical example to understand how to check for convexity of a contour. We will load an image of a triangle and check if its contour is convex or not.
import cv2
import numpy as np
# Load the image
img = cv2.imread('triangle.jpg')
# Convert the image to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Apply binary thresholding
_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# Get the contours in the image
_, contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# Draw the contour on the image
cv2.drawContours(img, contours, 0, (0, 255, 0), 2)
# Check if the contour is convex or not
if cv2.isContourConvex(contours[0]):
print('Convex')
else:
print('Concave')
# Display the image
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
In the above code, we load an image of a triangle and convert it to grayscale. We apply binary thresholding to the image to obtain a binary image. We then get the contours in the binary image using the cv2.findContours() function. We draw the contour on the image using the cv2.drawContours() function.
Finally, we check if the contour is convex or not using the cv2.isContourConvex() function. In this case, the triangle is a convex shape, and therefore the output would be ‘Convex’.
Conclusion
Checking for convexity of a contour is an essential aspect of image processing in OpenCV. The cv2.isContourConvex() function available in OpenCV enables us to quickly check if a contour is convex or not. In this article, we discussed the steps to check for convexity of a contour using Python OpenCV and provided some sample code to help get you started on your own projects.