opencv(Python/c++):轮廓检测(边界框、矩形区域,圆区域,凸轮廓,多边形算法approxPloyDP)

Python版

  • 找到正方形轮廓
import cv2
import numpy as np

img=np.zeros((200,200),dtype=np.uint8)
img[50:150,50:150]=255

ret,thresh=cv2.threshold(img,127,255,0)#threshold阈值
image,contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

color=cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
img=cv2.drawContours(color,contours,-1,(0,255,0),2)
cv2.imshow('contours',color)
cv2.waitKey()
cv2.destroyAllWindows()

效果图:
在这里插入图片描述

  • 找到不规则形状轮廓
    不过我发现如果背景是纯白色的,会识别失败,所以要求背景是黑色的!!(所以在实际识别的时候可能需要转变一些东西

原图
在这里插入图片描述在这里插入图片描述

import cv2
import numpy as np

img=cv2.pyrDown(cv2.imread('hammer.jpeg',cv2.IMREAD_UNCHANGED))#图像金字塔

ret,thresh=cv2.threshold(cv2.cvtColor(img.copy(),cv2.COLOR_BGR2GRAY),127,255,cv2.THRESH_BINARY)

image,contours,hier=cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)


for c in contours:
    #找到包围盒的坐标系
    x,y,w,h=cv2.boundingRect(c)
    cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),3)#绿色

    #找到最小区域
    rect=cv2.minAreaRect(c)

    #计算最小区域矩形的坐标
    box=cv2.boxPoints(rect)

    #归一坐标值到整型int
    box=np.int0(box)
    #画轮廓
    cv2.drawContours(img,[box],0,(0,0,255),3)#此处红色0表示绘制轮廓数组里指定的轮廓

    #计算封闭圆的半径和中心点
    (x,y),radius=cv2.minEnclosingCircle(c)

    #变成整形int
    center=(int(x),int(y))
    radius=int(radius)

    #画圆
    img=cv2.circle(img,center,radius,(0,255,255),3)#黄色

    cv2.drawContours(img,contours,-1,(255,0,0),3)#蓝色-1表示绘制所有轮廓
    cv2.imwrite('contourshammer.jpeg',img)
    cv2.imshow('contours',img)
cv2.waitKey()
cv2.destroyAllWindows()

效果图
在这里插入图片描述在这里插入图片描述

  • 凸函数
    (在之前的代码上添加)
    cnt=contours[0]
    epsilon=0.01*cv2.arcLength(cnt,True)
    approx=cv2.approxPolyDP(cnt,epsilon,True)#计算近似的多边形框
    hull=cv2.convexHull(cnt)#计算凸形状

c++版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值