logo
Loading...

使用mac 執行imshow 造成crash 的問題 - Cupoy

你好,請教一下,已經增加cv2.startWindowThread 在imshow前面,但按到圖片視...

使用mac 執行imshow 造成crash 的問題

2019/11/30 下午 10:27
電腦視覺深度學習討論版
Ren
觀看數:68
回答數:3
收藏數:0

你好,請教一下,

已經增加cv2.startWindowThread 在imshow前面,

但按到圖片視窗按完esc後並沒有消失,之後jupyter 就dead kernel了。

語法如下

while True:

    cv2.startWindowThread()

    cv2.imshow('joker', img)

    k = cv2.waitKey(0)

    if k == 27:

        cv2.destroyWindow('joker')

        break

回答列表

  • 2019/12/01 上午 00:38
    周姿均
    贊同數:0
    不贊同數:0
    留言數:1

    while True:

        cv2.startWindowThread()

        cv2.imshow('joker', img)

       k = cv2.waitKey(0)

       if k == 27:

           cv2.destroyWindow()  #這邊不需要寫"joker"

           break

    -----------------------------------------

    改成這樣試試

  • 2019/12/01 上午 00:40
    Jeffrey
    贊同數:0
    不贊同數:0
    留言數:1

    更新ipython notebook。解決方案:

    conda upgrade notebook 

    conda upgrade jupyter


    另外, k==27? 有點大, 關視窗的部分, 可否嘗試游標一致視窗上, 在按key 試一下

  • 2019/12/01 下午 07:16
    杜靖愷
    贊同數:0
    不贊同數:0
    留言數:2

    有關 mac 上使用 imshow 會 crash 的問題可以參考

    https://stackoverflow.com/questions/46348972/cv2-imshow-crashes-on-mac


    我沒有 mac 的環境能夠測試,但是依照 stackoverflow 上的回答來看,建議可以簡單先試一下把 `k == 27` 改成 `k == ord('q')`,然後在圖片視窗按 `q`,應該就會正常關閉圖片視窗了。


    範例中的 `k = waitKey(0); k == 27` 是 opencv 實現方法使然,`cv2.imshow` 必須要跟著一行 `cv2.waitKey` 等待用戶觸發事件,可參考[ opencv 官方文檔](https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga453d42fe4cb60e5723281a89973ee563),主要有兩種邏輯

    1. `cv2.waitKey(0)` 表示會無限制的等待 user 觸發 keyboard event (鍵盤上任意一個按鍵都可以),按了 keyboard 的某個按鍵之後會回傳一個數值,而 ESC 的回傳值正是 ASCII 码對應的 27,所以範例才會用 `k == 27`,但不代表一定要這樣寫,stackoverflow 上建議的 `ord('q')` 就是按了 q 之後回傳的值,如果你喜歡按空白鍵的話,也可以用 `ord(' ')`
    2. `cv2.waitKey(n) # where n > 0` 表示的是電腦會等待 n 毫秒才繼續執行下一行程式碼,n 毫秒結束後,如果超過時間 user 沒有觸發任何 keyboard event,則回傳 -1 (至少 windows 是啦,只要 print(k) 出來就能知道了),有觸發就和上面一樣了。


    `cv2.imshow` 主要是用來觀察及確認圖像處理的結果,如果只是為了顯示的話,也可以試看其他顯示方法,比如 PIL

    ```

    from PIL import Image

    Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

    ```