python - 如何使用 opencv 对视频进行 Canny 边缘检测以减少闪烁并显示更粗的线条?

标签 python python-3.x opencv

我正在对来 self 的网络摄像头的视频流进行 Canny 边缘检测,我一直在尝试寻找减少闪烁的参数。我想知道代表边缘的粗线是否可能无法解决问题。

我现在的代码是

# inspired by hhttps://shahsparx.me/edge-detection-opencv-python-video-image/ttps://shahsparx.me/edge-detection-opencv-python-video-image/
import cv2
import numpy as np

cap = cv2.VideoCapture(0)
 
while(1):
    ret, frame = cap.read()
    gray_vid = cv2.cvtColor(frame, cv2.IMREAD_GRAYSCALE)
    cv2.imshow('Original',frame)
    edged_frame = cv2.Canny(frame,100,200)
    cv2.imshow('Edges',edged_frame)
# Quit with 'Esc' key
    k= cv2.waitKey(5) & 0xFF
    if k==27:
        break
cap.release()
cv2.destroyAllWindows()

但它非常闪烁,即许多检测到的边缘出现和消失,特别是边缘模糊的地方,如皱纹、头发、背景元素等。 是否有 opencv 参数可用于视频捕获或可以提供帮助的转换?

Screencapture after edge detection

最佳答案

我对这个主题没有任何广泛的了解,但我自己一直在使用 opencv 进行一个项目并进行了大量研究。我的知识可能不完整,但这里是我发现的一些东西。

您可以对已应用高斯模糊的图像运行边缘检测以减少噪点,并使用上限和下限阈值来提供帮助。

blur = cv2.GaussianBlur(cv_img, (3, 3), 0)
sigma = np.std(blur)
mean = np.mean(blur)
lower = int(max(0, (mean - sigma)))
upper = int(min(255, (mean + sigma)))

edge = cv2.Canny(blur, lower, upper)

之后,如果仍然存在问题,您可以使用 opencv 腐 eclipse 或膨胀过滤器,以便在必要时加厚或减少边缘。有关腐 eclipse 和膨胀的更多信息,请参见: https://docs.opencv.org/master/d9/d61/tutorial_py_morphological_ops.html

关于python - 如何使用 opencv 对视频进行 Canny 边缘检测以减少闪烁并显示更粗的线条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53832637/

相关文章:

Python - 如果不是 0.0 的语句

python - 如何使用Python从辅助Outlook电子邮件中下载附件?

python-3.x - 抓取 Finviz 页面以获取表中的特定值

python - 如何使用 Python 检查超大数据集中的重复图片?

c++ - 外部符号上的静态链接 OpenCV CUDA 应用程序错误

android - Android 上矢量 <DMatch> OpenCV 的问题

python - 使用 K 均值聚类 OpenCV 进行交通标志分割

python - django-admin.py startproject 库存。不管用?

python - 如何在 Beautiful Soup 中查找特定的 div 文本

python - 为什么第一个代码片段可以正确交换值,而第二个代码片段却不能?