首页 > 其他分享 >目标识别

目标识别

时间:2023-04-05 16:24:47浏览次数:27  
标签:erode frame imshow cv2 目标 import 识别 ###

目标识别

图像轮廓

图像轮廓:具有相同颜色或强度的连续点的曲线
作用:
	可用于图形分析
	物体的识别和检测
注意点:
	为了检测的准确性,需要先对图像进行二值化或Canny操作
	画轮廓时会修改输入的图像

findContours(img,mode,ApproximationMode)
	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('C:\\Users\dazhi\Desktop\lunkuo.png')
###转变成单通道
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

##二值化
ret,binary = cv2.threshold(gray,150,255,cv2.THRESH_BINARY)

###轮廓查找
contours,hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
print(contours)

cv2.imshow('img',img)

# cv2.imshow('bin',binary)

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('C:\\Users\dazhi\Desktop\lunkuo.png')
###转变成单通道
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

##二值化
ret,binary = cv2.threshold(gray,150,255,cv2.THRESH_BINARY)

###轮廓查找
contours,hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
# print(contours)

###绘制轮廓
cv2.drawContours(img,contours,-1,(0,0,255),1)

cv2.imshow('img',img)

# cv2.imshow('bin',binary)

cv2.waitKey(0)

shibie-01

轮廓的面积和周长

###轮廓的面积
contourArea(contour)
	contour:轮廓
###轮廓的周长
arcLength(curve,closed)
	curve:轮廓
	closed:闭合还是非闭合
	
import cv2
import numpy as np

img = cv2.imread('C:\\Users\dazhi\Desktop\lunkuo.png')
###转变成单通道
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

##二值化
ret,binary = cv2.threshold(gray,150,255,cv2.THRESH_BINARY)

###轮廓查找
contours,hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
# print(contours)

###绘制轮廓
cv2.drawContours(img,contours,-1,(0,0,255),1)

###计算面积
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('bin',binary)

cv2.waitKey(0)

多边形逼近与凸包

###多边形逼近

approxPolyDP(curve,epsilon,closed)
	curve:曲线,轮廓
	epsilon:精度
	closed:是否闭合
	
###凸包
convexHull(points,clockwise)
	points:点,轮廓
	clockwise:顺时针绘制
	
import cv2
import numpy as np

def darwShape(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),3)
        else:
            x,y = points[i][0]
            x1,y1 = points[i+1][0]
            cv2.line(src,(x,y),(x1,y1),(0,0,255),3)
        i=i+1


img = cv2.imread('C:\\Users\dazhi\Desktop\-tubao.png')
###转变成单通道
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

##二值化
ret,binary = cv2.threshold(gray,150,255,cv2.THRESH_BINARY)

###轮廓查找
contours,hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
# print(contours)

###绘制轮廓
cv2.drawContours(img,contours,0,(0,255,0),1)

###多边形逼近
e = 20  ###e值变小线会变得平滑
approx = cv2.approxPolyDP(contours[0],e,True)
darwShape(img,approx)

###凸包
hull = cv2.convexHull(contours[0])
darwShape(img,hull)

cv2.imshow('img',img)

cv2.waitKey(0)

shibie-02

外接矩阵

最小外接矩形
	minAreaRect(points)
		points:坐标点。轮廓
最大外接矩形
	boundingRect(array)
		array:轮廓

import cv2
import numpy as np

def darwShape(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),3)
        else:
            x,y = points[i][0]
            x1,y1 = points[i+1][0]
            cv2.line(src,(x,y),(x1,y1),(0,0,255),3)
        i=i+1


img = cv2.imread('C:\\Users\dazhi\Desktop\Hello.png')
###转变成单通道
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

##二值化
ret,binary = cv2.threshold(gray,150,255,cv2.THRESH_BINARY)

###轮廓查找
contours,hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
# print(contours)

###最小外接矩形
r = cv2.minAreaRect(contours[1])
###由于上面的是带角度的,下面只取起始点和宽高
box = cv2.boxPoints(r)
###强制转换
box = np.int0(box)
cv2.drawContours(img,[box],0,(0,0,255),2)

####最大外接矩形
x,y,w,h = cv2.boundingRect(contours[1])
###(x+w,y+h)在起始点的基础上加上
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)

cv2.imshow('img',img)

cv2.waitKey(0)

shibie-03

车辆识别

