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 np

img=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 np

img=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 np

img=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 np

def drawShape(src,points):
    i=0
    while 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+1

img=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=20

approx=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 np

def drawShape(src,points):
    i=0
    while 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+1

img=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 np

cap=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 np

cap=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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/714645.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

北航第六次数据结构与程序设计作业(查找与排序)选填题

一、 顺序查找的平均查找长度ASL&#xff08;1 2 …… n&#xff09;/ n (n 1&#xff09;/ 2 二、 这半查找法的平均查找次数和判定树的深度有关系。若查找一个不存在的元素&#xff0c;说明进行了深度次比较。 注意&#xff0c;判定树不是满二叉树&#xff0c;因此深…

创新案例 | 3个关键策略:乳制品品牌认养一头牛如何通过私域流量运营获取1400万会员

探索认养一头牛如何运用创新的私域流量运营策略&#xff0c;在竞争激烈的乳制品市场中脱颖而出&#xff0c;实现会员数量的飞速增长至1400万。本文深入分析了其数据驱动的广告投放、高效的会员运营体系和创新的用户互动机制&#xff0c;为企业提供提升用户粘性和品牌忠诚度的宝…

Postgre 调优工具pgBadger部署

一&#xff0c;简介&#xff1a; pgBadger&#xff08;日志分析器&#xff09;类似于oracle的AWR报告&#xff08;基于1小时&#xff0c;一天&#xff0c;一周&#xff0c;一月的报告&#xff09;&#xff0c;以图形化的方式帮助DBA更方便的找到隐含问题。 pgbadger是为了提高…

嵌入式数据库的一般架构

嵌入式数据库的架构与应用对象紧密相关&#xff0c;其架构是以内存、文件和网络等三种方式为主。 1.基于内存的数据库系统 基于内存的数据库系统中比较典型的产品是每个McObject公司的eXtremeDB嵌入式数据库&#xff0c;2013年3月推出5.0版&#xff0c;它采用内存数据结构&…

【Java】过滤器/拦截器

文章目录 两者区别request链路全过程 在实际开发中&#xff0c;过滤器和拦截器都是经常使用的技术&#xff0c;但一被提及到其区别时&#xff0c;整个人就愣住了&#xff0c;好像没有认真地对两者进行区别和总结&#xff0c;这两者之间也确实很容易混淆&#xff0c;因此结合了很…

python读取excel导入数据库

一、环境准备&#xff0c;安装包 pip install pandas openpyxl sqlalchemy二、数据准备 三、代码编写 from sqlalchemy import create_engine import pandas as pdclass GDPDataImporter:def __init__(self, db_type, dbapi, host, port, database, username, password):&quo…

【Git】基础操作

初识Git 版本控制的方式&#xff1a; 集中式版本控制工具&#xff1a;版本库是集中存放在中央服务器的&#xff0c;team里每个人work时从中央服务器下载代码&#xff0c;是必须联网才能工作&#xff0c;局域网或者互联网。个人修改之后要提交到中央版本库 例如&#xff1a;SVM和…

Python(二)---数据类型与变量、以及运算符

文章目录 前言1.Python程序的构成1.1.代码的组织和缩进1.2.使用\行连接符 2.对象和引用、标识符规则2.1.对象2.2.引用2.3.标识符规则 3.变量和简单赋值语句3.1.变量的声明和赋值3.2.删除变量和垃圾回收机制3.3.常量3.4.链式赋值3.5.系列解包赋值 4.最基本内置数据类型4.1.数字和…

rclone 上传资料到 onedrive 遇到限速问题解决

原因分析 可能和脚本参数设置有关系,我的参数是: rclone copy "F:\阿里云盘\6666\局域网" "od:影视" --ignore-existing -u -v -P --transfers20 --ignore-errors --buffer-size128M --check-first --checkers10 --drive-acknowledge-abuse差不多8G大小的…

C#——值类型和引用类型的区别详情

值类型和引用类型的区别 值类型 值类型&#xff1a; 常用的基本数据类型都是值类型&#xff1a;bool 、char、int、 double、 float、long 、 byte 、ulong、uint、枚举类型、 结构体类型等特点: 在赋值的过程当中&#xff0c;把值的本身赋值给另一个变量&#xff0c;再修改…

