当前位置:网站首页>[opencv learning] [contour detection]
[opencv learning] [contour detection]
2022-07-02 12:52:00 【A sea of stars】
Today, learn the contour detection method
import cv2
import numpy as np
# Show the image , Encapsulate as a function
def cv_show_image(name, img):
cv2.imshow(name, img)
cv2.waitKey(0) # Waiting time , In milliseconds ,0 Represents any key termination
cv2.destroyAllWindows()
# Function of edge detection
# cv2.findContours(img, mode, method)
# img: The input image , For high accuracy , It is recommended to use binary image
# mode: RETR_EXTERNAL( Only the outer contour is detected )、
# RETR_LIST( Detect all contours and keep the results to a List in )
# RETR_CCOMP, Detect all contours , And wrap the results in two layers , The first layer is the external outline of each part , The second layer is the inner boundary of the cavity
# RETR_TREE, Detect all contours , And reconstruct the hierarchy of nested contours
# RETR_LIST From an explanatory point of view , This should be the simplest . It just extracts all the contours , Without creating any parent-child relationship .
# RETR_EXTERNAL If you choose this mode , Only the outermost outline will be returned , All sub contours are ignored .
# RETR_CCOMP In this mode, all contours will be returned and divided into two levels of organizational structure .
# RETR_TREE In this mode, all contours are returned , And create a complete list of organizational structures . It will even tell you who is Grandpa , Dad , son , Grandson, etc .
# methord: Method of contour detection
# CHAIN_APPROX_NONE: With freeman Chain code output outline ,
# CHAIN_APPROX_SIMPLE: Keep only the end part , That is, only the end points are saved for horizontal, vertical and inclined lines . Less and more concise data .
img = cv2.imread('images/contour.png') # Turn to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # Convert to binary image
cv_show_image('binary_src_img', threshold)
# contours, All contour information , It's a list structure
# hierarchy It's a hierarchy , It is also a structure that retains all results
contours, hierarchy = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
print(len(contours))
print(type(contours))
draw_img = img.copy() # Copy an image , Keep the original image
# -1 It means that all the outlines are drawn , The last two parameters are the color and thickness of the outline ,drawContours It will be modified in place on the input image
res = cv2.drawContours(draw_img, contours, contourIdx=-1, color=(0, 255, 0), thickness=1)
cv_show_image('draw_contours_img', res)
# Features of contour
for i in range(len(contours)):
cont = contours[i]
print(' The first {} The area of the outline is {}, The circumference is {}', i, cv2.contourArea(cont), cv2.arcLength(cont, True)) # true Closed
# The outline is approximate
# There is a curve from point A point-to-point B, There is a connection AB, There is a point on the curve C,C The straight line AB Distance of d Maximum . If d <= A certain threshold , Then we can use AB Straight lines directly replace curves AB
# If d > A certain threshold , So you can't use another curve AB Straight line substituted , Then at this time, we have to put the curve AB Continue to divide into two sections , They are curves AC Sum curve CB. Try further
# Try further , See if this curve can be straight AC And straight lines CB Instead of . This is a divide and conquer / Recursively solve .
draw_img = img.copy()
for i in range(len(contours)):
cont = contours[i]
epsilon = 0.03 * cv2.arcLength(cont, True)
approx = cv2.approxPolyDP(cont, epsilon, True) # Find the approximation of the contour ,True It means closed
# Draw an approximate outline , Pass it on to drawContours The contour type of must be list
draw_img = cv2.drawContours(draw_img, [approx], contourIdx=-1, color=(0, 255, 0), thickness=1)
cv_show_image('approx_contours_img', draw_img)
# Outer rectangle
draw_img = img.copy()
for i in range(len(contours)):
cont = contours[i]
x,y,w,h = cv2.boundingRect(cont) # According to the contour, calculate the rectangular coordinates with the farthest circumscribed .
draw_img = cv2.rectangle(draw_img, pt1=(x,y), pt2=(x+w, y+h), color=(0, 255, 0), thickness=2) # Draw this rectangle , Will draw on the original picture
cv_show_image('rectangle_contours_img', draw_img)
# Circumcircle
draw_img = img.copy()
for i in range(len(contours)):
cont = contours[i]
(x,y), radius = cv2.minEnclosingCircle(cont) # Calculate the center and radius of the outermost circle according to the contour .
center = (int(x), int(y))
radius = int(radius)
draw_img = cv2.circle(draw_img, center=center, radius=radius, color=(0, 255, 0), thickness=2) # Draw this rectangle , Will draw on the original picture
cv_show_image('circle_contours_img', draw_img)
The original image is as follows :
Draw all the outlines :
The outline has internal outline and external outline , If you use mode = RETR_EXTERNAL Can only draw the outline
Draw all approximate outlines :
Draw the circumscribed largest rectangle of all contours
Draw the circumscribed maximum circle of all contours
边栏推荐
- 计数类DP AcWing 900. 整数划分
- Linear DP acwing 898 Number triangle
- Modular commonjs es module
- Js4day (DOM start: get DOM element content, modify element style, modify form element attributes, setinterval timer, carousel Map Case)
- moon
- Hash table acwing 841 String hash
- Mobile layout (flow layout)
- Day4 operator, self increasing, self decreasing, logical operator, bit operation, binary conversion decimal, ternary operator, package mechanism, document comment
- 线性DP AcWing 902. 最短编辑距离
- JSON serialization and parsing
猜你喜欢
Analog to digital converter (ADC) ade7913ariz is specially designed for three-phase energy metering applications
How can attribute mapping of entity classes be without it?
Tencent three sides: in the process of writing files, the process crashes, and will the file data be lost?
Redis transaction mechanism implementation process and principle, and use transaction mechanism to prevent inventory oversold
Rust search server, rust quick service finding tutorial
JS6day(DOM结点的查找、增加、删除。实例化时间,时间戳,时间戳的案例,重绘和回流)
8 examples of using date commands
Linear DP acwing 896 Longest ascending subsequence II
Day4 operator, self increasing, self decreasing, logical operator, bit operation, binary conversion decimal, ternary operator, package mechanism, document comment
JDBC 预防sql注入问题与解决方法[PreparedStatement]
随机推荐
About the loading of layer web spring layer components, the position of the layer is centered
线性DP AcWing 895. 最长上升子序列
spfa AcWing 851. spfa求最短路
Visual studio efficient and practical extension tools and plug-ins
Browser node event loop
获取文件版权信息
To bypass obregistercallbacks, you need to drive the signature method
FBX import under ue4/ue5 runtime
[ybtoj advanced training guidance] cross the river [BFS]
ArrayList与LinkedList效率的对比
js3day(数组操作,js冒泡排序,函数,调试窗口,作用域及作用域链,匿名函数,对象,Math对象)
Package management tools
BOM DOM
模数转换器(ADC) ADE7913ARIZ 专为三相电能计量应用而设计
Some sudden program ideas (modular processing)
Mongodb redis differences
Shutter encapsulated button
Js2day (also i++ and ++i, if statements, ternary operators, switch, while statements, for loop statements)
Rust search server, rust quick service finding tutorial
Do you know all the interface test interview questions?