【Python】【opencv】学习笔记

Python opencv库

本文为笔者近期学习opencv的学习笔记。基本跟着OpenCV 4.0 中文文档来学习。


系统:windows10
IDE:: pycharm

一、cv2的函数与演示示例

(一)图像操作

1)cv2.imread()

参考文献 :https://opencv.apachecn.org/#/docs/4.0.0/2.1-tutorial_py_image_display


使用该函数来读取图片,可以有如下示例:

import cv2
# 用灰度模式加载图像
img = cv2.imread(r'F:\pythonProject\material\vivid_1.jpg', 0)

其中,第一个参数(引号部分)是图像的位置。第二个参数是一个标志,表示以何种形式来读取图像。

第二个参数的1,0,-1分别对应下列各个模式:
1 :cv2.IMREAD_COLOR:加载彩色图像,任何图像的透明度都会被忽略,它是默认标志
0 :cv2.IMREAD_GRAYSCALE:以灰度模式加载图像
-1 :cv2.IMREAD_UNCHANGED:加载图像,包括 alpha 通道


2)cv2.imshow()

有如下示例:

cv2.imshow('image', img)

第一个参数是创建的窗口名称,第二个参数是显示的图像的数据。

3)cv2.imwrite()

import cv2
img = cv2.imread(r'F:\pythonProject\material\vivid_1.jpg')
cv2.imwrite(r'F:\pythonProject\material\vivid_3.jpg',img)

用imread以默认模式读取图片,用imwrite保存图片。
cv2.write()中的第一个参数是保存文件的地址与名称,第二个参数是读取图片的信息。

3)cv2.waitKey()

等待用户键盘输入值。
例如:

cv2.waitKey(0)

如果用户没有按下键,则继续等待
见 : 设置 waitKey(0) , 则表示程序会无限制的等待用户的按键事件


    # 等待用户的输入,期间停止1ms
    c = cv2.waitKey(1)

    # 如果用户输入esc则退出
    if c == 27:
        break

等待用户输入对应特定ASCII码的数,然后退出循环。

4)cv2.destroyAllWindows()

销毁我们创建的所有窗口。可以用作销毁特定的窗口。

5)cv2.filter2D()

该函数取一个像素点周围的方阵点来对该点像素进行计算,具体的原理可以部分参考下面的链接:https://blog.csdn.net/weixin_40922285/article/details/102801633
这个时候应该会涉及到“卷积”这一个词了,关于这个词的解释推荐下面的视频链接:https://www.bilibili.com/video/BV1VV411478E/?spm_id_from=333.337.search-card.all.click&vd_source=ae33eae3c765a935fff56de0aa3c4fae

5)cv2.blur()

该函数取一个像素点周围的方阵点来对该点像素进行计算,具体的原理可以部分参考下面的链接:https://blog.csdn.net/weixin_40922285/article/details/102801633
这个时候应该会涉及到“卷积”这一个词了,关于这个词的解释推荐下面的视频链接:https://www.bilibili.com/video/BV1VV411478E/?spm_id_from=333.337.search-card.all.click&vd_source=ae33eae3c765a935fff56de0aa3c4fae

6)cv2.boxFilter()

参考链接:https://blog.csdn.net/qq_49478668/article/details/123342188

(二)视频操作

1)cv2.VideoCapture()

VideoCapture()中参数是0,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频
例如下面的示例:

cap = cv2.VideoCapture(0)
cap = cv2.VideoCapture(r'F:\pythonProject\material\vd_vi_1.mp4')

2)cap.read()

ret, frame = cap.read()返回值含义:
参数ret 为True 或者False,代表有没有读取到图片,可以用来判断是否到达视频结尾。
第二个参数frame表示截取到一帧的图片

3)cv2.cvtColor()

参考文献链接:https://blog.csdn.net/duwangthefirst/article/details/79956616
图片文件的转换,将颜色进行更改,实质是改变多维数组的值或者维度。
例如将图片转化为黑白:

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

将frame图片另存为黑白的gray图片

(三)绘图,标示

1)cv2.line()

画直线代码示例:

cv2.line(img,(0,0),(511,511),(255,0,0),5)

第一个参数是图像对象
第二个参数是起始像素点的坐标
第三个参数是终止像素点的坐标
第四个参数是RGB的数值,即颜色
第五个参数是线的宽度

2)cv2.rectangle()

画矩形代码示例:

cv2.rectangle(img,(384,0),(510,128),(0,255,0),3)

第一个参数是图像对象
第二个参数是左上顶点像素点的坐标
第三个参数是右下顶点像素点的坐标
第四个参数是RGB的数值,即颜色
第五个参数是线的宽度

3)cv2.circle()

参考链接:https://blog.csdn.net/viven_hui/article/details/102807995
画圆代码示例:

cv2.circle(img,(447,63), 63, (0,0,255), -1)

第一个参数是图像对象
第二个参数是圆形中点坐标
第三个参数是半径长度(以一像素点为单位长度)
第四个参数是RGB的数值,即颜色
第五个参数是线的宽度,若值为负,则其为实心圆

4)cv2.cornerHarris()

该函数找寻图像中一切符合Harris角的像素点。
下面转载opencv中文文档
OpenCV 中的 cv.cornerHarris() 函数用来实现 Harris 角点检测。它的参数是:

img - 输入图像,应为 float32 类型的灰度图。
blockSize - 角点检测所考虑的邻域大小。
ksize - Sobel 导数的内核大小。
k - Harris 检测器方程中的自由参数。
代码示例:

dst = cv.cornerHarris(gray,2,3,0.04)

二、演示示例

1.人脸识别代码:

# 导入opencv库
import cv2
#  打开摄像头
camera = cv2.VideoCapture(0)
# 读取写录特征文件
face_casecade = cv2.CascadeClassifier(r'F:\pythonProject\cater_mydear\haarcascade_frontalface_default.xml')

while (True):
    # 保证有图像返回
    ret, frame = camera.read()
    if ret:
        # frame为三维RGB图像,将其改为gray_img二位灰度图像
        gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        face = face_casecade.detectMultiScale(gray_img, 1.3, 3)
        for (x, y, w, h) in face:
            # 画矩形框     左上顶点坐标   右下顶点坐标   矩形框的颜色  矩形框的边框厚度
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
            #  显示矩形中心位置
            print("(x:", (x * 2 + w) / 2, ",y:", (y * 2 + h) / 2, ")")
            cv2.imshow("camera", frame)
            
            key_boom = cv2.waitKey(1)
            if key_boom == 27 :
                break

# 释放摄像头占用
camera.release()
# 关闭所有窗口
cv2.destroyAllWindows()

2.图像的读取、显示与保存

# 本案例用来提取和显示图片
import cv2
# 用灰度模式加载图像
img = cv2.imread(r'F:\pythonProject\material\vivid_1.jpg', 0)
# 显示图像
cv2.imshow('image', img)
# 另存图像
cv2.imwrite(r'F:\pythonProject\material\vivid_3.jpg',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

该案例中,可以选用多种模式读取图片,下面是不同模式的对比,只需要改变第四行代码中第二个参数的值便可以完成多种模式的选取。下列图像分别对应着 原图,1.0.-1模式图像
不同模式下的图片显示

3.多图像显示

3.1显示在一个窗口中

import cv2
import numpy as np

img = cv2.imread(r'F:\pythonProject\material\vivid_1.jpg')
ipk = cv2.imread(r'F:\pythonProject\material\vivid_1.jpg')
sum_img = np.hstack([img,ipk])
cv2.imshow('image_1', sum_img)
cv2.waitKey(0)
cv2.destroyWindows('image_1')

效果如图所示:
合并图

3.2 显示在不同窗口中

import cv2
import numpy as np

img = cv2.imread(r'F:\pythonProject\material\vivid_1.jpg')
ipk = cv2.imread(r'F:\pythonProject\material\vivid_1.jpg',0)

cv2.namedWindow("image_1", cv2.WINDOW_NORMAL)
cv2.resizeWindow('image_1', 500, 1000)
cv2.imshow('image_1', img)

cv2.namedWindow("image_2", cv2.WINDOW_NORMAL)
cv2.resizeWindow('image_2', 500, 1000)
cv2.imshow('image_2', ipk)

cv2.waitKey(0)
cv2.destroyALLWindows()

如下显示:
多窗口显示图像

4.视频文件的显示

import numpy as np
import cv2

cap = cv2.VideoCapture(r'F:\pythonProject\material\vd_vi_1.mp4')
# 获取视频帧率并打印
fps = cap.get(cv2.CAP_PROP_FPS)
print(fps)
while(True):
    # 一帧一帧捕捉
    ret, frame = cap.read()
    # 我们对帧的操作在这里,可以将图片在这一步进行处理,本案例没有处理
    gray = frame
    # 显示返回的每帧
    cv2.imshow('frame',gray)
    if cv2.waitKey(3) & 0xFF == ord('q'):
        break
# 当所有事完成,释放 VideoCapture 对象
cap.release()
cv2.destroyAllWindows()

5.卷积模糊图片

import numpy as np
import cv2
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
# 读取图像信息
img = cv.imread(r'F:\pythonProject\material\vivid_1.jpg',-1)
# 输出的像素点信息 求取5*5矩阵内的平均值
kernel = np.ones((5,5),np.float32)/25
# 新图像
dst = cv.filter2D(img,-1,kernel)
# 绘制展示窗口
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(dst),plt.title('Averaging')
plt.xticks([]), plt.yticks([])
plt.show()

均值模糊处理

6.识别图片中的人脸

import cv2

# 分类器导入
face_casecade = cv2.CascadeClassifier(r'F:\pythonProject\cater_mydear\haarcascade_frontalface_default.xml')
img = cv2.imread(r'F:\pythonProject\material\lcx_ss.jpg')

# gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
face = face_casecade.detectMultiScale(img, 1.3, 3)
for (x, y, w, h) in face:
    # 画矩形框             左上顶点坐标 右下顶点坐标   矩形框的颜色   矩形框的边框厚度
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.imshow('ss',img)
cv2.waitKey(0)

7.批量读取文件并保存

7.1文件命名有规律

import cv2 as cv

for i in range(1,28):
    img = cv.imread('F:\\pythonProject\\material\\log_data\\tre\\'+ str(i) + '.jpg')
    try:
        img = cv.resize(img, (416, 312))
        cv.imshow('sd',img)
        cv.waitKey(0)
        cv.destroyAllWindows()
    except:
        print('NO FOUND')

7.2文件命名无规律,且路径中有中文

import cv2
import os
import numpy as np

def read_path(file_pathname):
    #遍历该目录下的所有图片文件
    i = 1
    for filename in os.listdir(file_pathname):
        print(filename)
        img = cv2.imdecode(np.fromfile(file_pathname+'\\'+filename, dtype=np.uint8), cv2.IMREAD_UNCHANGED)
        img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        image_np=cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
        img1 = cv2.resize(image_np, (40, 40))
        #####save figure
        cv2.imwrite('F:\\pythonProject\\pos\\' + str(i) + '.jpg', img1)  # 保存图片
        i = i + 1

read_path("F:\\pythonProject\\material\\log_data\\tre")
#print(os.getcwd())

三、快速参考文献

ASCII码速查:https://www.asciim.cn/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子非_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值