OpenCV目标识别
一 图像轮廓
具有相同颜色或强度的连续点的曲线。

图像轮廓的作用
可以用于图像分析
物体的识别与检测
注意
为了检测的准确性,需要先对图像进行二值化或Canny操作。
画轮廓时会修改输入的图像。
轮廓查找的API
findContours(img,mode,ApproximationMode,...)
两个返回值,contours和hierarchy
mode
RETR_EXTERNAL=0,表示只检测外轮廓。
RETR_LIST=1,检测的轮廓不建立等级关系
RETR_CCOMP=2,每层最多两级
RETR_TREE=3,桉树形存储轮廓




ApproximationMode
CHAIN_APPROX_NONE,保存所有轮廓上的点
CHAIN_APPROX_SIMPLE,只保存角点
import cv2
import numpy as npimg=cv2.imread('./9615.jpg')
print(img.shape)#转变成单通道
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(gray.shape)#二值化
ret,binary=cv2.threshold(gray,150,255,cv2.THRESH_BINARY)#轮廓查找
contours,hierarchy=cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
print(contours)
cv2.imshow('img',img)
cv2.waitKey(0)
二 绘制轮廓
如何绘制轮廓
drawContours(img,contours,contourIdx,color,thickness...)
contourIdx,-1表示绘制所有轮廓
color,颜色(0,0,255)
thickness,线宽,-1是全部填充
import cv2
import numpy as npimg=cv2.imread('./9615.jpg')
print(img.shape)#转变成单通道
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(gray.shape)#二值化
ret,binary=cv2.threshold(gray,150,255,cv2.THRESH_BINARY)#轮廓查找
contours,hierarchy=cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
print(contours)#绘制轮廓
img1=cv2.drawContours(img,contours,0,(0,0,255),5)#cv2.imshow('img',img)
cv2.imshow('img1',img1)
cv2.waitKey(0)
三 轮廓的面积和周长
1 轮廓的面积
contourArea(contour)
contour:轮廓
2 轮廓的周长
arcLength(curve,closed)
curve:轮廓
closed:是否是闭合的轮廓
import cv2
import numpy as npimg=cv2.imread('./9615.jpg')
print(img.shape)#转变成单通道
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(gray.shape)#二值化
ret,binary=cv2.threshold(gray,150,255,cv2.THRESH_BINARY)#轮廓查找
contours,hierarchy=cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
print(contours)#绘制轮廓
img1=cv2.drawContours(img,contours,0,(0,0,255),5)#计算面积
area=cv2.contourArea(contours[0])
print("area=%d"%(area))# 计算周长
len=cv2.arcLength(contours[0],True)
print("len=%d"%(len))
#cv2.imshow('img',img)
cv2.imshow('img1',img1)
cv2.waitKey(0)
四 多边形逼近与凸包

1 多边形逼近
approxPolyDP(curve,epsilon,closed)
curve:轮廓
epsilon
closed:是否是闭合的轮廓
2 凸包
convexHull(points,clockwise,...)
points:轮廓
clockwise:顺时针绘制
轮廓查找:
import cv2
import numpy as npdef drawShape(src,points):i=0while i<len(points):if(i==len(points)-1):x, y = points[i][0]x1, y1 = points[0][0]cv2.line(src, (x, y), (x1, y1), (0, 0, 255), 1)else:x, y = points[i][0]x1, y1 = points[i + 1][0]cv2.line(src, (x, y), (x1, y1), (0, 0, 255), 1)i=i+1img=cv2.imread('./palm.png')
#print(img.shape)#转变成单通道
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(gray.shape)#二值化
ret,binary=cv2.threshold(gray,150,255,cv2.THRESH_BINARY_INV)#轮廓查找
contours,hierarchy=cv2.findContours(binary,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_NONE)
#print(contours)#绘制轮廓
img1=cv2.drawContours(img,contours,-1,(0,255,0),5)e=20approx=cv2.approxPolyDP(contours[0],e,True)drawShape(img,approx)hull=cv2.convexHull(contours[0])
drawShape(img1,hull)
#cv2.imshow('img',img)
cv2.imshow('img1',img1)
cv2.waitKey(0)
凸包绘制

五 外接矩形
最小外接矩形
最大外接矩形
外接矩形