涉及到的内容
	窗口的展示
	图像/视频的加载
	基本图形的绘制
	车辆识别
		基本图像运算与处理
		形态学
		轮廓查找
		

###视频加载
import cv2
import numpy as np

cap = cv2.VideoCapture('C://Users/dazhi/Desktop/video.mp4')

###通过while循环将视频一幅一幅的读取出来(读取每一帧)
while True:
    ret,frame = cap.read()

    if(ret == True):
        cv2.imshow('video',frame)
    
    key = cv2.waitKey(1)
    ###27=左上角esc
    if(key == 27):
        break

cap.release()
cv2.destroyAllWindows()
###去除背景
createBackgroundSubtractorMOG()
	history=200 缓冲5帧

import cv2
import numpy as np

cap = cv2.VideoCapture('C://Users/dazhi/Desktop/video.mp4')

bgsubmog = cv2.createBackgroundSubtractorMOG2()
# test = cv2.createBackgroundSubtractorMOG2()
# bgsubmog = cv2.bgsegm.createBackgroundSubtractorGMG()
###通过while循环将视频一幅一幅的读取出来(读取每一帧)
while True:
    ret,frame = cap.read()

    if(ret == True):

        ###灰度化
        cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

        ###去噪(高斯)
        blur = cv2.GaussianBlur(frame,(3,3),5)
        ###去背景
        mask = bgsubmog.apply(blur)
        ###做对比 没有经过去噪的
        # t1 = test.apply(frame)
        # cv2.imshow('t1',t1)

        cv2.imshow('video',mask)
    
    key = cv2.waitKey(1)
    ###27=左上角esc
    if(key == 27):
        break

cap.release()
cv2.destroyAllWindows()

image-20230405141644317

###形态处理
import cv2
import numpy as np

cap = cv2.VideoCapture('C://Users/dazhi/Desktop/video.mp4')

bgsubmog = cv2.createBackgroundSubtractorMOG2()
# test = cv2.createBackgroundSubtractorMOG2()
# bgsubmog = cv2.bgsegm.createBackgroundSubtractorGMG()
###通过while循环将视频一幅一幅的读取出来(读取每一帧)

###形态学kernel
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

while True:
    ret,frame = cap.read()

    if(ret == True):

        ###灰度化
        cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

        ###去噪(高斯)
        blur = cv2.GaussianBlur(frame,(3,3),5)
        ###去背景
        mask = bgsubmog.apply(blur)
        ###做对比 没有经过去噪的
        # t1 = test.apply(frame)
        # cv2.imshow('t1',t1)

        ##腐蚀(去掉一些小的斑块)
        erode = cv2.erode(mask,kernel)
        # cv2.imshow('erode',erode)

        ###膨胀(还原放大)
        dilate = cv2.dilate(erode,kernel,iterations=3)
        # cv2.imshow('erode',dilate)

        ###闭操作 去掉物体内部的小块
        close = cv2.morphologyEx(dilate,cv2.MORPH_CLOSE,kernel)
        close = cv2.morphologyEx(close,cv2.MORPH_CLOSE,kernel)
        # cv2.imshow('erode',close) 

        cnts,h = cv2.findContours(close,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

        for (i,c) in enumerate(cnts):
            (x,y,w,h) = cv2.boundingRect(c)
            cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)

        cv2.imshow('video',frame)
    
    key = cv2.waitKey(1)
    ###27=左上角esc
    if(key == 27):
        break

cap.release()
cv2.destroyAllWindows()


###车辆统计
import cv2
import numpy as np

###检测线的高度 (可以在灰度那里打印出(720, 1280, 3))
line_high = 600

###存放有效车辆的数组
cars = []

###统计车的数量
carno = 0
###计算中心点

def center(x,y,w,h):
    x1 = int(w/2)
    y1 = int(h/2)
    cx = x+x1
    cy = y+y1

    return cx,cy

cap = cv2.VideoCapture('C://Users/dazhi/Desktop/video.mp4')

bgsubmog = cv2.createBackgroundSubtractorMOG2()
# test = cv2.createBackgroundSubtractorMOG2()
# bgsubmog = cv2.bgsegm.createBackgroundSubtractorGMG()
###通过while循环将视频一幅一幅的读取出来(读取每一帧)

###形态学kernel
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

