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 # 载入并显示图片 img =
cv2.imread('./circular.png') # 灰度化 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
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) # 霍夫变换圆检测 circles =
cv2.HoughCircles(canny, cv2.HOUGH_GRADIENT, 1, 100, param1=50, param2=30,

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(): img =
cv2.imread("ellipse.png", 3) 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()