# 对圆和椭圆进行边缘检测

PS：在opencv中经常使用cv2.findContours()函数来查找检测物体的轮廓

``````"""
-*- coding: utf-8 -*-
author： Hao Hu
@date   2021/12/3 8:00 AM
"""
import math

import cv2
import numpy as np
import matplotlib.pyplot as plt

def circular_detect():
"""霍夫变换圆检测"""
import cv2
# 载入并显示图片
# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
print(img.shape)
ret, thresh1 = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY)
cv2.imshow('thresh1', thresh1)
canny = cv2.Canny(thresh1, 40, 80)
cv2.imshow('Canny', canny)

canny = cv2.blur(canny, (3, 3))
cv2.imshow('blur', canny)

# 霍夫变换圆检测
# 输出返回值，方便查看类型
print('定义了一个三维数组（x,y,r）',circles)
# 输出检测到圆的个数
print(len(circles[0]))
# 根据检测到圆的信息，画出每一个圆
for circle in circles[0]:
if (circle[2] >= 100):
continue
# 圆的基本信息
print('半径为',circle[2])
# 坐标行列
x = int(circle[0])
y = int(circle[1])
# 半径
r = int(circle[2])
# 在原图用指定颜色标记出圆的位置
img = cv2.circle(img, (x, y), r, (0, 0, 255), -1)
# 显示新图像
cv2.imshow('circular_detection', img)

def Ellipse_feature_extraction2():
imgray = cv2.Canny(img, 600, 100, 3)  # Canny边缘检测，参数可更改
ret, thresh = cv2.threshold(imgray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  # contours为轮廓集，可以计算轮廓的长度、面积等
for cnt in contours:
if len(cnt) > 50:
S1 = cv2.contourArea(cnt)
ell = cv2.fitEllipse(cnt)
S2 = math.pi * ell[1][0] * ell[1][1]
if (S1 / S2) > 0.2:  # 面积比例，可以更改，根据数据集。。。
img = cv2.ellipse(img, ell, (0, 255, 0), 2)
#print(str(S1) + "    " + str(S2) + "   " + str(ell[0][0]) + "   " + str(ell[0][1]))
print(contours[0][0][0],contours[-1][-1][-1])
# 这是椭圆相隔最远的点
x = (contours[0][0][0][0] + contours[-1][-1][-1][0])/2
y = (contours[0][0][0][1] + contours[-1][-1][-1][1])/2
print('椭圆圆心',x,y)
r = math.sqrt((x-contours[0][0][0][0])*(x-contours[0][0][0][0])+(y-contours[0][0][0][1])*(y-contours[0][0][0][1]))
print('椭圆半径',r)
cv2.imshow("0", img)

if __name__ == "__main__":
# line_detect_possible_demo()
# circular_detect()
Ellipse_feature_extraction2()
cv2.waitKey(0)
cv2.destroyAllWindows()``````

THE END

)">