OpenCV基本操作(五)

本文详细介绍了如何在PyCharm中使用OpenCV进行Canny边缘检测、轮廓搜索,包括最大轮廓识别和掩膜创建,以及如何计算图像矩以定位特定对象。
摘要由CSDN通过智能技术生成

前提:配置好OpenCV的PyCharm工程
1.Canny边缘检测

img_ori=cv2.imread("C:\\Users\\DELL\\Desktop\\img.jpg")#源图片的路径
img_gray=cv2.cvtColor(img_ori,cv2.COLOR_BGR2GRAY)#灰度化
edges = cv2.Canny(img_gray,200,250)#200-250是梯度不是灰度,是灰度的变化率
cv2.imshow('edges',edges)

2.搜索轮廓

img_ori=cv2.imread("C:\\Users\\DELL\\Desktop\\img.jpg")#源图片的路径
img_gray=cv2.cvtColor(img_ori,cv2.COLOR_BGR2GRAY)#灰度化
ret,thresh=cv2.threshold(img_gray,230,255,cv2.THRESH_BINARY_INV)#反二值化处理,反的是黑白,即黑变白白变黑
contours,hierachy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
#cv2.RETR_TREE是建立一个等级树结构的轮廓的轮廓模式;cv2.RETR_EXTERNAL只检测外轮廓;cv2.RETR_LIST不建立等级关系;cv2.RETR_CCOMP建立两个等级的轮廓;
#CHAIN_APPROX_NONE,如果检测矩形等规则外形可以输入对应的其他函数,就只测几个点来确定,如矩形只测四个角,这里为none
#contours是返回的轮廓
#hierarchy是每条轮廓对应的属性
result=cv2.drawContours(img_ori.copy(),contours,-1,(0,0,255),2)
#画出轮廓
#用img_ori.copy(),别用原图,因为边界在原图上画可能会影响后续对原图的处理
#contours是所有的边界,-1是画出所有边界,如果改成1就画第一个,改成2就画第二个
#(0,0,255)是画边界线用的颜色(b、g、r)
#2是用多粗的线去画边界
cv2.imshow('result',result)

3.搜索最大轮廓

img_ori=cv2.imread("C:\\Users\\DELL\\Desktop\\img.jpg")#源图片的路径
img_gray=cv2.cvtColor(img_ori,cv2.COLOR_BGR2GRAY)#灰度化
ret,thresh=cv2.threshold(img_gray,230,255,cv2.THRESH_BINARY_INV)#反二值化处理,反的是黑白,即黑变白白变黑
contours,hierachy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
#cv2.RETR_TREE是建立一个等级树结构的轮廓的轮廓模式;cv2.RETR_EXTERNAL只检测外轮廓;cv2.RETR_LIST不建立等级关系;cv2.RETR_CCOMP建立两个等级的轮廓;
#CHAIN_APPROX_NONE,如果检测矩形等规则外形可以输入对应的其他函数,就只测几个点来确定,如矩形只测四个角,这里为none
#contours是返回的轮廓
#hierarchy是每条轮廓对应的属性
target_contours=[]
for index,contour in enumerate(contours):
    Area=cv2.contourArea(contour)
    Hull=cv2.convexHull(contour,False)
    HullArea=cv2.contourArea(Hull)
    if Area >= 300 and HullArea>= 300:
        target_contours.append(contour)
print(len(target_contours))
result=cv2.drawContours(img_ori.copy(),target_contours,-1,(0,0,255),2)
cv2.imshow('result',result)

4.创建掩膜

#创建掩膜
mask=np.zeros([img_ori.shape[0],img_ori.shape[1]],dtype=np.uint8)
mask=cv2.drawContours(mask,target_contours,-1,255,cv2.FILLED)
cv2.imshow('mask',mask)
cv2.waitKey(1000)
cv2.destroyAllWindows()
img_light=cv2.bitwise_and(img_ori.copy(),img_ori.copy(),mask=mask)
cv2.imshow('img_light',img_light)
cv2.waitKey(1000)
cv2.destroyAllWindows()

5.图像矩的计算

#图像矩的计算
M=cv2.moments(target_contours[0])
cX =int(M['m10']/M['m00'])
cY =int(M['m01']/M['m00'])
cv2.circle(img_light,(cX,cY),7,(255,0,0),5)
cv2.imshow('img_light',img_light)
cv2.waitKey(1000)
cv2.destroyAllWindows()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值