图片一般处理
src = cv2.imread(image_file, cv2.IMREAD_COLOR)
img_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) # 转换为灰度图
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10))
eroded = cv2.erode(img_gray, kernel) # 腐蚀图像
dilated = cv2.dilate(eroded, kernel) # 膨胀图像
blur = cv2.blur(dilated, (13, 13))
# blur = cv2.medianBlur(binary, 5) # 中值滤波
# blur = cv2.GaussianBlur(img_gray, (5, 5), 0) # 高斯滤波
binary = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
binary = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] # OTSU二值化
_, contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) #找轮廓
maxArea = 0
# 挨个检查看那个轮廓面积最大
for i in range(len(contours)):
if cv2.contourArea(contours[i]) > cv2.contourArea(contours[maxArea]):
maxArea = i
hull = cv2.convexHull(contours[maxArea]) # 计算凸包
cv2.namedWindow("image", cv2.WINDOW_NORMAL)
cv2.resizeWindow("image", 1000, 1000)
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
画图
会改变src
坐标 (x,y)
cv2.circle(src, tuple(box[i]), color=(0, 255, 255), radius=20, thickness=-1) # thickness负数 填充
cv2.putText(img_orgin, f'{category} {confidence}', (x0, y0), cv2.FONT_HERSHEY_SIMPLEX, fontScale=0.8, color=(0, 255, 255),thickness=3)
cv2.rectangle(src, (x0, y0), (x1, y1), (255, 0, 0), thickness=5)
Contours
_, contours, hierarchy = cv2.findContours(binary, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
cv2.contourArea(contours[i]) # 获取当前轮廓的面积
cv2.drawContours(img, contours, -1, (0, 0, 255), 3) # 绘制轮廓 contours.shape=(n, 64, 1, 2) # 改变src
# 第二个参数表示轮廓的检索模式,有四种(本文介绍的都是新的cv2接口):
# cv2.RETR_EXTERNAL 表示只检测外轮廓
# cv2.RETR_LIST 检测的轮廓不建立等级关系
# cv2.RETR_CCOMP 建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
# cv2.RETR_TREE 建立一个等级树结构的轮廓。
#
# 第三个参数method为轮廓的近似办法
# cv2.CHAIN_APPROX_NONE 存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
# cv2.CHAIN_APPROX_SIMPLE 压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
# cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS 使用teh-Chinl chain 近似算法
rect = cv2.minAreaRect(contours[maxArea]) # 得到最小外接矩形的(中心(x,y), (宽,高), 旋转角度)
box = cv2.boxPoints(rect) # 获取四个顶点坐标
box = np.int32(box)
flag = cv2.pointPolygonTest(contours[i], test_point, False) # 检测点是否在轮廓内 test_point为tuple类型,返回1为在内 0为在轮廓上 -1为在外
腐蚀膨胀
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10))
# 矩形:MORPH_RECT
# 交叉形:MORPH_CROSS
# 椭圆形:MORPH_ELLIPSE
eroded = cv2.erode(img_gray, kernel, iterations=4) # 腐蚀图像 iterations次数
dilated = cv2.dilate(eroded, kernel, iterations=4) # 膨胀图像
添加滑块 实现参数调节 更新显示
def MyThreshold(th):
binary = cv2.threshold(img_gray, th, 255, cv2.THRESH_BINARY)[1]
cv2.imshow('image', binary)
cv2.namedWindow("image", 0)
cv2.resizeWindow("image", 800, 800)
cv2.createTrackbar('threshold', 'image', lowThreshold, max_lowThreshold, MyThreshold)
# cv2.imshow('image', binary)
cv2.waitKey(0)