目录
一、提前准备
1、树莓派4B 及 64位系统
2、提前安装opencv库 以及 numpy库
3、保存一张图片
二、代码详解
这段代码的目的是从一个图像中提取一个由用户定义的多边形区域。首先,它创建了一个掩码,然后在掩码上绘制了一个多边形。接着,它使用这个掩码来提取原始图像中相应的区域。最后,它显示了原始图像、掩码和结果图像。
import cv2 as cv
import numpy as np
src = cv.imread('/home/raspberry4B/Pictures/MD.jpg')
cv.imshow("input", src)
h, w, c = src.shape
# 手工绘制ROI区域
mask = np.zeros((h, w), dtype=np.uint8)
x_data = np.array([124, 169, 208, 285, 307, 260, 175])
y_data = np.array([205, 124, 135, 173, 216, 311, 309])
pts = np.vstack((x_data, y_data)).astype(np.int32).T
cv.fillPoly(mask, [pts], (255), 8, 0)
cv.imshow("mask", mask)
# 根据mask,提取ROI区域
result = cv.bitwise_and(src, src, mask=mask)
cv.imshow("result", result)
cv.waitKey(0)
cv.destroyAllWindows()
h, w, c = src.shape
: 获取图像的高度(h)、宽度(w)和通道数(c)。src.shape
返回一个元组,其中包含图像的维度信息。
mask = np.zeros((h, w), dtype=np.uint8)
: 使用NumPy的zeros
函数创建一个与图像大小相同的全零矩阵,用作掩码(mask)。数据类型设置为np.uint8
,这是因为图像掩码通常使用8位无符号整数。
x_data = np.array([124, 169, 208, 285, 307, 260, 175])
和 y_data = np.array([205, 124, 135, 173, 216, 311, 309])
: 这两行代码定义了一组点的x和y坐标,这些点将用于定义ROI(Region of Interest,感兴趣区域)。
pts = np.vstack((x_data, y_data)).astype(np.int32).T
: 使用NumPy的vstack
函数将x和y坐标堆叠起来,形成一个点的数组。然后将其转换为整数类型(np.int32
),并转置(.T
),以便与OpenCV的函数兼容。
cv.fillPoly(mask, [pts], (255), 8, 0)
: 使用OpenCV的fillPoly
函数在掩码上绘制一个多边形。[pts]
是多边形的顶点数组,(255)
是填充颜色(白色),8
是线宽,0
是操作类型。
result = cv.bitwise_and(src, src, mask=mask)
: 使用OpenCV的bitwise_and
函数应用掩码。这个函数将原始图像与掩码进行按位与操作,只保留掩码中为白色的区域,其他区域将变为黑色。
三、运行现象
四、完整工程贴出
持续更新中……