OpenCV Python 轨迹栏回调

Jn_*_*n_M 3 python user-interface opencv

我目前正在使用 opencv (3.0) 编写一个 Python (2.7) 边缘检测脚本,到目前为止基本上工作正常。

现在,我想在程序运行时在笔记本电脑摄像头和第二个网络摄像头之间切换。

所以我实现了一个轨迹栏作为开关,但我不知道如何获取轨迹栏已更改的信息。

普通的 getTrackbarPos() 是不够的,我需要类似的东西:

if TrackbarHasChanged() -> 重新启动程序 -> cv2.VideoCapture(更改相机) -> while(true) 循环

提前致谢

api*_*i55 5

你很幸运。实际上 OpenCV 轨迹栏中已经存在这种行为。如果您阅读createTrackbar的文档,您将看到对于 python,您有:

\n\n
\n

cv2.createTrackbar(trackbarName, windowName, value, count, onChange) \xe2\x86\x92 无

\n
\n\n

onChange 参数是:

\n\n
\n

onChange \xe2\x80\x93 指向每次滑块改变位置时调用的函数的指针。该函数的原型应为 void Foo(int,void*); ,其中第一个参数是轨迹栏位置,第二个参数是用户数据(请参阅下一个参数)。如果回调是 NULL 指针,则不会调用任何回调,而只更新值。

\n
\n\n

这基本上意味着你想做的事情。不是每个循环都检查 pos,而是如果有更改就进行更改。

\n\n

对于重新启动程序部分来说有点棘手。据我所知(我可能是错的)这在另一个线程中运行,并且可能会出现一些竞争条件问题......

\n\n

这是一些小代码(我无法完全测试,因为我没有网络摄像头),它创建一个轨迹栏,创建回调函数,更改相机,并避免线程问题(我认为,您可能需要实际使用使用cameraToUse和cameraChange时锁定,以真正实现线程安全)。没有相机它可以运行,但是它总是会打印连接错误。有了相机,它实际上可能有效:)

\n\n

我添加了很多评论,但如果您没有得到一部分,请随时在评论中询问

\n\n
import cv2\nimport numpy as np\n\n# global variables\namountOfCameras = 3 # how many cameras you want to use\ncameraToUse = 0 #initial camera\ncameraChange = True #starts true to connect at start up\ncamera = cv2.VideoCapture() # empty placeholder\n\n# callback function for the tracker, x is the position value\n# you may put whatever name in here\ndef trackerCallback(x):\n    global cameraToUse\n    global cameraChange\n    if cameraToUse != x:\n        print "I change to this camera", x\n        cameraToUse = x\n        cameraChange = True\n\n# function to connect to a camera and replace the videoCapture variable\ndef connectToCamera():\n    global cameraChange\n    global camera\n    print "Connecting to camera", cameraToUse\n    camera = cv2.VideoCapture(cameraToUse)\n    # basic check for connection error\n    if camera.isOpened():\n        print "Successfully connected"\n    else:\n        print "Error connecting to camera", cameraToUse\n    cameraChange = False\n\n#initial image with the tracker\nimg = np.zeros((200,600,3), np.uint8)\ncv2.namedWindow(\'image\')\n\ncv2.createTrackbar(\'Camera\',\'image\',0,amountOfCameras-1,trackerCallback)\n\nwhile(1):\n    #check if it has to connect to something else\n    if cameraChange:\n        connectToCamera()\n    # if no problems with the current camera, grab a frame\n    if camera.isOpened():\n        ret, frame = camera.read()\n        if ret:\n            img = frame\n    # displays the frame, in case of none, displays the previous one\n    cv2.imshow(\'image\',img)\n    # if esc button exit\n    k = cv2.waitKey(1) & 0xFF\n    if k == 27:\n        break\n\ncv2.destroyAllWindows()\n
Run Code Online (Sandbox Code Playgroud)\n