关于STM32上用HID HOST调鼠标数据的解析

一、前言 关于这章主要是基于我前面的那篇文章 链接: 关于怎么用Cubemx生成的USBHID设备实现读取一体的鼠标键盘设备&#xff08;改进版&#xff09; https://blog.csdn.net/qq_29187987/article/details/139535648?spm1001.2014.3001.5501 引用的文章的简介 引用的这篇文…

FFmpeg编解码的那些事(3)-视频硬解码的基础知识

目录 前言&#xff1a; 1.iso/os x平台 2.windows平台 3.linux平台 4.Tips&#xff1a; 5.结论&#xff1a; 前言&#xff1a; 视频硬解码的过程就是把视频提取成图片变显示出来&#xff0c;就是播放器播放视频的过程&#xff0c;就可以理解为解码的过程。 在不同的系统…

微信同声传译小程序插件使用教程

微信同声传译小程序插件 —— 机器翻译、智能语音 案例可搜索“一起学英语鸭”小程序查看&#xff0c; 实现效果如下图&#xff1a; 插件功能 语音转文字 语音合成 文本翻译 step 1&#xff1a;添加插件 在使用前&#xff0c;需要登录官网 设置 → 第三方服务 → 添加插件…

UniApp+Vue3使用Vant-微信小程序组件

第一步&#xff1a;打开创建好的UniappVue3的项目 第二步&#xff1a;下载Vant-Weapp npm i vant/weapp -S --production 第三步&#xff1a;修改目录名称 wxcomponents 必须是wxcomponents 第四步&#xff1a;将下载好的vant中的dist目录剪切到当前wxcomponents目录下 第五…

(超详细)基于动态顺序表实现简单的通讯录项目

前言&#xff1a; 我们在上一章节用c语言实现了线性表中的的动态顺序表&#xff0c;那么顺序表就只是顺序表吗&#xff1f;当然不是&#xff0c;使用顺序表结构可以实现很多项目&#xff0c;许多项目的数据结构都会用到顺序表&#xff0c;本章节我们就要使用顺序表实现一个简易…

数值分析笔记(二)函数插值

函数插值 已知函数 f ( x ) f(x) f(x)在区间[a,b]上n1个互异节点 { x i } i 0 n \{{x_i}\}_{i0}^{n} {xi​}i0n​处的函数值 { y i } i 0 n \{{y_i}\}_{i0}^{n} {yi​}i0n​&#xff0c;若函数集合 Φ \Phi Φ中函数 ϕ ( x ) \phi(x) ϕ(x)满足条件 ϕ ( x i ) y i ( i …

论文阅读:RAM++ | Open-Set Image Tagging with Multi-Grained Text Supervision

发表时间&#xff1a;2023年11月16 论文地址&#xff1a;https://arxiv.org/pdf/2310.15200 项目地址&#xff1a;https://github.com/xinyu1205/recognize-anything Recognize Anything Plus Model&#xff08;RAM&#xff09;&#xff0c;这是一种有效利用多粒度文本监督的开…

课时154:项目发布_手工发布_手工发布

1.2.3 手工发布 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 简介 为了合理的演示生产环境的项目代码发布&#xff0c;同时又兼顾实际实验环境的资源&#xff0c;我们这里将 B主机和C主机 用一台VM主机来实现&#xff0c;A主机单…

电路笔记 :LM3481MM/NOPB升压模块,升压电路原理

LM3481MM/NOPB LM3481MM/NOPB 是德州仪器&#xff08;Texas Instruments&#xff09;的一款广泛应用的DC-DC控制器&#xff0c;常用于电源管理应用&#xff0c;特别是在需要升压&#xff08;boost&#xff09;、反激&#xff08;flyback&#xff09;、SEPIC或反向配置的场合。…

【Ardiuno】实验使用OPT语音模块播放语音(图文)

当我们需要在程序中播放语音内容时&#xff0c;就需要使用到语音模块&#xff0c;今天我们就来实验一下使用OPT语音模块来方法语音。 const int voicePin 5; const int voiceBusyPin 18; const int testLEDPin 2;unsigned long pmillis 0;int busyVal 0; …