OpenCV-Python实战(14)——轮廓拟合

1、最小包围三角形 cv2.minEnclosingTriangle()

python 复制代码
area,triangle = cv2.minEnclosingTriangle(contours)

**area:**最小包围三角形面积。

**triangle:**最小包围三角形的坐标,[[[230 60]],[[ 39 123]],[[185 269]]]。

**contours:**轮廓。

python 复制代码
import cv2
import numpy as np

# 图像前处理
img = cv2.imread('m.png') # 原图
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  # 灰度图
ret,img_binary = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY) # 二值图
# 找轮廓
contours,hierarchy = cv2.findContours(img_binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
# 找最小包围三角形
area,triangle = cv2.minEnclosingTriangle(contours[0])
# 定位点坐标
triangle = np.int32(triangle)  # 这一步非常重要
print(triangle)
# 画轮廓
img1 = cv2.polylines(img.copy(),[triangle],True,(255,0,0),2)
cv2.imshow('img',img)
cv2.imshow('img1',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

2、包围矩形 cv2.boundingRect()

python 复制代码
x,y,w,h  = cv2.boundingRect(contours)

**x,y,w,h:**函数返回值(x,y,w,h)元组,x,y代表矩形的左上角点坐标;w,h代表矩形宽高。

**contours:**轮廓。

python 复制代码
import cv2
import numpy as np

# 图像前处理
img = cv2.imread('m.png') # 原图
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  # 灰度图
ret,img_binary = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY) # 二值图
# 找轮廓
contours,hierarchy = cv2.findContours(img_binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
# 找包围***
x,y,w,h  = cv2.boundingRect(contours[0])
# 画轮廓
img1 = cv2.rectangle(img.copy(),(x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow('img',img)
cv2.imshow('img1',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

3、最小包围矩形 cv2.minAreaRect()

复制代码
retval = cv2.minAreaRect(contours)

**retval:**函数返回值,((x,y),(w,h),angle),(x,y)矩形中心点坐标,(w,h)矩形的宽高,angle:旋转角度,正值为顺时针,负值为逆时针。

**contours:**轮廓。

复制代码
points = cv2.boxPoints(retval)

**points:**矩形四个顶点坐标。

retval:cv2.minAreaRect() 函数返回值。

python 复制代码
import cv2
import numpy as np

# 图像前处理
img = cv2.imread('m.png') # 原图
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  # 灰度图
ret,img_binary = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY) # 二值图
# 找轮廓
contours,hierarchy = cv2.findContours(img_binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
# 找最小包围矩形
box = cv2.minAreaRect(contours[0])
# 定位点坐标
points = cv2.boxPoints(box)
points = np.int32(points)
# 画轮廓
img1 = cv2.drawContours(img.copy(),[points],0,(255,0,0),2)
cv2.imshow('img',img)
cv2.imshow('img1',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

4、最小包围圆 cv2.minAreaRect()

python 复制代码
center,radius = cv2.minEnclosingCircle(contours)

center:圆心的下(x,y)坐标。

radins:圆的半径。

contours:轮廓。

python 复制代码
import cv2
import numpy as np

# 图像前处理
img = cv2.imread('fang.png') # 原图
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  # 灰度图
ret,img_binary = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY) # 二值图
# 找轮廓
contours,hierarchy = cv2.findContours(img_binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
# 找包围***
(x,y),radius = cv2.minEnclosingCircle(contours[0])
# 数据处理
center = (int(x),int(y))  # 这一步非常重要
radius = int(radius)
# 画轮廓
img1 = cv2.circle(img.copy(),center,radius,(255,0,0),2)
cv2.imshow('img',img)
cv2.imshow('img1',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

5、最优拟合椭圆cv2.minAreaRect()

python 复制代码
ellipse = cv2.fitEllipse(contours)

**ellipse:**函数返回值,((x,y),(a,b),angle)。(x,y)中心点坐标;(a,b)长短轴直径;angle旋转角度,正值为顺时针,负值为逆时针。

**contours:**轮廓。

python 复制代码
import cv2
import numpy as np

# 图像前处理
img = cv2.imread('juxing.png') # 原图
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  # 灰度图
ret,img_binary = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY) # 二值图
# 找轮廓
contours,hierarchy = cv2.findContours(img_binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
print(len(contours[0]))  # len(contours[0]) 必须大于 5 ,否则 ellipse = cv2.fitEllipse(contours[0])会报错
# 找包围***
ellipse = cv2.fitEllipse(contours[0])
# 画轮廓
img1 = cv2.ellipse(img.copy(),ellipse,(255,0,0),2)
cv2.imshow('img',img)
cv2.imshow('img1',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

6、近视多边形 cv2.approxPolyDP()

相关推荐
二川bro1 分钟前
字符串特性解析:Python不可变性引发的错误
android·开发语言·python
UI设计兰亭妙微3 分钟前
理性数据,温柔体验:北京兰亭妙微解码 Hydra Corps. 企业管理界面的 “松弛感设计”
大数据·人工智能·用户体验设计
慎独4137 分钟前
家家有:从单向支出到价值循环,绿色积分如何 重构商业逻辑?
大数据·人工智能
呆萌小新@渊洁10 分钟前
声纹模型全流程实践-开发(训练 - 微调 - 部署 - 调用)
linux·服务器·python·语音识别
Mxsoft61918 分钟前
DBSCAN孤立点检测救场!某次异常数据污染,精准过滤保模型精度!
人工智能
华东设计之美21 分钟前
muti-Agent+RAG+KnowledgeGraph构建智能问诊系统的可行性分析
人工智能·软件开发·rag·大模型应用·增强检索生成
光羽隹衡21 分钟前
sklearn实现一元线性回归——分析广告投入和销售额的关系
人工智能·线性回归·sklearn
Luhui Dev21 分钟前
幻觉不是 AI 的病,而是智能的宿命
人工智能
HyperAI超神经25 分钟前
活动回顾丨 北大/清华/Zilliz/MoonBit共话开源,覆盖视频生成/视觉理解/向量数据库/AI原生编程语言
人工智能·ai·开源·编程语言·向量数据库·视频生成·视觉理解
智元视界27 分钟前
AI情绪识别技术:发展、挑战与未来
人工智能·科技·数字化转型·产业升级