Re: [問題] 關於OpenCV鍵盤事件的疑問(waitKey())

作者: FancyWing (TDiCS)   2016-03-10 23:30:13
: 感激不盡,程式碼如下:
: while(1){
: .
: .
: .
: while (1){ //希望可以退出這個迴圈
: for (int q = 30; q < 149; q++)
: {
: cvShowImage("image", Image);
: for (int w = 0; w < 4000; w+)
: {
: FillRectangle(XYZ_New[q][w][0], XYZ_New[q][w][1], XYZ_New[q][w][2]);
: }
: Delay_DoEvents(0.001);
: }
: key = waitKey(1); //有時候抓不到
: printf("%d\n", key);
: if (key == '1')
: {
: Pointx = Pointx + 10;
: break;
: }
: else if (key == '2')
: {
: Pointx = Pointx - 10;
: break;
: }
: }
: }
: 推 suwako: 我自己簡單測試了一下 沒有抓不到的問題阿 03/10 07:52
: 改成waitKey(100)就可以了,可能是鍵盤的沒船那麼那麼快@@
: 感激不盡!
:
有幾個要點,個人覺得你不是弄得很清楚
首先,使用 waitKey() 時候
你希望 flow 繼續跑,不要卡住
因此有人提議使用 waitKey(1)
你用了之後,發現會漏觸發
接著改用 waitKey(100)
發現好像不會漏了
不過依照經驗,其他使用者來使用的話,還是會有機會漏掉
原因是,code 是你寫的,所以你知道
畫完圖後,只有一小段時間來等待 key in
因此你可以做到百發百中
甚至你可以做到預判,因為你知道繪圖何時快結束
有點像紅燈倒數,預先起步的情況
先回到 waitKey(1) 抓不到的問題
經驗來說 keyDown 到 keyUp 大約是 100 ~ 300 ms
但 waitKey(1) 只等待了 1 ms
假設你沒有預判,而確實等繪圖完全結束後,你在按下按鍵
你覺得 你的反應時間能每次都命中那 1 ms
我是每次都會 miss 啦
假設你預判了
有效觸發的條件是,waitKey(1) 剛好落在這次 keyDown - KeyUp 之間
所以你預判加上你每次按下時間是否都會剛好符合條件?
綜合以上,你使用 waitKey(1) 就會時有時無
其實你可以試試看,改回 waitKey(1)
然後在繪圖快結束之前
做 keyDown 而不 KeyUp,你會發現百發百中
因為故意使 按下時間 會涵蓋到 waitKey(1)
而如果在 keyUp 後才跑到 waitKey(100)
那當然也不會觸發
但是為什麼會變成比較容易,甚至百百中呢?
原因是,綜合預判、按下時間、waitKey(100)
整個反應至少會拉到 100~250 ms
這個時間,對於已知的反應來說,很夠了
以上總歸為 時序、時機
如果希望效果是 或 類似並列運行,會常常遇到相關問題
作者: suwako   2016-03-11 07:25:00
如果要按下按鍵才更新圖 用waitKey(0)讓他一直等就好了阿
作者: FancyWing (TDiCS)   2016-03-11 08:54:00
因為他不要啊,有其他計算
作者: suwako   2016-03-11 10:32:00
分一個thread出來waitKey 應該是最有效的辦法了

Links booklink

Contact Us: admin [ a t ] ucptt.com