【问题标题】:How can I reduce-flicker & display thicker lines with Canny Edge detection on video with opencv?如何在使用 opencv 的视频上通过 Canny Edge 检测减少闪烁并显示较粗的线条?
【发布时间】:2019-05-18 20:20:57
【问题描述】:

我正在对来自我的网络摄像头的视频流进行 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 参数?

【问题讨论】:

  • 什么是“闪烁”?一个示例图像会很有帮助
  • 也许你可以尝试在精明之前添加模糊处理以去除噪音

标签: python python-3.x opencv


【解决方案1】:

我对这个主题没有任何广泛的知识,但我自己一直在使用 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 腐蚀或膨胀过滤器,以便在必要时加厚或减少边缘。更多关于腐蚀和膨胀的信息: https://docs.opencv.org/master/d9/d61/tutorial_py_morphological_ops.html

【讨论】:

    猜你喜欢
    • 2011-11-13
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多