while True:
    ret,frame = cap.read()

    if(ret == True):

        ###灰度化
        cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        ###查看视频的数据
        # print(frame.shape)
        # exit()

        ###去噪(高斯)
        blur = cv2.GaussianBlur(frame,(3,3),5)
        ###去背景
        mask = bgsubmog.apply(blur)
        ###做对比 没有经过去噪的
        # t1 = test.apply(frame)
        # cv2.imshow('t1',t1)

        ##腐蚀(去掉一些小的斑块)
        erode = cv2.erode(mask,kernel)
        # cv2.imshow('erode',erode)

        ###膨胀(还原放大)
        dilate = cv2.dilate(erode,kernel,iterations=3)
        # cv2.imshow('erode',dilate)

        ###闭操作 去掉物体内部的小块
        close = cv2.morphologyEx(dilate,cv2.MORPH_CLOSE,kernel)
        close = cv2.morphologyEx(close,cv2.MORPH_CLOSE,kernel)
        # cv2.imshow('erode',close) 

        cnts,h = cv2.findContours(close,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

        ###画一条线
        cv2.line(frame,(10,line_high),(1200,line_high),(255,255,0),3)
        for (i,c) in enumerate(cnts):
            (x,y,w,h) = cv2.boundingRect(c)
            

            ###过滤(对车辆的宽高进行判断,已验证是否是有效的车辆)
            isValid = (w >= 90) and (h >= 90)
            if(not isValid):
                continue
            ###到这里是有效的车

            cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2) ##绘制车
            cpoint = center(x,y,w,h)
            cars.append(cpoint)

            for(x,y) in cars:
                 ##要有一条线
                ##有范围 6
                ##从数组中减去

                if ((y > line_high -6) and (y < line_high + 6)):
                    carno += 1
                    cars.remove((x,y))
                    print(carno)
               
        cv2.imshow('video',frame)
    
    key = cv2.waitKey(1)
    ###27=左上角esc
    if(key == 27):
        break

cap.release()
cv2.destroyAllWindows()
###显示车辆统计信息
import cv2
import numpy as np

###检测线的高度 (可以在灰度那里打印出(720, 1280, 3))
line_high = 550

###存放有效车辆的数组
cars = []

###统计车的数量
carno = 0
###计算中心点
def center(x,y,w,h):
    x1 = int(w/2)
    y1 = int(h/2)
    cx = x+x1
    cy = y+y1
    return cx,cy

cap = cv2.VideoCapture('C://Users/dazhi/Desktop/video.mp4')

bgsubmog = cv2.createBackgroundSubtractorMOG2()
# bgsubmog = cv2.bgsegm.createBackgroundSubtractorGMG()
###通过while循环将视频一幅一幅的读取出来(读取每一帧)

###形态学kernel
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

while True:
    ret,frame = cap.read()

    if(ret == True):

        ###灰度化
        cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

        ###去噪(高斯)
        blur = cv2.GaussianBlur(frame,(3,3),5)
        ###去背景
        mask = bgsubmog.apply(blur)

        ##腐蚀(去掉一些小的斑块)
        erode = cv2.erode(mask,kernel)
        # cv2.imshow('erode',erode)

        ###膨胀(还原放大)
        dilate = cv2.dilate(erode,kernel,iterations=3)
        # cv2.imshow('erode',dilate)

        ###闭操作 去掉物体内部的小块
        close = cv2.morphologyEx(dilate,cv2.MORPH_CLOSE,kernel)
        close = cv2.morphologyEx(close,cv2.MORPH_CLOSE,kernel)
        # cv2.imshow('erode',close) 

        cnts,h = cv2.findContours(close,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

        ###画一条线
        cv2.line(frame,(10,line_high),(1200,line_high),(255,255,0),3)
        for (i,c) in enumerate(cnts):
            (x,y,w,h) = cv2.boundingRect(c)
            

            ###过滤(对车辆的宽高进行判断,已验证是否是有效的车辆)
            isValid = (w >= 90) and (h >= 90)
            if(not isValid):
                continue
            ###到这里是有效的车

            cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2) ##绘制车
            cpoint = center(x,y,w,h)
            cars.append(cpoint)

            for(x,y) in cars:
                 ##要有一条线
                ##有范围 6
                ##从数组中减去
                if ((y > line_high - 7) and (y < line_high + 7)):
                    carno += 1
                    cars.remove((x,y))
                    print(carno)
                    
        ###将信息打印出来       
        cv2.putText(frame,"Cars count:"+str(carno),(500,60),cv2.FONT_HERSHEY_SIMPLEX,2,(255,0,0),5)
        cv2.imshow('video',frame)
    
    key = cv2.waitKey(1)
    ###27=左上角esc
    if(key == 27):
        break

