2015-04-02 73 views
2

我在學習使用在線教程的圖像處理項目的OPENCV。OPENCV waitKey()方法返回類型

opencv文檔說waitKey()返回一個int。這應該是按下的鍵的ASCII值。但大多數在線教程使用以下代碼編譯並運行正常。

if ((char)27==waitKey(1)) break;

這表明waitKey返回一個字符,而不是一個int。 有人可以解釋一下嗎?

回答

4

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 
0

它沒關係,因爲ASCII字符在0到127之間。所以無論是實際的結果都是相同的。

1

與Ubuntu 14.04,我不得不使用cv::waitKey()%256來獲得正確的ASCII碼。 您可以打印cv::waitKey()結果,看看它是否工作正確的你:)

+0

謝謝:).......... – udit043 2017-07-08 16:01:48

1

我已經opencv3.2編譯Ubuntu 16.04waitKey()返回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中的一個錯誤。

0

顯然,它使用某種8位數據類型來表示鍵碼。在8位單形整數數據類型中,-1可以表示爲8個1(1111 1111,補碼)。而在C++中,整數數據類型通常是32位的。所以,八個1被解釋爲255.