基于OpenCV的实战:轮廓检测(附代码解析)
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
cx = int(M ['m10'] / M ['m00'])
cy = int(M ['m01'] / M ['m00'])
获得质心点后,此质心点将表示对象这样就可以为与质心相对应的对象放置一个边界框。本次实验我们将使用橙色作为对象,首先我们需要安装打包的OpenCV和numpy软件包。
import cv2
import numpy as np
插入图片使用“ cv2.imread()”:
#Read Pictures
img = cv2.imread('jeruk.png')
然后将RGB转换为HSV并创建黄色(橙色为右黄色)颜色分割:
#Convert RGB to HSV
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
#Range of yellow color segmentation / classification
lower = np.array([20,100,100], dtype=np.uint8)
upper = np.array([40,255,255], dtype=np.uint8)
mask = cv2.inRange(hsv, lower, upper)
kernel = np.ones((25,25),np.uint8)
进行对象像素的增厚,然后减小尺寸,以使对象像素彼此不靠近:
# Thicken object pixels
dilation = cv2.dilate(mask,kernel,iterations = 1)
# Minimized the object pixels so they're not stick together
erosion = cv2.erode(img,kernel,iterations = 1)
找到橙色的轮廓和阵列:
#Find Contours
contours, hierarchy = cv2.findContours(dilation,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#Array Contours
contour = []
然后将原始图像复制到“ resultImg”变量:
#copy the original image to "resultImg"
resultImg = (img).copy()
对轮廓进行迭代:
for i in range(len(contours)):
#amount contours to cnt variable
cnt = contours[i]
(x,y),radius = cv2.minEnclosingCircle(cnt)
center = (int(x),int(y))
if(int(radius) > 1):
contour.append(cnt)
resultImg = cv2.circle(resultImg,center,int(radius,(255,0,0),3)
最后一个阶段,显示检测结果的轮廓:
#displays results
cv2.imshow('image',resultImg)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果:
根据前面显示的橙色检测结果,可以通过轮廓检测橙色,该轮廓由橙色对象上存在蓝色圆圈标记。
— — 完 — —
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
评论