cap.release()
cv2.destroyAllWindows()

标签:erode,frame,imshow,cv2,目标,import,识别,###
From: https://www.cnblogs.com/idazhi/p/17289635.html

相关文章

  • 基于PSO的最优路径优化仿真,带GUI界面,可以设置粒子数目,迭代次数,优化目标,输出最优
    1.算法描述PSO从这种模型中得到启示并用于解决优化问题。PSO中,每个优化问题的解都是搜索空间中的一只鸟。我们称之为“粒子”。所有的粒子都有一个由被优化的函数决定的适应值(fitnessvalue),每个粒子还有一个速度决定他们飞翔的方向和距离。然后粒子们就追随当前的最优粒子在解空......
  • 基于贝叶斯判决的手写数字识别系统,带GUI界面
    1.算法描述贝叶斯判别规则是把某特征矢量(x)落入某类集群的条件概率当成分类判别函数(概率判别函数),x落入某集群的条件概率最大的类为X的类别,这种判决规则就是贝叶斯判别规则。贝叶斯判别规则是以错分概率或风险最小为准则的判别规则。判别函数,各个类别的判别区域确定后,可以用......
  • 基于贝叶斯判决的手写数字识别系统,带GUI界面
    1.算法描述      贝叶斯判别规则是把某特征矢量(x)落入某类集群的条件概率当成分类判别函数(概率判别函数),x落入某集群的条件概率最大的类为X的类别,这种判决规则就是贝叶斯判别规则。贝叶斯判别规则是以错分概率或风险最小为准则的判别规则。       判别函数,各个......
  • 基于PSO的最优路径优化仿真,带GUI界面,可以设置粒子数目,迭代次数,优化目标,输出最优
    1.算法描述        PSO从这种模型中得到启示并用于解决优化问题。PSO中,每个优化问题的解都是搜索空间中的一只鸟。我们称之为“粒子”。所有的粒子都有一个由被优化的函数决定的适应值(fitnessvalue),每个粒子还有一个速度决定他们飞翔的方向和距离。然后粒子们就追随当前......
  • 今日总结-采用opencv库实现人脸识别
      实现效果如上经过opencv配置与调用opencv训练好的模板最终一晚上多次尝试实现了人脸识别。后续,会继续努力实现人脸对此与人脸关键点检测。#导入cv模块importcv2ascv#检测函数defface_detect_demo():gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)face_detec......
  • 树莓派@人脸识别
    FaceSampleScript#importthenecessarypackagesfrompicamera.arrayimportPiRGBArrayfrompicameraimportPiCameraimporttimeimportcv2importos#initializethecameraandgrabareferencetotherawcameracaptureImage_Height=128#Settheim......
  • maven compile/install 无法识别第三方引入的jar包
    有的jar包在互联网上并没有,而是自己本地私有的,lib引入后idea正常编译,但是maven无法识别,提示程序包不存在。可以将依赖工程打jar包后直接扔到本工程的WEB-INF/lib下。(可以直接将编译后的class下的几个文件夹压缩成zip,然后直接修改名称为xxx.jar) ......
  • 基于mnist手写数字数据库的深度学习网络训练和数字识别matlab仿真
    1.算法描述        MNIST数据集(MixedNationalInstituteofStandardsandTechnologydatabase)是美国国家标准与技术研究院收集整理的大型手写数字数据库,该数据集包含60000 个于训练的样本和10000 个于测试的样本,图像是固定⼤小(28x28像素),每个像素的值为......
  • 玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测
    玩转JetsonNano(五):TensorRT加速YOLOv5目标检测前言实验环境YOLOv5目标检测克隆下载yolov5项目安装所需的环境下载yolov5s.pt权重测试图片TensorRT加速克隆下载tensorrtx项目转换生成yolov5s.wts文件生成引擎文件编译生成yolov5s.engine文件测试图片常见问题AttributeError:Can‘t......
  • 打电话得小心,系统可以从声音识别你的情绪
    西班牙科学家发明了一套系统可以从人们说的话语中来识别人们的所表达出来的情感。该系统分析了用户的60种声音参数,包括语气,语速,停顿以及声音信号的强度。他们设计的这套系统尤其可以识别消极情绪,包括愤怒,怀疑或者是无聊等。该系统不仅仅从用户的声音像什么来制定分析结论,还......