import cv2
import numpy as np
#如果时灰度图读取的时候,将灰度转BGR
color_img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
# 加载图像
img = cv2.imread("image.jpg")
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 应用阈值处理创建二值图像
thresh = cv2.threshold(gray, cfg["thres_bus"][0], cfg["thres_bus"][1], cv2.THRESH_BINARY)[1]
# 查找二值图像中的轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 在原始图像上绘制轮廓
cv2.drawContours(img, contours, -1, (0, 255, 0), 2)
# 遍历轮廓并显示坐标
for contour in contours:
for point in contour:
x, y = point[0]
print(f"点坐标: ({x}, {y})")
# 获取图像尺寸
height, width = img.shape[:2]
# 遍历外轮廓并显示相对坐标
for contour in contours:
# 检查轮廓是否为外轮廓
if hierarchy[0][contour][3] == -1:
for point in contour:
x, y = point[0]
# 计算相对坐标
relative_x = x / width
relative_y = y / height
print(f"点坐标: ({relative_x}, {relative_y})")
# 打印轮廓信息
for contour in contours:
# 轮廓面积
area = cv2.contourArea(contour)
# 轮廓周长
perimeter = cv2.arcLength(contour, True)
# 轮廓近似
approx = cv2.approxPolyDP(contour, 0.01 * perimeter, True)
# 轮廓中心
M = cv2.moments(contour)
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
# 打印信息
print(f"轮廓面积: {area}")
print(f"轮廓周长: {perimeter}")
print(f"轮廓近似: {approx}")
print(f"轮廓中心: ({cX}, {cY})")
print("--------------------")
# 显示带有轮廓的图像
cv2.imshow("带有轮廓的图像", img)
cv2.waitKey(0)
cv2.findContours函数参数解释
cv2.findContours函数参数解释
cv2.findContours(image, mode, method, contours, hierarchy[, offset])
该函数用于在二值图像中查找轮廓,并返回轮廓列表和层次结构。
参数:
image: 输入图像,必须为单通道 8 位图像。
mode: 轮廓检索模式,可取值为以下之一:
cv2.RETR_EXTERNAL: 只检索最外层的轮廓。
cv2.RETR_LIST: 检索所有轮廓,并将其保存在一个单一列表中。
cv2.RETR_CCOMP: 检索所有轮廓,并将它们组织成两级层次结构。
cv2.RETR_TREE: 检索所有轮廓,并将它们组织成完整的树形层次结构。
method: 轮廓逼近方法,可取值为以下之一:
cv2.CHAIN_APPROX_NONE: 存储所有轮廓点。
cv2.CHAIN_APPROX_SIMPLE: 压缩水平、垂直和对角方向的元素,并只保留它们的端点。
cv2.CHAIN_APPROX_TC89_L1: 使用 Teh-Chin 链逼近算法。
cv2.CHAIN_APPROX_TC89_KCOS: 使用 Teh-Chin 链逼近算法,但使用 Kosinus 距离作为误差度量。
contours: 轮廓输出列表。
hierarchy: 轮廓层次结构输出列表。
offset: 轮廓坐标的偏移量,默认值为 (0, 0)。
返回值:
contours: 轮廓列表,每个轮廓都是一个点数组。
hierarchy: 轮廓层次结构列表,每个元素都是一个四元组,表示父轮廓、第一个子轮廓、下一个兄弟轮廓和前一个兄弟轮廓的索引。
与 cv2.findContours 函数上下关联的函数
与 cv2.findContours 函数上下关联的函数
除了 cv2.findContours 函数,OpenCV 还提供了一些与其上下关联的函数,用于图像轮廓分析和处理。这些函数可以分为以下几类:
1. 轮廓查找函数:
cv2.findContours:查找图像中的轮廓。
cv2.CHAIN_APPROX_SIMPLE:用于简化轮廓,只保留拐点。
cv2.CHAIN_APPROX_NONE:不简化轮廓,保留所有点。
cv2.RETR_EXTERNAL:只检索最外层的轮廓。
cv2.RETR_LIST:检索所有轮廓,包括嵌套的轮廓。
cv2.RETR_TREE:检索所有轮廓,并建立一个层次结构。
2. 轮廓属性计算函数:
cv2.contourArea:计算轮廓的面积。
cv2.arcLength:计算轮廓的长度。
cv2.boundingRect:计算轮廓的最小外接矩形。
cv2.minAreaRect:计算轮廓的最小面积矩形。
cv2.convexHull:计算轮廓的凸包。
cv2.approxPolyDP:对轮廓进行多边形逼近。
cv2.moments:计算轮廓的矩。
3. 轮廓绘制函数:
cv2.drawContours:在图像上绘制轮廓。
cv2.fillPoly:用颜色填充轮廓。
cv2.polylines:绘制轮廓的折线。
4. 其他相关函数:
cv2.matchShapes:比较两个轮廓的形状相似度。
cv2.pointPolygonTest:判断一个点是否在轮廓内。
cv2.findContours:查找图像中的轮廓。
这些函数可以组合使用,以完成各种图像轮廓分析和处理任务。例如,您可以使用 cv2.findContours 函数查找图像中的轮廓,然后使用 cv2.contourArea 函数计算每个轮廓的面积,最后使用 cv2.drawContours 函数在图像上绘制面积最大的轮廓。
凸多边形轮廓
轮廓是否为凸多边形包含哪些边形呢
总之,所有多边形都可以被认为是轮廓,只要它们满足多边形的定义。轮廓是否为凸多边形包含所有类型的多边形,包括凸多边形和凹多边形。
import cv2
import numpy as np
# 加载图像
img = cv2.imread("image.jpg")
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 应用阈值处理创建二值图像
thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)[1]
# 查找二值图像中的轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 遍历每个轮廓,判断是否是凸包,如果是则在原图上绘制
for contour in contours:
is_convex = cv2.isContourConvex(contour)
if is_convex:
# 计算轮廓的凸包
hull = cv2.convexHull(contour)
# 在原图上绘制凸包
cv2.drawContours(img, [hull], 0, (0, 255, 0), 2)
# 显示结果图像
cv2.imshow("Result", img)
cv2.waitKey(0)