最小外接矩形
minAreaRect(points)
points:轮廓
返回值:RotatedRect
RotatedRect
x,y
width,height
angle
最大外接矩形
boundingRect(array)
array:轮廓
返回值:Rect
import cv2
import numpy as npdef drawShape(src,points):i=0while i<len(points):if(i==len(points)-1):x, y = points[i][0]x1, y1 = points[0][0]cv2.line(src, (x, y), (x1, y1), (0, 0, 255), 1)else:x, y = points[i][0]x1, y1 = points[i + 1][0]cv2.line(src, (x, y), (x1, y1), (0, 0, 255), 1)i=i+1img=cv2.imread('./Hello.png')
#print(img.shape)#转变成单通道
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(gray.shape)#二值化
ret,binary=cv2.threshold(gray,150,255,cv2.THRESH_BINARY)
print(binary.shape)
#轮廓查找cv2.RETR_CCOMP CHAIN_APPROX_NONE
contours,hierarchy=cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#print(contours)#绘制轮廓
#img=cv2.drawContours(img,contours,-1,(0,255,0),2)r=cv2.minAreaRect(contours[1])
box=cv2.boxPoints(r)
box=np.int32(box)cv2.drawContours(img,[box],0,(0,0,255),5)x,y,w,h=cv2.boundingRect(contours[1])cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)cv2.imshow('img',img)cv2.waitKey(0)

