OpenCV目标识别

news2024/10/5 15:28:24

一 图像轮廓

具有相同颜色或强度的连续点的曲线。
在这里插入图片描述
图像轮廓的作用
可以用于图像分析
物体的识别与检测

注意

为了检测的准确性,需要先对图像进行二值化或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.coloradmin.cn/o/1830469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GUI Guider(V1.7.2) 设计UI在嵌入式系统上的应用(N32G45XVL-STB)

目录 概述 1 使用GUI Guider 设计UI 1.1 创建页面 1.2 页面切换事件实现 1.3 生成代码和仿真 1.3.1 生成和编译代码 1.3.2 仿真UI 2 GUI Guider生成的代码结构 2.1 代码结构介绍 2.2 Project目录下的文件 3 板卡上移植UI 3.1 加载代码至工程目录 3.2 主函数中调…

新旧torch中傅里叶变换实现(fft)

由泰勒级数我们知道&#xff0c;一个函数可以被分解成无穷个幂函数叠加的形式&#xff0c;于是同样地&#xff0c;一个周期函数也可以被分解成多个周期函数叠加&#xff0c;于是自然而然地&#xff0c;三角函数符合这个需求&#xff0c;由傅里叶级数我们可以将周期函数分解成无…

【车载音视频AI电脑】铁路视频监控系统解决方案

方案简介 铁路视频监控系统解决方案针对铁路行业安全运营保障需求&#xff0c;根据中国铁路总公司的技术规范要求&#xff0c;基于铁路系统的IP网络&#xff0c;采用先进的视频监控技术&#xff0c;构建一套完备的数字化、智能化、分布式铁路综合视频监控系统&#xff0c;实现视…

第二证券A股重要变化!今起实施

A股系列重要指数迎来样本股调整&#xff01; 此前&#xff0c;深交所及其全资子公司深证信息发布公告&#xff0c;将对深证成指、创业板指、深证100&#xff08;以下统称“深市中心指数”&#xff09;施行样本股定时调整。此次调整于6月17日&#xff08;今日&#xff09;正式施…

关于电脑文件的规划思考

概述 设置C、D、E、F 四个盘 C盘&#xff1a;系统数据使用&#xff0c;操作系统、其他软件需要用到的系统性资源 D盘&#xff1a;应用软件区 的使用&#xff0c;数据库、navacat、idea、visual studio、浏览器、向日葵、虚拟机…… E盘&#xff1a;工作区&#xff1a;公司资料…

如何移植libwebsockets

libwebsockets是一个高性能的开源C语言库&#xff0c;专为实现WebSocket协议及相关的HTTP协议而设计。它不仅使开发者能够在客户端与服务器端轻松构建WebSocket连接&#xff0c;还可以用作标准HTTP服务器。WebSocket是一种在单个TCP连接上进行全双工通信的协议&#xff0c;可以…

APS为什么是业务、开发、数据和算法的结合体

获取更多资讯,赶快关注上面的公众号吧! 文章目录 一 引言二 业务是灵魂2.1 生产类型2.2 生产模式2.3 生产约束三 开发是支撑3.1 开发语言3.2 技术架构3.3 内存计算3.4 系统集成3.5 系统交互四 数据是基础五 算法是核心5.1 问题建模5.2 算法建模总结APS系统的实施是一个类似阶…

技术心得总结:a 标签实现新标签页打开功能

最近&#xff0c;有用户提出希望在点击菜单项时&#xff0c;能够在新标签页中打开对应的链接功能。这类似于我们常用的右键菜单中的“在新标签页打开链接”功能。经过对需求的分析和代码的查看&#xff0c;我们找到了实现这一功能的方法。 原始实现 最初的跳转实现是通过用户触…

three.js 基础01

