1 Star 0 Fork 6

mick/opencv

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
_7轮廓检测.py 6.36 KB
一键复制 编辑 原始数据 按行查看 历史
18151521911@163.com 提交于 2022-02-26 18:26 . Initial commit
# -*- coding: utf-8 -*-
"""
Created on Wed Jul 18 09:31:23 2018
@author: lenovo
"""
import cv2
import numpy as np
from scipy import ndimage
'''
1.轮廓检测
'''
#加载图像img
img = cv2.imread('./image/img6.jpg',cv2.IMREAD_COLOR)
#cv2.imshow('img',img)
#转换为灰色gray_img
gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#cv2.imshow('gray_img',gray_img)
#对图像二值化处理 输入图像必须为单通道8位或32位浮点型
ret,thresh = cv2.threshold(gray_img,127,255,0)
#cv2.imshow('thresh',thresh)
#寻找图像轮廓 返回修改后的图像 图像的轮廓 以及它们的层次
image,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#cv2.imshow('image',image)
print('contours[0]:',contours[0])
print('len(contours):',len(contours))
print('hierarchy.shape:',hierarchy.shape)
print('hierarchy[0]:',hierarchy[0])
#在原图img上绘制轮廓contours中的所有轮廓(-1)
img = cv2.drawContours(img,contours,0,(0,255,0),2)
#cv2.imshow('contours',img)
'''
2.根据轮廓计算最小边界框 最小矩形区域和最小闭圆的轮廓
'''
img = cv2.pyrDown(cv2.imread('./image/img16.jpg',cv2.IMREAD_UNCHANGED))
#转换为灰色gray_img
gray_img = cv2.cvtColor(img.copy(),cv2.COLOR_BGR2GRAY)
#对图像二值化处理 输入图像必须为单通道8位或32位浮点型
ret,thresh = cv2.threshold(gray_img,127,255,cv2.THRESH_BINARY)
#寻找最外面的图像轮廓 返回修改后的图像 图像的轮廓 以及它们的层次
image,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
print(type(contours))
print(type(contours[0]))
print(len(contours))
#遍历每一个轮廓,根据每一个轮廓,计算各种边界框
for c in contours:
print('开始')
#找到边界框的坐标
x,y,w,h = cv2.boundingRect(c)
#在img图像上,绘制矩形 线条颜色为green 线宽为2
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
#找到最小区域 返回结果是一个元祖 矩形中点坐标,宽度和高度,旋转角度(旋转角度是水平轴x轴
#逆时针旋转,与碰到的巨响的第一条边的夹角,并且这个边的边长是width,另一条边的边长是height,逆时针旋转角度范围为(-90,0])
rect = cv2.minAreaRect(c)
print('rect',type(rect),rect)
#计算最小矩形的坐标 返回一个numpy.array 形状4x4 对应矩形四个点
box = cv2.boxPoints(rect)
print('box',type(box),box)
#坐标转换为整数
box = np.int0(box)
#在img图像上绘制轮廓最小矩形 blue
cv2.drawContours(img,[box],0,(255,0,0),3)
#计算闭圆中心店和和半径
(x,y),radius = cv2.minEnclosingCircle(c)
#转换为整型
center = (int(x),int(y))
radius = int(radius)
#在原图上绘制闭圆
img = cv2.circle(img,center,radius,(0,255,0),2)
#在源图像中绘制所有轮廓
cv2.drawContours(img,contours,-1,(0,0,255),2)
#显示绘制边界框和轮廓之后的图像
#cv2.imshow('contours',img)
'''
3、凸轮廓和Douglas Peucker算法
'''
img = cv2.imread('./image/img18.jpg',cv2.IMREAD_COLOR)
img = cv2.resize(img,None,fx=0.6,fy=0.6,interpolation=cv2.INTER_CUBIC)
#创建一个空白图像,用来绘制轮廓
canvas = np.zeros(img.shape,np.uint8)
#转换为灰色gray_img
gray_img = cv2.cvtColor(img.copy(),cv2.COLOR_BGR2GRAY)
#进行均值滤波,去除一些噪声
kernel = np.ones((3,3),np.float32)/9
gray_img = cv2.filter2D(gray_img,-1,kernel)
#cv2.imshow('gray_img',gray_img)
#对图像二值化处理 输入图像必须为单通道8位或32位浮点型 像素>125 设置为0(黑) 否则设置为255(白)
ret,thresh = cv2.threshold(gray_img,125,255,cv2.THRESH_BINARY_INV)
#cv2.imshow('thresh',thresh)
#寻找图像轮廓 返回修改后的图像 图像的轮廓 以及它们的层次
image,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#获取最大的一个轮廓
cnt = contours[0]
max_area = cv2.contourArea(cnt)
#对每一个轮廓进行遍历
for cont in contours:
if cv2.contourArea(cont) > max_area:
cnt = cont
max_area = cv2.contourArea(cont)
print('max_area',max_area)
'''计算最大轮廓的多边形框'''
#arcLength获取轮廓的周长
epsilon = 0.01*cv2.arcLength(cnt,True)
#计算矩形的多边形框
approx = cv2.approxPolyDP(cnt,epsilon,True)
#从轮廓信息中计算得到凸形状
hull = cv2.convexHull(cnt)
print('contours',len(contours),type(contours))
print('cnt.shape',cnt.shape,type(cnt))
print('approx.shape',approx.shape,type(approx))
print('hull.shape',hull.shape,type(hull))
#在源图像中绘制所有轮廓 传入的死一个list
cv2.drawContours(img,contours,-1,(0,255,0),2) #GREEN 绘制所有的轮廓
cv2.drawContours(canvas,[cnt],-1,(0,255,0),2) #GREEN 绘制最大的轮廓
cv2.drawContours(canvas,[approx],-1,(0,0,255),2) #RED 绘制最大轮廓对应的多边形框
cv2.drawContours(canvas,[hull],-1,(255,0,0),2) #RED 绘制最大轮廓对应的凸包
cv2.imshow('img',img)
cv2.imshow('ALL',canvas)
'''
4.直线检测
'''
img = cv2.imread('./image/img19.jpg')
#转换为灰度图片
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#中值滤波
gray = cv2.medianBlur(gray,ksize=3)
#边缘检测
edges = cv2.Canny(gray,50,100)
minLineLength = 200
maxLineGap = 5
#直线检测
lines = cv2.HoughLinesP(edges,1,np.pi/180,100, minLineLength,maxLineGap)
print('len(lines)',len(lines),type(lines))
print('lines[0].shape',lines[0].shape)
for i in range(len(lines)):
for x1,y1,x2,y2 in lines[i]:
cv2.line(img, (x1,y1), (x2,y2),(i*20,100+i*20,255),2)
cv2. imshow("edges", edges)
cv2. imshow("lines", img)
'''
5、圆检测
'''
img = cv2.imread('./image/img20.jpg')
#缩小
img = cv2.resize(img,None,fx=0.5,fy=0.5,interpolation=cv2.INTER_CUBIC)
#转换为灰度图片
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#中值滤波
gray = cv2.medianBlur(gray,ksize=3)
#圆检测
circles = cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,1,120,param1=100,param2=30,minRadius=0,maxRadius=0)
print('circles',type(circles),circles.shape) #circles <class 'numpy.ndarray'> (1, 3, 3)
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
#绘制圆 (i[0],i[1])为圆心,i[2]为半径
cv2.circle(img,(i[0],i[1]),i[2],(0,255,0),2)
#绘制圆心
cv2.circle(img,(i[0],i[1]),2,(255,0,0),3)
cv2.imshow('circles',img)
cv2.waitKey()
cv2.destroyAllWindows()
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/mick2019/opencv.git
git@gitee.com:mick2019/opencv.git
mick2019
opencv
opencv
master

搜索帮助

0d507c66 1850385 C8b1a773 1850385