为什么 openCV moveWindow 函数不起作用?
Why is openCV moveWindow function not working?
下面,我有一个 python 脚本。不起作用的部分是函数 cv2.moveWindow("TrackBars", WIDTH, 0)。
我不知道为什么它不起作用,因为我可以在我的另一个“我的摄像头”window 上使用 moveWindow 函数。
在尝试使用 moveWindow 函数之前,我初始化了“TrackBars”window 并调整了它的大小。
脚本的要点是制作一个相机 window 并让另一个 window 带有输入,改变在相机上绘制的圆圈的位置 window。
import cv2
print(cv2.__version__)
cam=cv2.VideoCapture(0)
WIDTH=640
HEIGHT=480
cam.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH)
cam.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT)
cam.set(cv2.CAP_PROP_FPS, 30)
cam.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*"MJPG"))
xPos = WIDTH//2
yPos = HEIGHT//2
radius = 25
def setX(x):
global xPos
xPos = x
def setY(y):
global yPos
yPos = y
def setRadius(r):
global radius
radius = r
cv2.namedWindow("TrackBars")
cv2.resizeWindow("TrackBars", 250, 100)
cv2.moveWindow("TrackBars", WIDTH, 0)
cv2.createTrackbar("xPos", "TrackBars", WIDTH//2, WIDTH, setX)
cv2.createTrackbar("yPos", "TrackBars", HEIGHT//2, HEIGHT, setY)
cv2.createTrackbar("radius", "TrackBars", 25, HEIGHT//2, setRadius)
while True:
ignore, frame = cam.read()
cv2.circle(frame, (xPos, yPos), radius, (0, 255, 0), 2)
cv2.imshow('my WEBcam', frame)
cv2.moveWindow('my WEBcam',0,0)
if cv2.waitKey(1) == ord('q'):
break
cam.release()
根据你的代码,你可以移动“TrackBars”window,但不能移动“my WEBcam”window,因为你在while循环中使用了固定坐标值:
while True:
...
cv2.moveWindow('my WEBcam',0,0)
...
如果要移动 window,只需注释掉以下行:
while True:
...
# cv2.moveWindow('my WEBcam',0,0)
...
此外,要在“我的网络摄像头”window之上制作“TrackBars”window,您需要再添加一行:
cv2.namedWindow("my WEBcam")
cv2.namedWindow("TrackBars")
我修改了代码以测试“TrackBars”window:
import cv2
print(cv2.__version__)
cam=cv2.VideoCapture(0)
WIDTH=640
HEIGHT=480
cam.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH)
cam.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT)
cam.set(cv2.CAP_PROP_FPS, 30)
cam.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*"MJPG"))
xPos = WIDTH//2
yPos = HEIGHT//2
radius = 25
windowX = 0
def setX(x):
global xPos
xPos = x
def setY(y):
global yPos
yPos = y
def setRadius(r):
global radius
radius = r
def setWindowX(x):
global windowX
windowX = x
cv2.namedWindow("my WEBcam")
cv2.namedWindow("TrackBars")
cv2.resizeWindow("TrackBars", 250, 200)
cv2.moveWindow("TrackBars", windowX, 400)
cv2.createTrackbar("xPos", "TrackBars", WIDTH//2, WIDTH, setX)
cv2.createTrackbar("yPos", "TrackBars", HEIGHT//2, HEIGHT, setY)
cv2.createTrackbar("radius", "TrackBars", 25, HEIGHT//2, setRadius)
# Test moveWindow
cv2.createTrackbar("moveWindow", "TrackBars", 25, HEIGHT//2, setWindowX)
while True:
ignore, frame = cam.read()
cv2.circle(frame, (xPos, yPos), radius, (0, 255, 0), 2)
cv2.imshow('my WEBcam', frame)
cv2.moveWindow('my WEBcam',0,0)
cv2.moveWindow("TrackBars", windowX, 400)
if cv2.waitKey(1) == ord('q'):
break
cam.release()
macOS
Windows
我发现使用 cv2.imshow("TrackBars", np.zeros([10,10], dtype=np.uint8))
启动 window 而不是使用 cv2.namedWindow("TrackBars") 启动 TrackBars window 出于某种原因。
下面,我有一个 python 脚本。不起作用的部分是函数 cv2.moveWindow("TrackBars", WIDTH, 0)。 我不知道为什么它不起作用,因为我可以在我的另一个“我的摄像头”window 上使用 moveWindow 函数。 在尝试使用 moveWindow 函数之前,我初始化了“TrackBars”window 并调整了它的大小。 脚本的要点是制作一个相机 window 并让另一个 window 带有输入,改变在相机上绘制的圆圈的位置 window。
import cv2
print(cv2.__version__)
cam=cv2.VideoCapture(0)
WIDTH=640
HEIGHT=480
cam.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH)
cam.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT)
cam.set(cv2.CAP_PROP_FPS, 30)
cam.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*"MJPG"))
xPos = WIDTH//2
yPos = HEIGHT//2
radius = 25
def setX(x):
global xPos
xPos = x
def setY(y):
global yPos
yPos = y
def setRadius(r):
global radius
radius = r
cv2.namedWindow("TrackBars")
cv2.resizeWindow("TrackBars", 250, 100)
cv2.moveWindow("TrackBars", WIDTH, 0)
cv2.createTrackbar("xPos", "TrackBars", WIDTH//2, WIDTH, setX)
cv2.createTrackbar("yPos", "TrackBars", HEIGHT//2, HEIGHT, setY)
cv2.createTrackbar("radius", "TrackBars", 25, HEIGHT//2, setRadius)
while True:
ignore, frame = cam.read()
cv2.circle(frame, (xPos, yPos), radius, (0, 255, 0), 2)
cv2.imshow('my WEBcam', frame)
cv2.moveWindow('my WEBcam',0,0)
if cv2.waitKey(1) == ord('q'):
break
cam.release()
根据你的代码,你可以移动“TrackBars”window,但不能移动“my WEBcam”window,因为你在while循环中使用了固定坐标值:
while True:
...
cv2.moveWindow('my WEBcam',0,0)
...
如果要移动 window,只需注释掉以下行:
while True:
...
# cv2.moveWindow('my WEBcam',0,0)
...
此外,要在“我的网络摄像头”window之上制作“TrackBars”window,您需要再添加一行:
cv2.namedWindow("my WEBcam")
cv2.namedWindow("TrackBars")
我修改了代码以测试“TrackBars”window:
import cv2
print(cv2.__version__)
cam=cv2.VideoCapture(0)
WIDTH=640
HEIGHT=480
cam.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH)
cam.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT)
cam.set(cv2.CAP_PROP_FPS, 30)
cam.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*"MJPG"))
xPos = WIDTH//2
yPos = HEIGHT//2
radius = 25
windowX = 0
def setX(x):
global xPos
xPos = x
def setY(y):
global yPos
yPos = y
def setRadius(r):
global radius
radius = r
def setWindowX(x):
global windowX
windowX = x
cv2.namedWindow("my WEBcam")
cv2.namedWindow("TrackBars")
cv2.resizeWindow("TrackBars", 250, 200)
cv2.moveWindow("TrackBars", windowX, 400)
cv2.createTrackbar("xPos", "TrackBars", WIDTH//2, WIDTH, setX)
cv2.createTrackbar("yPos", "TrackBars", HEIGHT//2, HEIGHT, setY)
cv2.createTrackbar("radius", "TrackBars", 25, HEIGHT//2, setRadius)
# Test moveWindow
cv2.createTrackbar("moveWindow", "TrackBars", 25, HEIGHT//2, setWindowX)
while True:
ignore, frame = cam.read()
cv2.circle(frame, (xPos, yPos), radius, (0, 255, 0), 2)
cv2.imshow('my WEBcam', frame)
cv2.moveWindow('my WEBcam',0,0)
cv2.moveWindow("TrackBars", windowX, 400)
if cv2.waitKey(1) == ord('q'):
break
cam.release()
macOS
Windows
我发现使用 cv2.imshow("TrackBars", np.zeros([10,10], dtype=np.uint8))
启动 window 而不是使用 cv2.namedWindow("TrackBars") 启动 TrackBars window 出于某种原因。