OpenCV(一)基础API

文章目录

  • 前言
  • 一、图像显示
  • 二、图像模糊
  • 三、图像特征检测
  • 四、图像特征匹配
  • 五、RTSP流读取

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zqKTv8PN-1667143294605)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/公众号横幅-1.png)]

以下内容是在学习过程中的一些笔记,难免会有错误和纰漏的地方。如果造成任何困扰,很抱歉。

前言

OpenCV是计算机视觉中经典的专用库,具备支持多语言、跨平台的优点,OpenCV-Python为OpenCV提供了Python接口,这样使用者在Python中能够调用C/C++,从而在保证易读性和运行效率的前提下,实现所需的功能。

在深度学习领域中,通过在图像、视频中获取到相应的目标而进行业务分析,那么OpenCV在这里的作用是必不可少。

一、图像显示

import cv2

# 读取图片
image = cv2.imread("C:/Users/13544/Desktop/qqq.png", cv2.IMREAD_UNCHANGED)

# 尺寸: (1080, 1920, 4)
# 所占内存大小: 8294400
# 存储图像使用的数据类型: uint8
print("尺寸:",image.shape)
print("所占内存大小:",image.size)
print("存储图像使用的数据类型:",image.dtype)

# 图像存储
cv2.imwrite("C:/Users/13544/Desktop/qqq2.png",image)

# 打开图片 第一个参数为窗口标题
cv2.imshow("www", image)

# 等待键盘输入
cv2.waitKey(0)

其中,imread包含了两个入参,fileName及flags,第一个参数filename是图像地址,即使图像路径错误,也不会引发任何错误,但是在打印图像时系统会给出None;第二个参数flags是一个标志,指定了读取图像的方式:

  • cv2.IMREAD_COLOR:加载彩色图,任何图像的透明度都会被忽视,它是默认参数值可以用1代替。
  • cv2.IMREAD_GRAYSCALE:以灰度模式(黑白图像)加载图像,可以用0代替。
  • cv2.IMREAD_UNCHANGED:加载图像,包括alpha通道,可以用-1代替。

该函数返回修改后的图像数字矩阵,其中维度如下:

  • (M,N)灰度图

  • (M,N,3)RGB彩色图

二、图像模糊

import cv2
import matplotlib.pyplot as plt

image = cv2.imread("C:/Users/13544/Desktop/qqq.png", 0)

blur_demo = cv2.blur(image, (5, 5))  # 均值滤波
medianBlur_demo = cv2.medianBlur(image, (5))  # 中值滤波
GaussianBlur_demo = cv2.GaussianBlur(image, (5, 5), 0)  # 高斯滤波

均值滤波是指通过将图像与低通滤波器内核进行卷积来实现图像模糊,这对于消除噪声很有用。它实际上从图像中消除了高频部分(如噪声、边缘)。因此,在此操作中会使边缘有些模糊(利用一些模糊技术也可以不模糊边缘)。

中值滤波模板使用卷积框中像素的中值代替中心值,从而达到去噪声的目的。

对于高斯模板,需要制定的是高斯核的高和宽(奇数),以及沿x方向与y方向的标准差(如果只给出x,则y=x;如果将x和y都设置为0,那么函数会自己计算)。高斯核可以有效地去除图像的高斯噪声

三、图像特征检测

(1)通过Canny边缘检测算法,获取图像中的边缘、轮廓与角点,它是一个多阶段的算法,包括:

  1. 噪声去除
  2. 计算图像梯度
  3. 非极大值抑制
  4. 滞后阈值

下面通过代码演示获取图像边缘效果,首先是原图

过Canny()函数

# 灰度图
image = cv2.imread("C:/Users/13544/Desktop/yuan_qq.jpg", 0)

# 使用Canny边缘检测算法 配合滞后阈值处理图像
edg = cv2.Canny(image, 200, 300)

# 打开图片 第一个参数为窗口标题
cv2.imshow("www", edg)

# 等待键盘输入
cv2.waitKey(0)

查看效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vTw12AVc-1667143294606)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/opencv-边缘检测效果图-1.png)]

(2)轮廓就是临近的像素点连接而成的曲线,具有相同的颜色或灰度。轮廓检测常被应用于目标检测、物体检测中,cv2.findContours()是OpenCV中常用的查找轮廓函数,入参如下

contours, hierarchy = cv2.findContours(
    thresh,
    cv2.RETR_TREE,
    cv2.CHAIN_APPROX_SIMPLE
)
  • thresh:代表进行二值化处理后的图像
  • cv2.RETR_TREE:代表轮廓显示方式,该方式可以显示所有轮廓
  • cv2.CHAIN_APPROX_SIMPLE:代表轮廓存储方式,只存储直线型轮廓的两个端点,节省返回值contours的存储内存
  • 返回值contours是轮廓的坐标点
  • 返回值hierarchy是轮廓的层析结构,用来查看当前轮廓内外是否包含其他轮廓

