簡體   English   中英

OPENCV waitKey()方法返回類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM