[英]OPENCV waitKey() method return type
我正在嘗試使用在線教程學習OPENCV用於圖像處理項目。
opencv文檔說waitKey()返回一個int。 這應該是按下的鍵的ASCII值。 但大多數在線教程使用以下編譯並運行良好的代碼。
if ( (char)27==waitKey(1) ) break;
這表明waitKey返回一個char而不是int。 有人可以解釋一下嗎?
cv::waitKey()
返回一個int
。 char key = cv::waitKey(1)
的原因是由於C ++中的隱式轉換。 在這種情況下, cv::waitKey()
int
類型的返回值被隱式轉換為char
,然后分配給key
。 請參閱此鏈接以供參考。 以下陳述是等效的:
char key = (char) cv::waitKey(30); // explicit cast
char key = cv::waitKey(30); // implicit cast
在if ((char)27 == waitKey(1)) break;
, waitKey(1)
的輸出可能隱式轉換為char
,然后與esc
字符(ASCII代碼27)進行比較。 我會用顯式轉換重寫它以避免歧義。
if ( (char)27 == (char) waitKey(1) ) break;
我在OpenCV示例cpp文件中看到它的常見方式:
char key = (char) cv::waitKey(30); // explicit cast
if (key == 27) break; // break if `esc' key was pressed.
if (key == ' ') do_something(); // do_something() when space key is pressed
以下也是可能的,但第一種方法更清潔:
int key = cv::waitKey(30) & 255; // key is an integer here
if (key == 27) break; // break when `esc' key is pressed
使用Ubuntu 14.04,我不得不使用cv::waitKey()%256
來獲取正確的ASCII代碼。 你可以打印cv::waitKey()
的結果,看看它是否適合你:)
我為Ubuntu 16.04
編譯了opencv3.2
。 waitKey()
返回int
,其中只有char
部分是有用的,而int
的其余部分似乎是垃圾。 所以,在視頻處理中循環這樣一條線
if (cv::waitKey(10) > 0) break; // if key pressed then break
幾乎肯定會打破,因為即使你不按一個鍵,非零垃圾也會“按下”鍵。 但是像這樣的一條線
if ((char)cv::waitKey(10) > 0) break; // if key pressed then break
按預期工作,僅在按下鍵時才會中斷。 將它與27進行比較時會應用類似的邏輯。返回值中的垃圾確實可能是OpenCV中的錯誤。
無關緊要,因為ASCII字符在0到127之間。因此,任何一個演員實際上都會產生相同的結果。
顯然,它使用某種8位數據類型來表示密鑰代碼。 在8位燒結整數數據類型中,-1可以表示為8個1(1111 1111,補充代碼)。 在C ++中,整數數據類型通常是32位。 因此,八個1被解釋為255。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.