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

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

area,triangle = cv2.minEnclosingTriangle(contours)

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

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

contours:轮廓。

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()

x,y,w,h  = cv2.boundingRect(contours)

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

contours:轮廓。

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() 函数返回值。

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()

center,radius = cv2.minEnclosingCircle(contours)

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

radins:圆的半径。

contours:轮廓。

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()

ellipse = cv2.fitEllipse(contours)

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

contours:轮廓。

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()

approx = cv2.approxPolyDP(curve=*,epsilon=*,closed=*)

approx:函数返回值,近视多边形轮廓。

curve:原始轮廓。

epsilon:原始轮廓与近视多边形最近的最大距离。

closed:是否为封闭轮廓,Ture/False。

import cv2
import numpy as np

# 图像前处理
img = cv2.imread('love.png')[::2,::2,:] # 原图1/(2*2)
cv2.imshow('img',img)
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])会报错
# 找包围***
approx1 = cv2.approxPolyDP(curve=contours[0],epsilon=3,closed=True)
approx2 = cv2.approxPolyDP(curve=contours[0],epsilon=9,closed=True)
# 画轮廓
epsilon_1 = cv2.polylines(img.copy(),[approx1],True,(255,0,0),2)
epsilon_2 = cv2.polylines(img.copy(),[approx2],True,(255,0,0),2)

cv2.imshow('epsilon_1',epsilon_1)
cv2.imshow('epsilon_2',epsilon_2)

cv2.waitKey(0)
cv2.destroyAllWindows()

### OpenCV Python包的功能对比 #### opencv-pythonopencv-python-headless 的区别 `opencv-python` 是完整的OpenCV库,包含了图形界面功能以及所有其他特性。此版本适合于开发环境,在其中可能需要显示图像窗口或视频流等功能[^1]。 相比之下, `opencv-python-headless` 则是一个精简版的OpenCV库,去除了依赖Qt或其他GUI框架的部分。这意味着它不提供任何可视化工具,比如创建窗口展示图片的能力。这种轻量级配置非常适合服务器端部署或是不需要用户交互的应用场景。 #### opencv-contrib-pythonopencv-contrib-python-headless 的特点 对于希望利用额外模块扩展核心功能集的情况,则可以选择安装带有contrib附加组件的版本——即`opencv-contrib-python` 或者其无头版本 `opencv-contrib-python-headless`. 这些贡献模块提供了实验性的算法和其他非官方维护但广泛使用的插件,增加了更多高级计算机视觉处理能力[^2]. 值得注意的是,“headless”变体同样移除了对桌面环境的支持,因此如果项目仅需运行在后台服务上而无需渲染UI元素的话,那么选用此类别下的软件包会更加高效合理[^3]. ```bash # 安装命令示例 pip install opencv-python # 基础版含GUI支持 pip install opencv-python-headless # 轻量化基础版不含GUI pip install opencv-contrib-python # 扩展版含GUI支持及额外模块 pip install opencv-contrib-python-headless # 轻量化扩展版不含GUI及额外模块 ``` 综上所述: | 特性/包名 | GUI 支持 | 额外模块 | | --- | --- | --- | | opencv-python | ✅ | ❌ | | opencv-python-headless | ❌ | ❌ | | opencv-contrib-python | ✅ | ✅ | | opencv-contrib-python-headless | ❌ | ✅ |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小码贾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值