pythonopencv介绍_树莓派Python opencv对象跟踪简介(三),pythonopenCv,入门,学习,上,实现,物体,追踪...

import numpy as np

import cv2

yellow_lower=np.array([9,135,231])

yellow_upper=np.array([31,255,255])

//也可以cap = cv2.VideoCapture(“../test.avi”)

cap=cv2.VideoCapture(0)

//3:在视频流的帧的宽度 320:高度的数值

//4:在视频流的帧的高度 249: 宽度的数值

cap.set(3,320)

cap.set(4,240)

while 1:

/**

cap.read()按帧读取视频,ret,frame是获cap.read()方法的两个返回值。

其中ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,

它的返回值就为False。frame就是每一帧的图像,是个三维矩阵。

*/

ret,frame=cap.read()

/**

高斯滤波 (5, 5)表示高斯矩阵的长与宽都是5,标准差取0

高斯滤波的含义:

高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,

都由其本身和邻域内的其他像素值经过加权平均后得到。

高斯滤波的作用:

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像

处理的减噪过程。

*/

frame=cv2.GaussianBlur(frame,(5,5),0)

//转hsv(上节课应该深刻理解)

hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)

//取遮罩

mask=cv2.inRange(hsv,yellow_lower,yellow_upper)

/**

腐蚀与膨胀属于形态学操作,所谓的形态学,就是改变物体的形状,

形象理解一些:腐蚀=变瘦 膨胀=变胖( cv2.erode() 和 cv2.dilate())

需要注意一点的是,腐蚀和膨胀主要针对二值化图像的白色部分

iterations的值越高,模糊程度(腐蚀程度)就越高 呈正相关关系且只能是整数

*/

mask=cv2.erode(mask,None,iterations=2)

//高斯滤波

mask=cv2.GaussianBlur(mask,(3,3),0)

//使用遮罩做“与”操作,第二节课研究过了,不在赘述

res=cv2.bitwise_and(frame,frame,mask=mask)

/**

寻找轮廓并绘制轮廓

需要注意的是cv2.findContours()函数接受的参数为二值图,即黑白的(不是灰度

图),所以读取的图像要先转成灰度的,再转成二值图。

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

findContours函数会“原地”修改输入的图像,所以这里.copy()

opencv2返回两个值:contours:hierarchy。注:opencv3会返回三个值,分别是img,

countours, hierarchy cv2.findContours()函数首先返回一个list,list中每个元素都是

图像中的一个轮廓,用numpy中的ndarray表示。

contours:

返回的轮廓 每个轮廓是一个ndarray,每个ndarray是轮廓上的点的集合。

每一个元素为一个3维数组(其形状为(n,1,2),其中n表示轮廓点个数,2表示像素点坐标

hierarchy:

每条轮廓对应的属性,轮廓间的层次关系,为三维数组,形状为(1,n,4),其中n表示轮廓总个

数,4指的是用4个数表示各轮廓间的相互关系。第一个数表示同级轮廓的下一个轮廓编号,

第二个数表示同级轮廓的上一个轮廓的编号,第三个数表示该轮廓下一级轮廓的编号,第四

个数表示该轮廓的上一级轮廓的编号

返回的类型是tuple [-2]取出的是list

*/

cnts=cv2.findContours(mask.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[-2]

if len(cnts)>0:

//寻找面积最大的轮廓并画出其最小外接圆(cv2.contourArea按最大面积)

cnt=max(cnts,key=cv2.contourArea)

/**

得到包含二维点集的最小圆

InputArray points:输入的二维点集

Point2f& center:表示输出的圆形的中心坐标,是float型

float& radius:输出的最小圆的半径,是float型

*/

(x,y),radius=cv2.minEnclosingCircle(cnt)

/**

根据给定的圆心和半径等画圆

img:输入的图片data

center:圆心位置

radius:圆的半径

color:圆的颜色

thickness:圆形轮廓的粗细(如果为正)。负厚度表示要绘制实心圆。

lineType: 圆边界的类型。

shift:中心坐标和半径值中的小数位数。

*/

cv2.circle(frame,(int(x),int(y)),int(radius),(255,0,255),2)

//输出物体的位置坐标

print(int(x),int(y))

else:

pass

cv2.imshow('frame',frame)

cv2.imshow('mask',mask)

cv2.imshow('res',res)

if cv2.waitKey(5)&0xFF==27:

break

cap.release()

cv2.destroyAllWindows()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值