Opencv imshow() freezes when updating

后端 未结 9 2347
Happy的楠姐
Happy的楠姐 2020-12-09 05:18

For my image processing algorithm I\'m using python / OpenCV. The output of my algorithm shall be updated im the same window over and over again.

However sometimes

9条回答
  •  夕颜
    夕颜 (楼主)
    2020-12-09 05:37

    I have the very same issue and I noticed that the fps the window is updated is getting slower and slower until it freezes completely. Increasing the waitKey(x) to something higher just extends the duration where the images are updated but when the time that cv2.imshow() needs to calculate exceeds the time from wait(Key) it just stops updating.

    (Skip this complainment:) I think the cv2.imshow() with waitKey() combination is a complete design error, why isn't imshow() just blocking until the UI is updated? That would make life so much easier without having to call waitKey() everytime...

    P.S.: There is a possibility to start an own thread for opencv windows inside opencv:

    import cv2
    img = cv2.imread("image.jpg")
    cv2.startWindowThread()
    cv2.namedWindow("preview")
    cv2.imshow("preview", img)
    

    source: cv2.imshow command doesn't work properly in opencv-python

    Well this doesn't work for me because I always get this errors when I run it:

    (python3:1177): GLib-GObject-CRITICAL **: g_object_unref: assertion 'G_IS_OBJECT (object)' failed
    Attempt to unlock mutex that was not locked
    Aborted
    

    Maybe you could try it and report if it is working for you?

    Edit: Okay I solved the problem for me by creating a separate script imshow.py:

    import cv2
    import os.path
    
    while True:
        if os.path.exists("image.pgm"):
            image = cv2.imread("image.pgm")
            if not image is None and len(image) > 0:
                cv2.imshow("Frame", image)
                cv2.waitKey(20)
    

    And I am writing the image out in my other program with: cv2.imwrite("image.pgm", image) And I am calling the script like this:

    import subprocess
    subprocess.Popen(["python3", "imshow.py"])
    

    Although this is creating some dirty reads sometimes it is sufficient enough for me, a better solution would be to use pipes or queues between the two processes.

提交回复
热议问题