使用mac 執行imshow 造成crash 的問題
你好,請教一下,
已經增加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:40Jeffrey贊同數: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),主要有兩種邏輯
- `cv2.waitKey(0)` 表示會無限制的等待 user 觸發 keyboard event (鍵盤上任意一個按鍵都可以),按了 keyboard 的某個按鍵之後會回傳一個數值,而 ESC 的回傳值正是 ASCII 码對應的 27,所以範例才會用 `k == 27`,但不代表一定要這樣寫,stackoverflow 上建議的 `ord('q')` 就是按了 q 之後回傳的值,如果你喜歡按空白鍵的話,也可以用 `ord(' ')`
- `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))
```