六 车辆统计
窗口的展示
图像/视频的加载
基本图形的绘制
车辆识别
基本图像运算与处理
形态学
轮廓查找
1 涉及到的知识点
加载视频
通过形态学识别车辆
对车辆进行统计
显示车辆统计信息
import cv2
import numpy as npcap=cv2.VideoCapture('video.mp4')while True:ret,frame= cap.read()if(ret==True):cv2.imshow('video',frame)key=cv2.waitKey(1)if(key==27)break
cap.release()
cv2.destroyAllWindows()
形态学处理
import cv2
import numpy as npcap=cv2.VideoCapture('video.mp4')bgsubmog=cv2.bgsegm.createBackgroundSubtractorMOG()#形态学kernel
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))while True:ret,frame= cap.read()if(ret==True):#灰度cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#去噪(高斯)blu=cv2.GaussianBlur(frame,(3,3),5)#去背影mask=bgsubmog.apply(blu)#腐蚀erode=cv2.erode(mask,kernel)#膨胀dilate=cv2.dilate(mask,kernel,iterations=2)#闭操作,去掉物体内部的小块close=cv2.morphologyEx(dilate,cv2.MORPH_CLOSE,kernel)cnts,h=cv2.findContours(close,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)for(i,c)in enumerate(cnts):(x,y,w,h)=cv2.boundingRect(c)cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)cv2.imshow('mask',mask)cv2.imshow('erode',erode)cv2.imshow('video',frame)key=cv2.waitKey(1)if(key==27):break
cap.release()
cv2.destroyAllWindows()
相关文章:
OpenCV目标识别
一 图像轮廓 具有相同颜色或强度的连续点的曲线。 图像轮廓的作用 可以用于图像分析 物体的识别与检测 注意 为了检测的准确性,需要先对图像进行二值化或Canny操作。 画轮廓时会修改输入的图像。 轮廓查找的API findContours(img,mode,ApproximationMode,...)…...
密码学及其应用——为什么选择接近的质数因子对RSA加密算法不安全?
RSA加密算法是一种广泛使用的非对称加密算法,它的安全性依赖于大整数分解的难度。具体来说,RSA算法生成的公钥包含一个大整数N,这是两个大质数p和q的乘积。然而,如果这两个质数p和q太接近,则可以相对容易地对N进行因式…...
爱心商城管理系统的设计
管理员账户功能包括:系统首页,个人中心,管理员管理,企业管理,用户管理,论坛管理,商品管理,公告管理,用户捐赠 企业账户功能包括:系统首页,个人中…...
【python】linux下安装chromedriver
首先,安装selenium模块 pip3 install selenium查看系统内chrome版本: google-chrome --version 根据谷歌浏览器版本下载对应的浏览器驱动版本: wget https://storage.googleapis.com/chrome-for-testing-public/126.0.6478.114/linux64/ch…...
Day18—使用Scrapy框架快速开发爬虫
Scrapy是一个强大的Python框架,用于快速开发爬虫程序。它提供了一整套工具来处理网页爬取和数据提取,非常适合于数据挖掘和信息抓取。本文将详细介绍如何使用Scrapy框架,包括创建项目、编写爬虫规则、设置中间件和管道等。 1. Scrapy框架概述 Scrapy框架以其高性能、易用性…...
04--MySQL8.0_JDBC
第一章 JDBC概述 之前我们学习了JavaSE,编写了Java程序,数据保存在变量、数组、集合等中,无法持久化,后来学习了IO流可以将数据写入文件,但不方便管理数据以及维护数据的关系; 后来我们学习了数据库管理软件MySQL,可以方便的管理数据1。 那么如何将它俩结合起来呢?即…...
OPENCV中0x00007FFE5F35F39C发生异常
原因:读取图片时已经为灰度图像,又进行了一次灰度处理cvtColor 解决方法:如上图所示,将cv::imread的第二个参数改为cv::IMREAD_COLOR;或者保留cv::IMREAD_GRAYSCALE,删去后面的cv::cvtColor...
Python 设计模式(第2版) -- 第三部分(行为型模式)
Python 设计模式(第2版) 再介绍下行为型设计模式。 行为型模式,顾名思义,它主要关注的是对象的责任。它们用来处理对象之间的交互,以实现更大的功能。行为型模式建议:对象之间应该能够彼此交互,同时还应该是松散耦合…...
EXCEL数据导入HIVE
引言 本文将论述如何将Windows本地的excel表数据,导入到虚拟机Linux系统中的Hadoop生态中的Hive数据仓库中。 实验准备 DBeaver Hive3.1(Hadoop3.1) excel数据表 实验步骤 一、首先打开虚拟机,启动Hadoop,启动h…...
C语言常用标准头文件
头文件的基础概念 在C的系列语言程序中,头文件(通常扩展名为.h)被大量使用,它通常包含函数、变量、结构体等的声明和定义,以及一些宏定义和类型定义。头文件的主要作用是为了方便管理和重用代码,它可以被多…...
vuejs3用gsap实现动画
效果 gsap官网地址: https://gsap.com/ 安装gsap npm i gsap 创建Gsap.vue文件 <script setup> import {reactive, watch} from "vue"; import gsap from "gsap"; const props defineProps({value:{type:Number,default:0} }) cons…...
企业级-PDF文件下载
作者:fyupeng 技术专栏:☞ https://github.com/fyupeng 项目地址:☞ https://github.com/fyupeng/rpc-netty-framework 留给读者 一、介绍 文件下载在浏览器可以根据响应头设置纯下载和直接打开两种方式。 二、代码 RequestMapping("/…...
00 - React 基础
1. React 基础 安装react指令 可参考: 官网官网使用教程 如: npx create-react-app 项目名 如:npx create-react-app react-redux-proJSX JSX 是一种 JavaScript 的语法扩展,类似于 XML 或 HTML,允许我们在 Java…...
基于WPF技术的换热站智能监控系统17--项目总结
1、项目颜值,你打几分? 基于WPF技术的换热站智能监控系统01--项目创建-CSDN博客 基于WPF技术的换热站智能监控系统02--标题栏实现-CSDN博客 基于WPF技术的换热站智能监控系统03--实现左侧加载动画_wpf控制系统-CSDN博客 基于WPF技术的换热站智能监…...
CI /CD学习
CI/CD概述 CI/CD 是持续集成和持续交付/部署的缩写,旨在简化并加快软件开发生命周期。 持续集成(CI)是指自动且频繁地将代码更改集成到共享源代码存储库中的做法。持续交付和/或持续部署(CD)是一个由两部分组成的过程…...
基于matlab的高斯滤波与图像去噪
1 高斯滤波原理 1.1 原理 高斯滤波是一种线性平滑滤波技术,主要用于消除图像中的高斯噪声。它的工作原理可以理解为对整幅图像进行加权平均的过程,即每个像素点的值都由其本身和邻域内的其他像素值经过加权平均后得到。 高斯滤波实质上是一种信号的滤…...
解决 uniapp h5 页面在私有企微iOS平台 间歇性调用uni api不成功问题(uni.previewImage为例)。
demo <template><view class"content"><image class"logo" src"/static/logo.png"></image><button click"previewImage">预览图片</button></view> </template><script> //打…...
Jenkins nginx自动化构建前端vue项目
在现代的Web开发中,Vue.js已经成为一种非常流行的JavaScript框架。为了更高效地管理和部署Vue.js项目,使用自动化构建工具是至关重要的。Jenkins作为一款强大的持续集成和持续部署(CI/CD)工具,为我们提供了一种便捷的方…...
Devicetree - 删除某个节点或属性
在设备树(devicetree)中,删除语法用于从现有设备树中删除属性或节点。这通常在设备树覆盖文件(DTS)或片段文件中完成。该语法使用 /delete-property/ 和 /delete-node/ 指令。 以下是如何使用这些指令的示例࿱…...
Xcode will continue when the operation completes
Xcode 15后,连接手机经常出现 Preparing iPhone. Xcode will continue when the operation completes.记录一下解决办法。其他提示,Xcode连接不上手机也可以尝试通过这个方法解决。 注意:最好关闭科学上网再操作。 从Xcode取消iPhone的配对(右键单击 -Unpair Devi…...
AI绘画模型训练完全指南:3大核心优势与零代码实践
AI绘画模型训练完全指南:3大核心优势与零代码实践 【免费下载链接】sd-trainer 项目地址: https://gitcode.com/gh_mirrors/sd/sd-trainer Stable Diffusion训练技术已成为AI绘画领域的核心能力,但传统训练流程复杂、配置繁琐,让许多…...
基于LSTM与SmolVLA的时序多模态数据分析
基于LSTM与SmolVLA的时序多模态数据分析 想象一下,你面前有一段监控视频,画面里有人正在行走、停留、再行走。如果只看其中一帧,你只能知道“这里有个人”;但如果把连续几帧连起来看,你就能判断出“这个人正在从A点走…...
【2026年最新600套毕设项目分享】springboot“优兴趣”家教平台(14298)
有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运行一键启动项目&…...
从“认怂”到“被看见”:flomo的产品设计哲学
当大多数笔记软件都在追求“大而全”时,有一款产品选择了一条完全不同的路。它不让你写标题,不支持复杂排版,甚至在官网上大大方方地列出“自己不擅长什么”。它的创始人说:“35岁再创业,我学会了认怂。”它就是flomo&…...
电话号码定位技术:三步实现手机号码精准定位的终极指南
电话号码定位技术:三步实现手机号码精准定位的终极指南 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/gh_mir…...
Precor必确 GLUTEBUILDER 系列,带来系统化臀部训练解决方案
在健身训练不断细分的当下,臀部训练早已不再是“顺带练一练”的附属项目,而是被置于与胸、背、腿同等重要的核心地位。然而,真正高效的臀腿训练,从来不是简单堆叠负重,而是建立在精准发力与动作模式科学之上的系统工程…...
Cursor 2.2的Visual Editor实战:如何像改Figma一样,5分钟重构一个Vue/React页面布局
Cursor 2.2的Visual Editor实战:如何像改Figma一样,5分钟重构一个Vue/React页面布局 重构老旧前端页面就像给老房子翻新——既要保留主体结构,又要让外观焕然一新。传统方式下,我们不得不在代码编辑器与浏览器之间反复切换&#x…...
OWL ADVENTURE 作业批改场景应用:自动识别手写算式与批阅
OWL ADVENTURE 作业批改场景应用:自动识别手写算式与批阅 1. 引言 想象一下,一位数学老师晚上十点还在台灯下,面前堆着厚厚一摞作业本,需要逐题检查、打勾、画叉,再写上评语。日复一日,这种重复性劳动不仅…...
保姆级教程:在Android项目中集成微信Matrix性能监控框架(含避坑指南)
Android性能监控实战:微信Matrix框架深度集成指南 在移动应用开发领域,性能优化始终是开发者面临的核心挑战之一。微信开源的Matrix框架作为一套全平台性能监控工具链,为Android开发者提供了从方法耗时、ANR检测到内存泄漏分析等全方位的监控…...
蓝桥杯备赛:Floyd、Bellman-Ford、Dijkstra,三大最短路算法到底怎么选?(附场景对比与代码模板)
蓝桥杯竞赛:Floyd、Bellman-Ford、Dijkstra三大最短路算法实战指南 在算法竞赛的战场上,最短路问题就像是一道必考题,而Floyd、Bellman-Ford和Dijkstra这三大算法则是解题的利器。但很多选手在面对具体问题时常常陷入选择困难:该用…...
