Hàm cvWaitKey () của OpenCV làm gì?


82

Điều gì xảy ra trong quá trình thực hiện cvWaitKey()? Một số trường hợp sử dụng điển hình là gì? Tôi đã thấy nó trong tài liệu tham khảo OpenCV nhưng tài liệu không rõ ràng về mục đích chính xác của nó.


3
Bạn không hiểu gì về nó hoặc bạn nghĩ nó làm gì? Các tài liệu tham khảo tài liệu OpenCV có vẻ rất rõ ràng với tôi ...
Daniel Sloof

8
@ user588855 Điều quan trọng đối với tất cả chúng tôi là bạn phải xem lại câu hỏi của mình và chấp nhận một số câu trả lời, bao gồm cả câu trả lời này.
karlphillip,

4
Đối với bản ghi, cvWaitKey()bây giờ là một hàm C không được dùng nữa. waitKey()là tương đương C ++ hiện đại.
StockB

1
Bạn có thể vui lòng đánh dấu một trong các câu trả lời (@SuperElectric có vẻ là câu trả lời tốt nhất hiện tại) để câu hỏi có thể được coi là câu trả lời. 4 năm chờ đợi một câu trả lời và nhận được nhiều câu trả lời là một khoảng thời gian dài ...
rbaleksandar

@DanielSloof chẳng hạn, sẽ rất tuyệt nếu biết các giá trị trả về tuân theo tiêu chuẩn nào.
lahjaton_j

Câu trả lời:


138

cvWaitKey(x) / cv::waitKey(x) làm hai điều:

  1. Nó đợi x mili giây cho một lần nhấn phím trên cửa sổ OpenCV (tức là được tạo từ cv::imshow()). Lưu ý rằng nó không nghe trên stdin cho đầu vào bảng điều khiển. Nếu một phím được nhấn trong thời gian đó, nó sẽ trả về mã ASCII của phím đó. Nếu không, nó sẽ trả về -1. (Nếu x bằng 0, nó sẽ chờ vô thời hạn cho lần nhấn phím.)
  2. Nó xử lý bất kỳ sự kiện cửa sổ nào, chẳng hạn như tạo cửa sổ với cv::namedWindow()hoặc hiển thị hình ảnh với cv::imshow().

Một sai lầm phổ biến đối với những người mới tham gia opencv là gọi cv::imshow()lặp đi lặp lại qua các khung hình video mà không theo dõi từng lượt vẽ với cv::waitKey(30). Trong trường hợp này, không có gì xuất hiện trên màn hình, bởi vì highgui không bao giờ có thời gian để xử lý các yêu cầu rút thăm từ đó cv::imshow().


19

Đơn giản là cvWaitKey()ngủ trong X mili giây, chờ bất kỳ phím nào được nhấn.

int cvWaitKey(int X);

Nếu một phím được nhấn, hàm này trả về mã ASCII của phím. Hoặc trả về -1 nếu không có phím nào được nhấn trong thời gian đó.


3
Đó không phải là toàn bộ câu chuyện. Trong thực tế, ngay cả khi bạn không quan tâm đến việc nhập liệu bằng bàn phím, việc gọi hàm này có thể rất cần thiết đối với một số ứng dụng OpenCV. Có thêm một số thông tin ở đây .
Drew Noakes

13

cvWaitKey(0) dừng chương trình của bạn cho đến khi bạn nhấn một nút.

cvWaitKey(10)không dừng chương trình của bạn nhưng đánh thức và cảnh báo kết thúc chương trình của bạn khi bạn nhấn một nút. Nó được sử dụng thành vòng lặp vì cvWaitkeykhông dừng vòng lặp.

Sử dụng bình thường

char k;

k=cvWaitKey(0);

if(k == 'ESC')

với kbạn có thể xem phím nào đã được nhấn.


5
Cũng quan trọng hơn một chút - đó là vòng lặp thông báo openCV. Bạn sẽ không thấy bất kỳ dữ liệu mới trong một cvNamedWindow trừ khi bạn gọi cvWaitKey () trong vòng lặp
Martin Beckett

