Zen的小站

小舟从此逝,江海寄余生

0%

【CV2】图像处理

文章概览

opencv库用于图像处理,包含很多常用算法。此外更可以读取图片,控制摄像头外设

摄像头

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
capture = cv2.VideoCapture(0)	# 声明摄像头对象
ret, frame = capture.read() # 读取摄像头,ret是bool型表示成功与否,frame是图像
# 第一次读取图像很慢会,用0.5s左右,之后每次3ms左右

# 摄像头设置
self.capture.set(cv2.CAP_PROP_EXPOSURE, value)
"""
设置的参数 含义 值
CV_CAP_PROP_FPS 帧数 30
CV_CAP_PROP_BRIGHTNESS 亮度 -64 ~ 64
CV_CAP_PROP_CONTRAST 对比度 0 ~ 95
CV_CAP_PROP_SATURATION 饱和度 0 ~ 100
CV_CAP_PROP_HUE 色调 -2000 ~ 2000
CV_CAP_PROP_EXPOSURE 曝光度 -10 ~ -4
CAP_PROP_AUTO_EXPOSURE 自动曝光 1 or 0
自动曝光会调整曝光时间和曝光度, 很重要

"""

读取保存

1
2
3
4
img = cv2.imread('qwer.png')	# 读取
cv2.imwrite('asdf.png', img) # 保存
cv2.imshow('asdf.png', img) # 显示
cv2.waitKey(0) # 保持图片显示状态

数据处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 找到一组数中最值,相应位置
min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(result)

# 找到二值化图像的色块
cnts, hierarchy = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 寻找白块

# 求色块面积
S = cv2.contourArea(cnt)

# 找到包围色块的矩形
x, y, w, h = cv2.boundingRect(cnt)

# 找到包围色块的最小矩形,可能是歪着的
cv2.minAreaRec

特殊操作

1
2
3
4
5
# 模板匹配
# 把img在template中所有位置匹配,返回一个黑白图像,图像的值表示该位置的匹配相似度
result = cv2.matchTemplate(img, template, 1) # 数字 1 表示匹配方法

#

信号处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 均值滤波(均值)
img_mean = cv2.blur(img, (11,11))
# 高斯滤波(反距离权重)
img_guass = cv2.GaussianBlur(img, (11,11), 2, 1)
# 中值滤波(统计中值)(去除椒盐噪声,保持物体边界)
img_mid = cv2.medianBlur(img, 11)
# 高通低通滤波(高通锐化、低通模糊)(不清楚卷积核怎么确定)
kernel_3x3 = np.array([[-1/9, -1/9, -1/9],
[-1/9, 8/2, -1/9],
[-1/9, -1/9, -1/9]])
img_high = cv2.filter2D(img, 3, kernel_3x3)
# 傅里叶变换
img_gray = cv2.imread("1.jpg", 0)
dft = cv2.dft(np.float32(img_gray), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
def magnitude(x, y):
x_m = x * x
y_m = y * y
z_m = x_m + y_m
return np.sqrt(z_m)
magnitude_spectrum2 = 20 * np.log10(magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
plt.imshow(magnitude_spectrum2, cmap="gray")

图像处理

坐标值必须是整数

1
2
# 绘制矩形框
cv2.rectangle(img,left_top,right_bottom, 0, 3) # 0 表示颜色黑色;3 表示线粗细,若为负数,实心填充

附件

1
2
3
4
5
6
7
8
9
10
11
# 创建窗口
cv2.namedWindow('image', cv2.WINDOW_AUTOSIZE)
# 滑动条
# 1.滑动条名 2.窗口名 3、4.函数传值范围 5.函数(函数要有传值)
cv2.createTrackbar('H low', 'image', 0, 179, h_low)
##########举例############
def h_low(value):
print(value)
cv2.namedWindow('image', cv2.WINDOW_AUTOSIZE)
cv2.createTrackbar('H low', 'image', 0, 179, h_low)
cv2.waitKey(0)

多想多做,发篇一作

-------------本文结束感谢您的阅读-------------
// 在最后添加