基于Numpy的数字图像处理,其执行速度确实很慢!于是就搞了一个opencv的玩玩。
#摄像头抓帧+阈值处理
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
count = 1
while True:
retval, img = cap.read()
if not retval:
break
#腐蚀滤波器
filter_erode = np.ones((5,5),np.uint8)
#灰度变换
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#平滑降噪
#1.均值滤波
filtered = cv2.blur(gray,(3,3))
# #2.高斯滤波
# filtered = cv2.GaussianBlur(gray,(11,11),0)
#阈值处理
#1.全局阈值处理(初始阈值设置为88,灰度范围[0,255])
t,thd = cv2.threshold(filtered,88,255,cv2.THRESH_BINARY)
# #2.Otsu全局阈值处理
# t,thd = cv2.threshold(filtered,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
img_save = thd
# #腐蚀
# erosion = cv2.erode(thd,filter_erode)
# img_save = erosion
cv2.imshow("image_erode",thd)
key = cv2.waitKey(1) & 0xFF
if key == 27:
break
cv2.imwrite('./video_2_img_data/frame%d.jpg' % count, img_save)
count += 1
cap.release()
cv2.destroyAllWindows()
#将保存的图片合成视频
import cv2
import os
# 保存的视频路径及视频size(640, 480),这个尺寸是我电脑摄像头捕捉到的每一帧图像的宽和高。
writer = cv2.VideoWriter('./img_2_video_data/image_threshold.avi', cv2.VideoWriter_fourcc(*'MJPG'), 30, (640, 480), False)
# **********设置帧的数量**********
total_frame = len(os.listdir("./video_2_img_data/"))
print(total_frame)
for frame_num in range(1,total_frame + 1):
img_path = './video_2_img_data/frame%d.jpg' % frame_num #图片路径
read_img = cv2.imread(filename=img_path,flags=0) #falgs若不写,则默认是1。
#flags为1时,imread返回结果是三通道的数据,flags若为0,imread返回结果是一通道的数据。不管读的图像是什么,均是如此。
writer.write(read_img)
writer.release()
cv2.destroyAllWindows()
2027
合成视频如下:
阈值处理后的合成视频