14
-1 từ tôi vì đã thực hiện phép so sánh char? = Multichar . Điều này chỉ là sai. Sử dụng ký tự có thể in được (trong trường hợp này là không thể vì ESC là ký tự không in được nhưng trong trường hợp ví dụ sử dụng phím Q, bạn có thể thực hiện so sánh? = 'Q') hoặc chọn một trong các biểu diễn số. ASCII hỗ trợ nhiều hệ thống số: thập lục phân (0x1b), thập phân (27) và bát phân (033). Tất cả được liệt kê đại diện cho khóa ESC.
rbaleksandar

1
nên là int không phải char, sau đó sử dụng bit ops
Vlad

@Vlad Có, nó phải là 27 như trong user1564486
FindOutIslamNow

9

. đối số của 0được hiểu làinfinite

. Để kéo các cửa sổ highGUI, bạn cần liên tục gọi cv::waitKey()hàm. ví dụ: đối với hình ảnh tĩnh:

cv::imshow("winname", img);

while(cv::waitKey(1) != 27); // 27 = ascii value of ESC


8

Lưu ý cho bất kỳ ai có thể gặp vấn đề với cvWaitKey( )chức năng này. Nếu bạn thấy rằng cvWaitKey(x)không chờ đợi gì cả, hãy đảm bảo rằng bạn thực sự có một cửa sổ đang mở (tức là cvNamedWindow(...)). Đặt cvNamedWindow(...)khai báo TRƯỚC bất kỳ cvWaitKey()lệnh gọi hàm nào .


Chào mừng bạn đến với SO, đó là một nơi tốt để đăng thông tin như bạn đã làm. Thông thường, khi bạn đăng một câu trả lời, nó phải mang lại thông tin mới cho câu hỏi, vì vậy nó không tạo ra bài đăng thừa. Đó là trường hợp cho bài viết của bạn. Nếu bạn có bình luận nhỏ hơn, bạn cũng có thể bình luận về câu hỏi sau này (khi bạn nhận được nhiều Đại diện hơn). Nếu bạn chưa đọc, tôi khuyên bạn nên xem Câu hỏi thường gặp: stackoverflow.com/faq . Lời chúc mừng
ForceMagic

5
/* Assuming this is a while loop -> e.g. video stream where img is obtained from say web camera.*/    
cvShowImage("Window",img);

/* A small interval of 10 milliseconds. This may be necessary to display the image correctly */
cvWaitKey(10);  

/* to wait until user feeds keyboard input replace with cvWaitKey(0); */

4

Đơn cvWaitKeygiản là cung cấp một cái gì đó của sự chậm trễ. Ví dụ:

char c = cvWaitKey(33);
if( c == 27 ) break;

Nó là một phần của mã của tôi, trong đó video được tải vào openCV và các khung hình được xuất ra. Các 33số trong các phương tiện mã sau 33ms, một khung mới sẽ được hiển thị. Do đó, đó là khoảng thời gian ngắn hoặc khoảng thời gian 33msgiữa mỗi khung hình được hiển thị trên màn hình. Hi vọng điêu nay co ich.


1

cvWaitKey(milliseconds) chỉ cần đợi mili giây được cung cấp dưới dạng tham số cho hành trình phím tiếp theo của bàn phím.

Mắt người không thể nhìn thấy vật chuyển động trong vòng chưa đầy 1/10 giây, vì vậy chúng tôi sử dụng điều này để giữ cùng một khung ảnh trên màn hình trong một thời gian. Ngay sau khi nhấn phím của bàn phím, thao tác tiếp theo sẽ được thực hiện.

Trong thời gian ngắn, cvWaitKey(milliseconds)hãy đợi phím bấm hoặc millisecondthời gian được cung cấp.


1
"Mắt người không thể nhìn thấy vật di chuyển trong vòng chưa đến 1/10 giây, vì vậy chúng tôi sử dụng điều này để giữ cùng một khung hình ảnh trên màn hình trong một khoảng thời gian. Ngay sau khi nhấn phím bàn phím, thao tác tiếp theo sẽ được thực hiện" điều này thực sự quan trọng đối với câu hỏi?
quantum

-1

đợi mili giây để kiểm tra xem phím có được nhấn hay không, nếu được nhấn trong khoảng thời gian đó, hãy trả về giá trị ascii của nó, nếu không nó vẫn là -1

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.