OpenCV-Python入门1——OpenCV简介与常用图像处理,目标检测

Opencv-Python入门


文章目录

目录

Opencv-Python入门

文章目录

Opencv介绍

一、环境部署

二、使用步骤

1.引入库

2.读取本地图片并显示

 3.图片数据结构

4.使用numpy数组生成图像

5.常用的图像颜色处理

1.RGB图像转灰度图

2.图像模糊

3.图像二值化

6.摄像头操作

7.目标检测

总结



Opencv介绍

 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

二、使用步骤

1.引入库

import cv2
import numpy as np

2.读取本地图片并显示

读取本地图片“panada.png"并显示,使用cv2自带的延时函数阻塞,一直显示,直到手动关闭窗口

img = cv2.imread('panada.png')
cv2.imshow('img',img)

cv2.waitKey(0)

OpenCV-Python入门1——OpenCV简介与常用图像处理,目标检测_第1张图片

 3.图片数据结构

图片img的shape为720,1280,3,分别对应宽(pixel),高(pixel),颜色[B,G,R]。

对象类型为numpy的3个维度的ndarray,数据类型是uint8,其中第三维度的颜色BGR分别为8bit的uint8,是使用24位色格式。

OpenCV-Python入门1——OpenCV简介与常用图像处理,目标检测_第2张图片

4.使用numpy数组生成图像

手动创建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)

OpenCV-Python入门1——OpenCV简介与常用图像处理,目标检测_第3张图片

改变数组内容把中心点到右下部分变成蓝色:

arr_img[125 : ,50 : , : ]=[0xff,0x00,0x00]
cv2.imshow('arr_img',arr_img)
cv2.waitKey(0)

 OpenCV-Python入门1——OpenCV简介与常用图像处理,目标检测_第4张图片

5.常用的图像颜色处理

1.RGB图像转灰度图

img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray',img_gray)

OpenCV-Python入门1——OpenCV简介与常用图像处理,目标检测_第5张图片

2.图像模糊

图像模糊原理为卷积,根据模糊核的size执行平均操作,常用于图像滤波效果,减少噪点。


    img_blur = cv2.blur(img_gray,(8,8))

 OpenCV-Python入门1——OpenCV简介与常用图像处理,目标检测_第6张图片

3.图像二值化

 大部分的图像形态学操作都使用二值化图像,下面代码为180-255数值的像素点变成白色,0-179范围的像素点变成黑色。

ret,img_bin = cv2.threshold(img_blur,180,255,cv2.THRESH_BINARY)
cv2.imshow('img_bin',img_bin)

OpenCV-Python入门1——OpenCV简介与常用图像处理,目标检测_第7张图片

6.摄像头操作

打开电脑的摄像头,本地支持笔记本电脑自带的摄像头,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))

7.目标检测

流程:

读取图像,

左右镜像翻转,

执行灰阶图,

模糊滤波,

颜色范围过滤,

闭操作(图像形态学操作,先膨胀,再腐蚀,使图像缺失颗粒的地方粘连成一块)

查找轮廓

遍历轮廓设置目标判定条件:

        绘制最小外接矩形

        判定最小外接矩形的面积范围

        判定最小外接矩形的长,宽比例范围

        符合条件的轮廓在原始RGB图的位置绘制矩形框。

OpenCV-Python入门1——OpenCV简介与常用图像处理,目标检测_第8张图片

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自带的机器学习好。

你可能感兴趣的:(python,opencv,图像识别,python,opencv)