python - OpenCV:为什么一个 trackbar 比其他的短?

标签 python opencv

我遇到了一个奇怪的问题,希望有人能给我解释一下,这样我以后就可以避免了。当我放置多个轨迹条(在我的例子中是 6 个)时,最后一个轨迹条要短得多。这是基本代码:

import cv2

def nothing(arguments):
    pass

cv2.namedWindow('TrackBars')
cv2.resizeWindow('TrackBars', 500, 300)
cv2.createTrackbar('Slider 1', 'TrackBars', 0, 255, nothing)
cv2.createTrackbar('Slider 2', 'TrackBars', 0, 255, nothing)
cv2.createTrackbar('Slider 3', 'TrackBars', 0, 255, nothing)
cv2.createTrackbar('Slider 4', 'TrackBars', 0, 255, nothing)
cv2.createTrackbar('Slider 5', 'TrackBars', 0, 255, nothing)
cv2.createTrackbar('Slider 6', 'TrackBars', 0, 255, nothing)
cv2.waitKey(0)

我注意到增大窗口可以解决问题:

cv2.resizeWindow('TrackBars', 500, 320)

尽管下面有很多空间,但我认为可能是窗口裁剪了轨迹栏,使其表现得很奇怪。但是,在准备要在此处发布的代码时,我发现即使有 2 或 3 个轨迹栏被窗口裁剪,也能正常工作。只有当有 4 个或更多时才会出现此行为。

import cv2

def nothing(arguments):
    pass

cv2.namedWindow('TrackBars')
cv2.resizeWindow('TrackBars', 500, 60)
cv2.createTrackbar('Slider 1', 'TrackBars', 0, 255, nothing)
cv2.createTrackbar('Slider 2', 'TrackBars', 0, 255, nothing)
cv2.waitKey(0)

这里发生了什么?为什么其中一个 trackbar 更短,但只有当有很多 trackbar 时才更短?


附加信息:

  • OpenCV:4.6.0.66
  • 操作系统:Windows 10
  • HighGUI 后端:WinAPI

最佳答案

这是 OpenCV 中的一个错误,似乎已经存在了一段时间。经过几个小时的挖掘(并在此过程中发现了代码中的其他一些问题),我想我已经捕获了它并提交了 bug report与提议的决议。我会在不久的将来提出拉取请求,希望这个问题可以在 4.7.0 版本中得到解决。

总结一下这个问题:trackbar 控件被添加到工具栏控件中,随着更多控件的添加,它会垂直增长。由于在创建控件时主窗口大小是固定的,因此工具栏未占用的剩余“客户区”会逐渐缩小,直到没有剩余空间(因此其大小变为 0)。

错误在于,为了设置轨迹栏控件的宽度,使用了剩余“客户区”的宽度。一旦“客户区”缩小为零,它的大小变为 0,Windows 将使用其他一些值作为轨迹栏的默认宽度。

使用工具栏的宽度(始终可用)可以解决问题。

应用该修复后,我可以获得以下信息:


更新:许多修复也将应用于 3.4 分支。

关于python - OpenCV:为什么一个 trackbar 比其他的短?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74358897/

相关文章:

Python OpenCV 颜色跟踪

python - 从 <img> 标签中提取路径和文件名

Python 将过滤级别记录到流中

python - 具有指数退避的请求

opencv - 如何仅在给定图像的第二部分中匹配特征?

c++ - 旋转视频opencv C++

python - 在 Django 中运行 "syncdb"时如何指定模式名称?

Python Numpy 如何更改数组内的数据类型

opencv - 向 oculus Rift 显示视频流

c++ - OpenCV:计算新的红色像素值