cv2.drawContours()是OpenCV中常用的绘制轮廓函数,入参如下

img = cv2.drawContours(image, contours, -1, (0, 0, 255), 2)
  • image:原始图像数据
  • contours:轮廓坐标
  • -1代表全部轮廓
  • (0, 0, 255)代表轮廓颜色,按照GBR格式
  • 2表示绘制的线宽为2像素

下面查看代码示例

import cv2

# 灰度图
image = cv2.imread("C:/Users/13544/Desktop/qqq.png", 0)

# 使用二进制方式处理图像 像素在182-255的数据为1 小于182的数据为0
ret, thresh = cv2.threshold(image, 182, 255, 0)

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

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

cv2.imshow("www", img)
cv2.waitKey(0)

原图

OpenCV(一)基础API_第1张图片

效果图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7HoYUNGn-1667143294607)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/opencv-一个案例的效果图-1.png)]

四、图像特征匹配

图像特征匹配可以帮助用户识别图像中的物体种类,如果用户使用另一张图像和当前图像做对比,就可以判断出两张图像中的物体是否是同一种类,从而达到匹配效果

  • FAST角点提取
  • BRIEF对前一步提取的特征点的周围图像区域进行描述
  • ORB关键点检测与匹配
  • Brute-Force/FLANN匹配器

使用Brute-Force匹配器,匹配两张图像数据

import cv2

# 灰度图
image1 = cv2.imread("C:/Users/13544/Desktop/watch1.jpg", 0)
image2 = cv2.imread("C:/Users/13544/Desktop/watch2.jpg", 0)

# 使用Brute-Force匹配器 并使用汉明距离计算进行交叉校验
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
# 查找最佳匹配
matches = bf.match(image1, image2)
# 将距离差排序
matches = sorted(matches, key=lambda x: x.distance)

五、RTSP流读取

直接上案例,下面注释的部分大多为读取视频信息包括帧率,每帧图像大小,内容等信息。

#!/bin/python
#### in rtsp server:
####  ffserver -f /etc/ffserver.conf &
#### ffmpeg -f v4l2 -i /dev/video0  -s 640x480 -r 24 -vcodec libx264 -an http://127.0.0.1:8090/feed1.ffm
import cv2

if __name__ == "__main__":
    cap = cv2.VideoCapture("rtsp://admin:[email protected]:33554/h264/ch1/main/av_stream")
    if cap.isOpened():
        ret, frame = cap.read()
        #    print "==== ret ===="
        #    print ret
        #    print "====print dir(frame)===="
        #    print dir(frame)
        #    print "====print frame.shape===="
        #    print frame.shape
        #    print "====print (frame.shape[0], frame.shape[1], frame.shape[2])===="
        #    print (frame.shape[0], frame.shape[1], frame.shape[2])
        #    print "====print frame.size===="
        #    print frame.size
        #    print "====print frame.data===="
        #    #print frame.data
        #    #print type(frame.data)
        #    print "====print frame.copy===="
        #    print frame.copy
        #    print type(frame.copy)
        #    print "====print frame.ctypes===="
        # -------------------------------------------------------------------------------------------
        # !! frame.ctypes.data_as(c_char_p/c_void_p/...) 可以将python opencv读取到的图像转为
        #  C语言某种格式,在python传递参数给C语言的库时很有用。
        #  frame.ctypes.data_as(c_char_p):将一帧图像的内存地址转换为C语言char*型
        # -------------------------------------------------------------------------------------------
        print
        frame.ctypes
        print
        type(frame.ctypes)
        print
        "====print frame.imag===="
        # print frame.imag
        # print type(frame.imag)
        print
        "====print frame.tobytes===="
        print
        frame.tobytes
        print
        type(frame.tobytes)

    ##cap.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH,640)
    ##cap.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT,480)
    while cap.isOpened():
        ret, frame = cap.read()
        print(frame.shape[0], frame.shape[1], frame.shape[2])
        #    print ret
        #    print dir(frame)
        #    print frame.shape
        #    print frame.size
        #    print frame.data
        cv2.imshow("frame", frame)
        cv2.waitKey(10)

后续章节将通过RTSP流的实时信息进行目标检测识别。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lUnJp7iY-1667143294607)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/小星球-1.png)]

你可能感兴趣的:(机器学习,python,计算机视觉,人工智能)