本节代码使用的opencv-python 4.0.1,numpy 1.15.4 + mkl
使用图片为 Mjolnir_Round_Car_Magnet_300x300.jpg
代码如下:
import cv2 import numpy as np # img = cv2.imread('lightning.jpg',0) img = cv2.imread('Mjolnir.jpg',cv2.IMREAD_UNCHANGED) # img = cv2.pyrUp(img) img_gray = cv2.cvtColor(img.copy(), cv2.COLOR_BGR2GRAY) ret, re_img = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY) contours, hierarchy = cv2.findContours(re_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for c in contours: # # find bounding box coordinates # # 现计算出一个简单的边界框,c为图像轮廓findContours返回值 x, y, w, h = cv2.boundingRect(c) # 将轮廓信息转换成(x, y)坐标,并加上矩形的高度和宽度 # # print(cv2.boundingRect(c)) cv2.rectangle(img, (x,y), (x+w, y+h), (0, 255, 0), 2) # 画出矩形 # print(help(cv2.rectangle)) # # find minimum area # # 计算包围目标的最小矩形区域 # rect = cv2.minAreaRect(c) # # print(help(cv2.minAreaRect)) # # calculate coordinate of the minimum area rectangle # box = cv2.boxPoints(rect) # # print(help(cv2.boxPoints)) # # normalize coordinates to integers # box =np.int64(box) # # 注:OpenCV没有函数能直接从轮廓信息中计算出最小矩形顶点的坐标。所以需要计算出最小矩形区域, # # 然后计算这个矩形的顶点。由于计算出来的顶点坐标是浮点型,但是所得像素的坐标值是整数(不能获取像素的一部分), # # 所以需要做一个转换 # # draw contours # cv2.drawContours(img, [box], 0, (0, 0, 255), 3) # 画出该矩形 # calculate center and radius of minimum enclosing circle # 会返回一个二元组, # 第一个元素为圆心的坐标组成的元组,第二个元素为圆的半径值。 # (x, y), radius = cv2.minEnclosingCircle(c) # # 转为整数 cast to integers # center = (int(x), int(y)) # radius = int(radius) # # 绘圆 draw the circle # img = cv2.circle(img, center, radius, (0, 255, 0), thickness=2,lineType=8,shift=6) # print(help(cv2.circle)) cv2.drawContours(img, contours, -1, (255, 0, 0), 1) cv2.imshow("contours", img) cv2.waitKey() cv2.destroyAllWindows()
运行如下
该部分代码与
OpenCV 学习笔记03 boundingRect、minAreaRect、minEnclosingCircle、boxPoints、int0、circle、rectangle函数的用法
中最后一部分全代码分析内容相同。