1.场景创建 Scene() 2.常用形状集几何体「Geometry」[可设置长宽高等内容&#xff0c;如&#xff1a;new THREE.BoxGeometry(...)] 长方体 BoxGeometry圆柱体 CylinderGeometry 球体SphereGeometry圆锥体ConeGeometry矩形平面 PlaneGeometry 圆面体 CircleGeo…

Linux中文件查找相关命令比较

Linux中与文件定位的命令有find、locate、whereis、which&#xff0c;type。 一、find find命令最强&#xff0c;能搜索各种场景下的文件&#xff0c;需要配合相关参数&#xff0c;搜索速度慢。在文件系统中递归查找文件。 find /path/to/search -name "filename"…

人工智能发展历程了解和Tensorflow基础开发环境构建

目录 人工智能的三次浪潮 开发环境介绍 Anaconda Anaconda的下载和安装 下载说明 安装指导 模块介绍 使用Anaconda Navigator Home界面介绍 Environment界面介绍 使用Jupter Notebook 打开Jupter Notebook 配置默认目录 新建文件 两种输入模式 Conda 虚拟环境 添…

《软件测试52讲》——测试基础知识篇

1 你真的懂测试吗&#xff1f;从“用户登录”测试谈起 从“用户登录”测试谈起&#xff0c;“用户登录”功能作为测试对象 作为测试工程师&#xff0c;你的目标是要保证系统在各种应用场景下的功能是符合设计要求的&#xff0c;所以你需要考虑的测试用例就需要更多、更全面。 …

Java I/O操作

引言 在Java编程中&#xff0c;输入和输出&#xff08;I/O&#xff09;操作是必不可少的部分。Java I/O通过一系列流&#xff08;Stream&#xff09;类和方法&#xff0c;支持文件操作、控制台输入输出、网络I/O等多种I/O操作。本文将详细介绍Java I/O的基础概念、文件操作、字…

SQL注入攻击

网站是什么工作的&#xff1f; php写的代码电脑不认识&#xff0c;脚本引擎就是做翻译的&#xff0c;把高级代码翻译为机器语言 访问网站的地址&#xff0c;不同的新闻的id是不一样的&#xff0c;就是对应数据库的不同位置 这里面一个ip地址对应三个网站&#xff08;怎么能对应…

JavaScript领域的五大AI工程利器

五大引领AI工程的JavaScript工具&#xff0c;为欲将LLM融入项目的开发者提供关键资源。 译自Top 5 JavaScript Tools for AI Engineering&#xff0c;作者 Alexander T. Williams。 传统上以在网页开发中扮演角色而闻名的JavaScript&#xff0c;令许多人惊讶的是&#xff0c;它…

CAN测试工具——BUSMASTER

文章目录 推荐理由一、菜单栏Transmit WindowDiagnostics二、Tools推荐理由 BUSMASTER是一个用于设计,监测,分析与模拟CAN网络的开源的开放式总线PC软件. 1) 可以和十几种常用CAN总线硬件兼容。比如:IXXAT、PEAK、Kvaser、CANcase XL等。 2)免费,开源 https://rbei-etas.g…

pandas获取某列最大值的所有数据

第一种方法&#xff1a; 按照某列进行由大到小的排序&#xff0c;然后再进去去重&#xff0c;保留第一个值&#xff0c;最终保留的结果就是最大值的数据 # 由大到小排序 data_frame data_frame.sort_values(bycolumn_a, ascendingFalse)# 按照column_b列去重保留第一条&#…

人工智能在数字病理领域的最新进展|顶刊速递·24-06-14

小罗碎碎念 文献主题&#xff1a;人工智能在【数字病理】领域的最新进展 今天在写这篇推文的时候&#xff0c;脑子里就一个念头——大模型的风&#xff0c;终于还是卷到了病理学领域。 这是一个好事哈&#xff0c;如果我们搞病理研究的&#xff0c;也能有一个像Chatgpt一样的工…

如何使用 pip 卸载所有已安装的 Python 包?

在开发过程中&#xff0c;我们可能会安装许多 Python 包&#xff0c;有时需要彻底清理环境&#xff0c;以便从头开始或者解决冲突问题。下面将介绍如何使用 pip 命令卸载所有已安装的 Python 包。 一、列出所有已安装的包 首先&#xff0c;需要列出当前环境中所有已安装的包。…

开源模型应用落地-LangChain高阶-LCEL-表达式语言(七)

一、前言 尽管现在的大语言模型已经非常强大&#xff0c;可以解决许多问题&#xff0c;但在处理复杂情况时&#xff0c;仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而&#xff0c;现在可以利用langchain来使得模型的应用变得更加直接和简单。 LCEL是什么&…