首页 > 编程语言 >Python OpenCv对规则物体进行实时检测

Python OpenCv对规则物体进行实时检测

时间:2024-07-08 17:10:09浏览次数:12  
标签:RETR area Python 检测 物体 cv2 实时 OpenCv 轮廓

前言

很多情况需要对物体进行检测,常规的方法也有很多种。但是检测出来的边缘一般都是非常多,结果也是非常杂乱的,显然这种结果不是我们想要的。

如果颜色相较于背景非常鲜艳的可以调节hsv阈值再进行检测,如果是一直在运动的物体可以通过帧差法进行物体检测,还有很多高深的算法也可以进行物体检测。

但在这里我介绍一种最简单,也是最实用的方法——轮廓检测法。

轮廓检测法

轮廓检测也是图像处理中经常用到的。OpenCV-Python接口中使用cv2.findContours()函数来查找检测物体的轮廓。

contours, hierarchy = cv2.findContours(image,mode,method)

  • image:输入图像
  • mode:轮廓的模式。cv2.RETR_EXTERNAL只检测外轮廓;cv2.RETR_LIST检测的轮廓不建立等级关系;cv2.RETR_CCOMP建立两个等级的轮廓,上一层为外边界,内层为内孔的边界。如果内孔内还有连通物体,则这个物体的边界也在顶层;cv2.RETR_TREE建立一个等级树结构的轮廓。
  • method:轮廓的近似方法。cv2.CHAIN_APPROX_NOME存储所有的轮廓点,相邻的两个点的像素位置差不超过1;cv2.CHAIN_APPROX_SIMPLE压缩水平方向、垂直方向、对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需要4个点来保存轮廓信息;cv2.CHAIN_APPROX_TC89_L1,cv2.CV_CHAIN_APPROX_TC89_KCOS
  • contours:返回的轮廓
  • hierarchy:每条轮廓对应的属性

注意:cv2.findContours()函数接受的参数为二值图,即黑白的(不是灰度图),所以读取的图像要先转成灰度的,再转成二值图。

轮廓的绘制

cv2.drawContours(image, contours, contourIdx, color, thickness=None, lineType=None, hierarchy=None, maxLevel=None, offset=None)
  • 第一个参数是指明在哪幅图像上绘制轮廓;

  • 第二个参数是轮廓本身,在Python中是一个list。

  • 第三个参数指定绘制轮廓list中的哪条轮廓,如果是-1,则绘制其中的所有轮廓。后面的参数很简单。其中color:线的颜色(0,0,255)表示红色;(255,0,0)表示蓝色;thickness表明轮廓线的宽度,如果是-1(cv2.FILLED),则为填充模式。

最小外接矩形

x, y, w, h = cv2.boundingRect(i)

x, y 分别是轮廓的左上点坐标,w, h分别是轮廓的宽和高。

我们获取了物体的轮廓可以利用轮廓的特性进行筛选轮廓,例如我的识别目标是一个圆形,那么它的外接矩形一定是个近似正方形的矩形。

所以可以如下述代码进行筛选:

if w - 25 < h < w + 25:
	print("轮廓面积:", area)
    cv2.rectangle(img,  (x, y + h), (x + w, y), (0, 0, 255))
	break

获取轮廓的面积

area = cv2.contourArea(i)

area则为轮廓的面积

测试效果

最终代码

对下述代码修改筛选条件达到效果最佳。

# 轮廓提取
import cv2
# 转二进制图像
def ToBinray():
    global imgray, binary
    # 1、灰度图
    imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # cv2.imshow('imgray', imgray)
    # 2、二进制图像
    ret, binary = cv2.threshold(imgray, 70, 255, 0)
    # cv2.imshow('binary', binary)
 
# 提取轮廓
def GetGontours():
    contours, _ = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
    # 获取轮廓面积
    for i in contours:
        area = cv2.contourArea(i)
        # 筛选轮廓面积
        if area < 800 or area > 2000: continue
        x, y, w, h = cv2.boundingRect(i)
        if w - 25 < h < w + 25:
            print("轮廓面积:", area)
            cv2.rectangle(img,  (x, y + h), (x + w, y), (0, 0, 255))
            break
    
    # 打开摄像头
cap = cv2.VideoCapture(0)
# 检查摄像头是否成功打开
if not cap.isOpened():
    print("Error: Could not open camera.")
    exit()
 
