本文主要是介绍使用Sobel算子把视频转换为只剩边缘部分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
效果展示
原始视频
修改后的视频
整体代码
import cv2vc = cv2.VideoCapture('test.mp4')if vc.isOpened():open, frame = vc.read()
else:open = Falsei = 0
while open:ret, frame = vc.read()if frame is None:breakif ret == True:i += 1# 转换为灰度图gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 使用Sobel进行边缘处理sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3)sobelx = cv2.convertScaleAbs(sobelx)sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3)sobely = cv2.convertScaleAbs(sobely)# 合起来sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)cv2.imshow('result', sobelxy)# 0.1s 0xFF表示键盘上的Esc键if cv2.waitKey(100) & 0xFF == 27:break# 释放硬件资源
vc.release()
# 清除所有窗口
cv2.destroyAllWindows()
代码解释
sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3)
Sobel(src, ddepth, dx, dy, ksize)
①dx和dy分别表示水平和竖直方向
②ddepth一般为-1,表示和原图像一样的深度
上面的cv2.CV_64F代表的是深度,可以保存负数,是特殊的用法
③ksize表示卷积核大小(算子大小)
④src表示传入图像
sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
把x和y方向的求和,获得整体的边缘图像
sobelx和sobely则是你通过Sobel计算的图像
0.5表示的是权值(占比)
0表示的是偏置项,为0即可
if cv2.waitKey(100) & 0xFF == 27:break
这里的0xFF == 27 表示的是键盘上的Esc键
sobelx = cv2.convertScaleAbs(sobelx)
把负数变成正数,防止被截断为0 因为默认的时候负数会被转换为0
这篇关于使用Sobel算子把视频转换为只剩边缘部分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!