waitKey的理解一篇就夠了

title: opencv中waitKey的理解

date: 2020-05-21 14:47:15

tags: [opencv, waitKey]

最初用opencv處理圖像時,大概查過cv2.waitKey這個函數(shù),當(dāng)時查的迷迷糊糊的,只知道加上cv2.waitKey之后cv2.imshow就可以顯示圖像了。今天做視頻逐幀截取時再次碰見了它,我盯著它想了半天也不知道這個函數(shù)有什么用,于是打開瀏覽器,一逛就是大半天?,F(xiàn)在把我的收獲及想法總結(jié)一下。

<!-- more -->

為什么cv2.imshow之后要跟cv2.waitkey

我們先說說它的好兄弟cv2.imshow。我們都知道imshow的作用是在GUI里顯示一幅圖像,但是它有個特點我們沒有太注意,就是它的持續(xù)時間??纯聪旅娴臏y試你就明白了。



實際上,waitkey控制著imshow的持續(xù)時間,當(dāng)imshow之后不跟waitkey時,相當(dāng)于沒有給imshow提供時間展示圖像,所以只有一個空窗口一閃而過。添加了waitkey后,哪怕僅僅是cv2.waitkey(1),我們也能截取到一幀的圖像。所以cv2.imshow后邊是必須要跟cv2.waitkey的。

給一段imshow源碼里的注釋來印證下:This function should be followed by cv::waitKey function which displays the image for specified . milliseconds. Otherwise, it won't display the image.

非官方翻譯:這個函數(shù)之后應(yīng)接cv2.waitKey函數(shù)來顯示指定圖像。否則,它不會顯示圖像。

為什么要這么麻煩的設(shè)計

來自官方的解釋:This function is the only method in HighGUI that can fetch and handle events, so it needs to be .

非官方翻譯:這個函數(shù)是HighGUI窗口中唯一的獲取和處理事件的方法,因此它必須存在。

cv2.waitKey(1000) & 0xFF == ord('q') 是什么意思

先解釋下字面意思:

cv2.waitKey(1000):在1000ms內(nèi)根據(jù)鍵盤輸入返回一個值

0xFF :一個十六進(jìn)制數(shù)

ord('q') :返回q的ascii碼

0xFF是一個十六進(jìn)制數(shù),轉(zhuǎn)換為二進(jìn)制是11111111。waitKey返回值的范圍為(0-255),剛好也是8個二進(jìn)制位。那么我們將 cv2.waitKey(1) & 0xFF計算一下(不知怎么計算的可以百度位與運算)發(fā)現(xiàn)結(jié)果仍然是waitKey的返回值,那為何要多次一舉呢?直接 cv2.waitKey(1) == ord('q')不就好了嗎。

實際上在linux上使用waitkey有時會出現(xiàn)waitkey返回值超過了(0-255)的范圍的現(xiàn)象。通過cv2.waitKey(1) & 0xFF運算,當(dāng)waitkey返回值正常時 cv2.waitKey(1) = cv2.waitKey(1000) & 0xFF,當(dāng)返回值不正常時,cv2.waitKey(1000) & 0xFF的范圍仍不超過(0-255),就避免了一些奇奇怪怪的BUG。

cv2.waitkey和time.sleep的區(qū)別

肯定有人寫在代碼時把waitkey當(dāng)sleep用過,你會發(fā)現(xiàn)有時waitkey并不起作用。

先來一段官方解釋:The function only works if there is at least one HighGUI window created and the window is active

非官方翻譯:這個函數(shù)只有在至少一個HighGUI窗口存在的情況下才會起作用。

也就是說waitkey的延時機(jī)制是有條件的,必須在它之前創(chuàng)造HighGUI窗口它才會起作用。而time.sleep是無條件的延時機(jī)制。

那么cv2.waitKey能不能代替time.sleep在cv2.imshow心中的地位呢?


答案很清楚:不能。

待解決。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容