我在學習使用在線教程的圖像處理項目的OPENCV。OPENCV waitKey()方法返回類型
opencv文檔說waitKey()返回一個int。這應該是按下的鍵的ASCII值。但大多數在線教程使用以下代碼編譯並運行正常。
if ((char)27==waitKey(1)) break;
這表明waitKey返回一個字符,而不是一個int。 有人可以解釋一下嗎?
我在學習使用在線教程的圖像處理項目的OPENCV。OPENCV waitKey()方法返回類型
opencv文檔說waitKey()返回一個int。這應該是按下的鍵的ASCII值。但大多數在線教程使用以下代碼編譯並運行正常。
if ((char)27==waitKey(1)) break;
這表明waitKey返回一個字符,而不是一個int。 有人可以解釋一下嗎?
cv::waitKey()
返回int
。原因char key = cv::waitKey(1)
的工作原因是由於C++中的隱式轉換。在這種情況下,類型的返回值cv::waitKey()
隱含轉換爲char
,然後分配給key
。請參閱this link以供參考。下面的陳述是等效的:
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
它沒關係,因爲ASCII字符在0到127之間。所以無論是實際的結果都是相同的。
與Ubuntu 14.04,我不得不使用cv::waitKey()%256
來獲得正確的ASCII碼。 您可以打印cv::waitKey()
結果,看看它是否工作正確的你:)
我已經opencv3.2
編譯Ubuntu 16.04
。 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中的一個錯誤。
顯然,它使用某種8位數據類型來表示鍵碼。在8位單形整數數據類型中,-1可以表示爲8個1(1111 1111,補碼)。而在C++中,整數數據類型通常是32位的。所以,八個1被解釋爲255.
謝謝:).......... – udit043 2017-07-08 16:01:48