目录
Opencv-Python入门
文章目录
Opencv介绍
一、环境部署
二、使用步骤
1.引入库
2.读取本地图片并显示
3.图片数据结构
4.使用numpy数组生成图像
5.常用的图像颜色处理
1.RGB图像转灰度图
2.图像模糊
3.图像二值化
6.摄像头操作
7.目标检测
总结
OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉处理开源软件库,是由Intel公司俄罗斯团队发起并参与和维护,支持与计算机视觉和机器学习相关的众多算法,以BSD许可证授权发行,可以在商业和研究领域中免费使用,第一个公开版从2000年开始公布。OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序,该程序库也可以使用英特尔公司的IPP进行加速处理。
opencv支持Windows,Linux,Mac OS平台,库文件使用C与少量的C++开发,接口语言支持C++,Python,Java,MATLAB
numpy安装,numpy库用于多维数组高效处理。
pip install numpy
opencv安装,目前最新版本为4.6.0.66。
pip install opencv-python
import cv2
import numpy as np
读取本地图片“panada.png"并显示,使用cv2自带的延时函数阻塞,一直显示,直到手动关闭窗口
img = cv2.imread('panada.png')
cv2.imshow('img',img)
cv2.waitKey(0)
图片img的shape为720,1280,3,分别对应宽(pixel),高(pixel),颜色[B,G,R]。
对象类型为numpy的3个维度的ndarray,数据类型是uint8,其中第三维度的颜色BGR分别为8bit的uint8,是使用24位色格式。
手动创建3维numpy数组,高5,宽2,24位色
#create height5, width2,color3 ndarray
arr_img=np.zeros((5,2,3),dtype=np.uint8)
#set color BGR[0,128,255]
arr_img[:,:,:]=[0x00,0x80,0xff]
print(arr_img)
打印数组内容:
[[[ 0 128 255]
[ 0 128 255]]
[[ 0 128 255]
[ 0 128 255]]
[[ 0 128 255]
[ 0 128 255]]
[[ 0 128 255]
[ 0 128 255]]
[[ 0 128 255]
[ 0 128 255]]]
由于5*2像素的图片太小,把图片resize放大50倍,然后显示:
arr_img=cv2.resize(arr_img,None,None,fx=50,fy=50)
cv2.imshow('arr_img',arr_img)
cv2.waitKey(0)
改变数组内容把中心点到右下部分变成蓝色:
arr_img[125 : ,50 : , : ]=[0xff,0x00,0x00]
cv2.imshow('arr_img',arr_img)
cv2.waitKey(0)
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray',img_gray)
图像模糊原理为卷积,根据模糊核的size执行平均操作,常用于图像滤波效果,减少噪点。
img_blur = cv2.blur(img_gray,(8,8))
大部分的图像形态学操作都使用二值化图像,下面代码为180-255数值的像素点变成白色,0-179范围的像素点变成黑色。
ret,img_bin = cv2.threshold(img_blur,180,255,cv2.THRESH_BINARY)
cv2.imshow('img_bin',img_bin)
打开电脑的摄像头,本地支持笔记本电脑自带的摄像头,usb外接摄像头,按系统上的摄像头顺序索引,下面代码使用第0个摄像头,设置读取摄像头的分辨率,帧率,然后读取图像,并显示
由于笔记本的摄像头是左右镜像显示,所以代码中对图像进行左右翻转操作。
capture = cv2.VideoCapture(0)
capture.set(cv2.CAP_PROP_FRAME_WIDTH,640)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT,320)
capture.set(cv2.CAP_PROP_FPS, 30)
size = (int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)), int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
fps = capture.get(cv2.CAP_PROP_FPS) #获取视频的帧率
while True:
ret,img = capture.read()
img = cv2.flip(img,1)
cv2.imshow('img',img)
cv2.waitKey(int(1000/fps))
流程:
读取图像,
左右镜像翻转,
执行灰阶图,
模糊滤波,
颜色范围过滤,
闭操作(图像形态学操作,先膨胀,再腐蚀,使图像缺失颗粒的地方粘连成一块)
查找轮廓
遍历轮廓设置目标判定条件:
绘制最小外接矩形
判定最小外接矩形的面积范围
判定最小外接矩形的长,宽比例范围
符合条件的轮廓在原始RGB图的位置绘制矩形框。
capture = cv2.VideoCapture(0)
capture.set(cv2.CAP_PROP_FRAME_WIDTH,640)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT,320)
capture.set(cv2.CAP_PROP_FPS, 30)
size = (int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)), int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
fps = capture.get(cv2.CAP_PROP_FPS) #获取视频的帧率
#57 93 81
colTarget=np.array([57,93,81])
lower=colTarget-35
upper=colTarget+35
while True:
ret,img = capture.read()
#flip
img = cv2.flip(img,1)
#zoom out
img = cv2.resize(img,None,None,fx=0.55,fy=0.55)
#bgr to gray
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#gray to blur
img_blur = cv2.blur(img_gray,(8,8))
#blur to bin image
ret,img_bin = cv2.threshold(img_blur,120,255,cv2.THRESH_BINARY_INV)
#img bgr to hsv
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
#mask imgage color between lower and upper setting
mask=cv2.inRange(hsv,lower,upper)
#kernel for close(1.expand,2.erosion)
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(10,6))
mask_close=cv2.morphologyEx(mask,cv2.MORPH_CLOSE,kernel=kernel)
#find contours
contours,hierarchy =cv2.findContours(mask_close,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
#minimum area bounding rectangle
rect = cv2.minAreaRect(contour)
#rectangle to box points
box=cv2.boxPoints(rect)
#double to int
box = np.int64(box)
#set condition: rectangle area range 200-600
if cv2.contourArea(box)<600 and cv2.contourArea(box)>200:
width,height=rect[1]
if width>height:
rate=width/height
else:
rate=height/width
#set condition: long / short rate range 1-3
if rate>1 and rate<3:
#match condition and draw contour
cv2.drawContours(img,[box],0,(0,0,255),1)
#show rgb img , mask color img(bin) , mask close img(bin)
cv2.imshow('img',img)
cv2.imshow('mask',mask)
cv2.imshow('mask_close',mask_close)
#delay
cv2.waitKey(int(1000/fps))
opencv适合做一些有规律的图像操作,图像处理,需要快速开发使用python,部署在产品上一般使用C++,移动端使用java。
若进行复杂的检测,使用前沿的深度学习框架的效果比opencv自带的机器学习好。