【问题标题】:OpenCV drawing specific contoursOpenCV 绘制特定轮廓
【发布时间】:2021-05-16 18:06:30
【问题描述】:

我有想要检测的 GUI 元素,背景颜色变化很大,我在检测菱形轮廓时遇到问题。

原图:

到目前为止我有什么:

我通过简单的 bgr 到灰度转换得到这张图片,模糊然后使用这段代码应用高斯自适应阈值:

crop_img = img.copy()
crop_gray = cv2.cvtColor(crop_img, cv2.COLOR_BGR2GRAY)
blurred = cv2.blur(crop_gray, (5, 5), 0)
thresh = cv2.adaptiveThreshold(blurred, 255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 21, 4)

我想要的结果是像这样定位图标框架:

我已经尝试过使用一些形态变换组合的不同技术,但我在图像处理方面缺乏经验,这让我很难弄清楚这一点。

编辑:添加原始图像

【问题讨论】:

  • 似乎可以改进预处理链。能发一下原图吗?
  • 当然。 Image link.
  • 我会推荐cv2.inRange()方法来过滤掉特定范围内菱形物体的颜色,而不是自适应阈值。
  • 我也确实尝试过,但是由于图标的亮度和颜色会发生变化,除了迭代它们之外,很难找到一个合理的颜色范围来掩盖。 @ZdaR例如,如果我想掩盖底部图标的紫色,您可以建议什么范围?谢谢
  • 您可以尝试掩盖菱形周围的黑色边框,而不是掩盖紫色。它在所有 4 颗钻石中都是一致的。我尝试使用 (0, 0, 0), (15, 15, 15) BGR 范围,它成功检测到前 2 颗钻石,同时部分检测到底部 2 颗钻石,您可以稍微玩一下这个颜色范围,也可以使用 HSV 颜色范围而不是 BGR

标签: python opencv image-processing opencv-python


【解决方案1】:

据我所知,这些 GUI 元素来自 Dead By Daylight(Game)。因此,我假设您想要处理来自游戏的视频源。

您可以使用连续帧并跟踪它们之间的相似性。由于背景随着玩家或游戏内对象的移动而变化,唯一不变的部分是 GUI 元素。我在下面写了一个伪代码,它比较 2 帧并输出一个显示未更改像素的掩码。

from skimage.measure import compare_ssim
  
frame0 = video_feed.get_next_frame()
frame1 = video_feed.get_next_frame()

gray_frame0 = cv2.cvtColor(frame0, cv2.COLOR_BGR2GRAY)
gray_frame1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)

(score, diff) = compare_ssim(gray_frame0, gray_frame1, full=True)

thresh = cv2.threshold(diff, 0, 255, cv2.THRESH_BINARY_INV)

希望这种方法适用于您的应用程序。

【讨论】:

  • 感谢您的建议,抱歉回复晚了。我实际上没有视频源,我正在尝试单独处理单个图像。我最终使用了特征匹配,这在处理时间方面并不理想,但暂时还可以。
猜你喜欢
  • 2019-01-25
  • 2021-09-07
  • 2021-01-17
  • 2014-05-25
  • 2017-06-05
  • 2019-02-12
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多