while True:
    # 读取视频帧
    ret, img = cap.read()
    # 检查是否成功读取帧
    if not ret:
        print("Error: Could not read frame.")
        break
    
    ToBinray()
    GetGontours()
    # 显示当前帧
    cv2.imshow('Camera', img)
    # 按下Esc键退出循环
    if cv2.waitKey(1) == 27:
        break
# 释放摄像头并关闭窗口
cap.release()
cv2.destroyAllWindows()

标签:RETR,area,Python,检测,物体,cv2,实时,OpenCv,轮廓
From: https://www.cnblogs.com/kevenduan/p/18290342

相关文章

  • python logger 使用记录
    1.简单使用importlogging#基本设置#如果没有设置,则可以使用该设置用于显示logging.basicConfig(level='DEBUG',datefmt='%Y-%m-%d%H:%M:%S',format='%(asctime)s[%(name)s]%(levelname)s%(message)s')logger=logging.getLogger(......
  • 【融合ChatGPT等AI模型】Python-GEE遥感云大数据分析、管理与可视化及多领域案例实践
    随着航空、航天、近地空间遥感平台的持续发展,遥感技术近年来取得显著进步。遥感数据的空间、时间、光谱分辨率及数据量均大幅提升,呈现出大数据特征。这为相关研究带来了新机遇,但同时也带来巨大挑战。传统的工作站和服务器已无法满足大区域、多尺度海量遥感数据处理需求。为解......
  • Python热门面试题三
    Python中的pass语句有什么作用?在Python中,pass语句是一个空操作(NOP,nooperation);它什么也不做,只作为一个占位符。其主要作用是在语法上需要语句的地方,但程序执行时又不需要执行任何操作时使用。pass语句可以用在函数的定义中、条件语句的分支里、循环结构中或者任何需要语......
  • 利用Python进行数据分析PDF下载经典数据分享推荐
    本书由Pythonpandas项目创始人WesMcKinney亲笔撰写,详细介绍利用Python进行操作、处理、清洗和规整数据等方面的具体细节和基本要点。第2版针对Python3.6进行全面修订和更新,涵盖新版的pandas、NumPy、IPython和Jupyter,并增加大量实际案例,可以帮助你高效解决一系列数据分析问题。......
  • python+anaconda环境搭建
    一:下载安装1、安装anacondaanaconda官网2、安装pycharmpycharm官网二:配置环境1、找到anaconda安装位置在系统环境变量中添加如下信息打开DOS框,输入conda--version,出现如下信息说明配置成功三:创建虚拟环境1、打开DOS框;输入(name表示自己虚拟环境的名称;version表示......
  • python爬虫——爬取12306火车票信息
    前提准备:requests、pandas、threading等第三方库的导入(未下载的先进行下载)导入库代码fromthreadingimportThread#多线程库importrequestsimportpandasaspdimportjson#json库完整步骤1.在网页找到需要的数据(1)任意输入出发地——目的地——日期,点击......
  • python:使用matplotlib库绘制图像(一)
    作者是跟着http://t.csdnimg.cn/4fVW0学习的,matplotlib系列文章是http://t.csdnimg.cn/4fVW0的自己学习过程中整理的详细说明版本,对小白更友好哦!一、Matplotlib图像基础1.1 基本绘图实例:sin、cos函数图代码详解:1.frompylabimport*:导入pylab库中所有函数和变量。pyla......
  • 人脸识别与美颜算法实战:基于Python、机器学习与深度学习
    代码和pdf书等:GitHub-guozhe1992/read引言与基础知识:介绍人脸识别与美颜算法的基本概念、应用场景以及Python编程和机器学习的基础知识。视频图像处理技术:详细讲解基于Anaconda和PyCharm的环境搭建,以及视频图像处理的基础技术,如图像读取、显示、保存和格式转换等。抖音特效......
  • python模型文件转换,将.pth转换为.onnx
    为了方便在C#项目中引用onnx文件,于是需要将pth模型文件转换为onnx类型。转换的模型项目地址是:https://github.com/xuebinqin/U-2-Net,以下为python的示例代码:1importtorch2importsys3importos4model_dir=os.path.join(os.path.dirname(__file__),'model')5sys......
  • Python之文件处理
    python进行文件处理其实也很简单,无法就那么几个要点。1、打开文件2、读取文件3、写入文件围绕上面这三个要点展开了许多的方法,调用方法进行各种花样的文件处理。听起来仿佛很牛逼,实际上没有多少花头,深刻理解了也就自然而然的掌握了。例如先自己创建一个文件,假设在D:\python-......