openCV快速入门
内容目录

参考教学视频:https://www.youtube.com/watch?v=WQeoO7MI0Bs

读取并展示图片


import cv2  

从指定路径下读取图片

img = cv2.imread("resources/111.jpg")

在“Out123put”窗口展示img图片

cv2.imshow("Out123put",img)

窗口延迟消失(0则是一直不消失,1则是1毫秒)

cv2.waitKey(0)

![image.png|233](https://typora-picture-myself.oss-cn-hangzhou.aliyuncs.com/img/20231007220610.png)

# 读取并展示视频
## 本地视频
```python
import cv2  

# 从指定路径下读取视频  
cap = cv2.VideoCapture("resources/video.mp4")  
# 视频播放的原理是逐帧播放,因此也是逐帧获取图片并展示  
while True:  
    # read()返回两个参数,success为布尔值,表示是否获取成功,img存储图片  
    success, img = cap.read()  
    # 在“Video”窗口展示img图片  
    cv2.imshow("Video",img)  
    # 如果按键盘q,则退出(此处不重要  
    if cv2.waitKey(1) & 0xFF == ord('q'):  
        break

本地摄像头

import cv2  

# 0默认摄像头(一般是电脑自带摄像头,若有多个摄像头要自己设置id参数  
cap = cv2.VideoCapture(0)  
# set(3,xxx)表示设置宽度  
cap.set(3,640)  
# set(4,xxx)表示设置高度  
cap.set(4,480)  
# set(10,xxx)表示设置亮度(但是我没感受到)  
cap.set(10,10000)  

while True:  
    success, img = cap.read()  
    cv2.imshow("Video",img)  
    if cv2.waitKey(1) & 0xFF == ord('q'):  
        break

image.png|275

图片的灰度/模糊/边缘检测/膨胀/腐蚀

import cv2  
import numpy as np  

img = cv2.imread("resources/111.jpg")  
kernel = np.ones((5,5),np.uint8)  

# 转化颜色,这里是将RGB(在openCV中用BGR表示)转化为Gray  
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  
# 添加模糊(后面两个参数暂时不展开)  
imgBlur = cv2.GaussianBlur(imgGray,(7,7),0)  
# 边缘检测  
imgCanny = cv2.Canny(img,100,100)  
# 膨胀,可以理解为让imgCanny中的边缘变厚  
imgDialation = cv2.dilate(imgCanny,kernel,iterations=1)  
# 腐蚀,无法理解  
imgEroded = cv2.erode(imgDialation,kernel,iterations=1)  

cv2.imshow("Gray Image",imgGray)  
cv2.imshow("Blur Image",imgBlur)  
cv2.imshow("Canny Image",imgCanny)  
cv2.imshow("Dialation Image",imgDialation)  
cv2.imshow("Eroded Image",imgEroded)  
cv2.waitKey(0)

image.png

image.png

openCV中的xy轴

image.png

图片缩放与切割

import cv2  

img = cv2.imread("resources/111.jpg")  
# 可以通过.shape来获取图片的大小参数,此处返回(442, 442, 3)  
print(img.shape)  
# 将img的大小变成(300,200),此处300为宽度,200为高度  
imgResize = cv2.resize(img,(300,200))  
# 裁剪img,将图片想象成矩阵(即每个点都是矩阵中一个位置)  
imgCropped = img[0:200,100:400]  

cv2.imshow("Image",img)  
cv2.imshow("Image Resize",imgResize)  
cv2.imshow("Image Cropped",imgCropped)  

cv2.waitKey(0)

image.png

绘制图片

基础

import cv2  
import numpy as np  

# 建立一个512*512*3的矩阵,512*512是矩阵大小,3意味着3通道,因此可以实现彩色  
img = np.zeros((512,512,3),np.uint8)  

# 为图片着色(类似于切割图片),若是img[:]则表示所有像素点  
img[200:300,100:300] = 255,0,0  

cv2.imshow("Image",img)  

cv2.waitKey(0)

|400

更多

import cv2  
import numpy as np  

# 建立一个512*512*3的矩阵,512*512是矩阵大小,3意味着3通道,因此可以实现彩色  
img = np.zeros((512,512,3),np.uint8)  
# 绘制线条和矩阵,四个参数分别是,起点坐标,终点坐标,颜色,厚度(可以用cv2.FILLED表示填充))  
cv2.line(img,(0,0),(img.shape[1],img.shape[0]),(0,255,0),3)  
cv2.rectangle(img,(0,0),(300,300),(0,0,255),3)  
# 绘制圆形,四个参数分别是,中点,半径,颜色,厚度  
cv2.circle(img,(400,50),30,(255,255,0),5)  
# 写字,几个参数分别是,内容,区域,字体,比例,颜色,厚度  
cv2.putText(img,"Hello World",(300,100),cv2.FONT_HERSHEY_COMPLEX,1,(0,150,0),1)  

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

image.png|325

透视变换

width,height = 250,350  
# 定义了输入图像中要进行透视变换的区域的四个角的坐标
pts1 = np.float32([[111,219],[287,188],[154,482],[352,440]])  
# 定义了输出图像中的对应四个角的坐标
pts2 = np.float32([[0,0],[width,0],[0,height],[width,height]]) 
# 计算从 pts1pts2 的透视变换矩阵 matrix,
matrix = cv2.getPerspectiveTransform(pts1,pts2)  
# 执行实际的透视变换操作.接受输入图像 img 和透视变换矩阵 matrix 作为输入,并将变换后的图像存储在 imgOutput 中。输出图像的大小为 (width, height)。
imgOutput = cv2.warpPerspective(img,matrix,(width,height))

image.png|275

拼接图片

import cv2  
import numpy as np  

img = cv2.imread('resources/111.jpg')  
# 水平拼接图片 与 垂直拼接图片  
imgHor = np.hstack((img,img,img))  
imgVer = np.vstack((img,img))  

cv2.imshow("Horizontal",imgHor)  
cv2.imshow("Vertical",imgVer)  
cv2.waitKey(0)

image.png
image.png|193

注:有更好的拼接方法

利用掩码实现颜色分割

import cv2
import numpy as np

# 定义一个空的回调函数,稍后在创建的滑动条中使用
def empty(a):
    pass

# 图片文件路径
path = 'resources/111.jpg'

# 创建一个名为 "TrackBars" 的窗口,并设置窗口大小
cv2.namedWindow("TrackBars")
cv2.resizeWindow("TrackBars", 640, 240)

# 创建六个滑动条,分别用于调整颜色过滤的参数
cv2.createTrackbar("Hue Min", "TrackBars", 0, 179, empty)
cv2.createTrackbar("Hue Max", "TrackBars", 179, 179, empty)
cv2.createTrackbar("Sat Min", "TrackBars", 0, 255, empty)
cv2.createTrackbar("Sat Max", "TrackBars", 255, 255, empty)
cv2.createTrackbar("Val Min", "TrackBars", 0, 255, empty)
cv2.createTrackbar("Val Max", "TrackBars", 255, 255, empty)

# 进入无限循环,直到用户关闭窗口
while True:
    # 读取图像文件
    img = cv2.imread(path)

    # 将图像从BGR颜色空间转换为HSV颜色空间
    imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    # 获取滑动条上的当前值,用于调整颜色过滤的参数
    h_min = cv2.getTrackbarPos("Hue Min", "TrackBars")
    h_max = cv2.getTrackbarPos("Hue Max", "TrackBars")
    s_min = cv2.getTrackbarPos("Sat Min", "TrackBars")
    s_max = cv2.getTrackbarPos("Sat Max", "TrackBars")
    v_min = cv2.getTrackbarPos("Val Min", "TrackBars")
    v_max = cv2.getTrackbarPos("Val Max", "TrackBars")

    # 打印当前滑动条的值,以便调试和调整
    print(h_min, h_max, s_min, s_max, v_min, v_max)

    # 定义HSV颜色空间的下限和上限阈值,用于颜色过滤
    lower = np.array([h_min, s_min, v_min])
    upper = np.array([h_max, s_max, v_max])

    # 使用inRange函数根据阈值创建掩码(mask)
    mask = cv2.inRange(imgHSV, lower, upper)

    # 使用掩码将原始图像与掩码相乘,实现颜色过滤效果
    imgResult = cv2.bitwise_and(img, img, mask=mask)

    # 显示原始图像、HSV图像、颜色过滤后的掩码和最终结果
    cv2.imshow("Image", img)
    cv2.imshow("ImageHSV", imgHSV)
    cv2.imshow("mask", mask)
    cv2.imshow("ImgResult", imgResult)

    cv2.waitKey(1)

image.png

上一篇
下一篇