2012-02-17 30 views
7

Làm cách nào để kiểm tra xem cửa sổ opencv đã bị đóng chưa?Cách kiểm tra xem cửa sổ opencv có bị đóng không

Tôi muốn làm:

cvNamedWindow("main", 1); 

while(!cvWindowIsClosed("main")) 
{ 
    cvShowImage("main", myImage); 
} 

nhưng không cvWindowIsClosed (...) chức năng như vậy!

+0

Không bao giờ cần một cái gì đó như thế trong nhiều năm. Bạn đang cố gắng để làm chính xác? Hầu hết có thể có một số cách khác để đạt được những gì bạn đang tìm kiếm. – karlphillip

+0

@karlphillip Tôi đang tìm cách hiển thị khung hình mới cho đến khi người dùng đóng cửa sổ. – Steve

Trả lời

7

Những gì bạn đang cố gắng làm có thể đạt được với cvGetWindowHandle():

Chức năng cvGetWindowHandle trả về cửa sổ xử lý bản địa (HWND trong trường hợp của Win32 và GtkWidget trong trường hợp của GTK +). [Qt Backend Only] Các chi tiết cụ thể về qt: Hàm cvGetWindowHandle trả về xử lý cửa sổ gốc kế thừa từ lớp QWidget Qt.

Ý tưởng là nhận được tay cầm của cửa sổ và sau đó sử dụng các chức năng API nền tảng cụ thể để kiểm tra xem trình xử lý đó vẫn hợp lệ.

EDIT:

Hoặc bạn có thể sử dụng tradicional cvWaitKey() cách tiếp cận:

char exit_key_press = 0; 
while (exit_key_press != 'q') // or key != ESC 
{ 
    // retrieve frame 

    // display frame 

    exit_key_press = cvWaitKey(10); 
} 
+0

@Steve Đã cập nhật câu trả lời. – karlphillip

2

Giả sử bạn chỉ có một cửa sổ hình ảnh mở, sau đó nhấp vào nút 'x' ở góc của nó làm cho waitkey() hàm trả về giá trị -1. Sau đó kiểm tra xem hàm cvGetWindowHandle ("name_of_the_window") có trả về 0 hay không. Nếu nó trả về 0, thì cửa sổ thực sự bị đóng. Tôi đã thử nghiệm nó trong OpenCV3. Nhưng tôi vẫn không rõ ràng về lý do tại sao waitkey() trả về -. Tôi sẽ đánh giá cao nếu có ai giải thích tại sao điều này xảy ra. [Tôi không biết câu trả lời của tôi cho câu hỏi này có liên quan hay không sau một thời gian dài như vậy. Nhưng hy vọng nếu có ai khác bị mắc kẹt với cùng một vấn đề (như tôi), câu trả lời này có thể giúp họ.] Cảm ơn.

1

này nên làm

#include <opencv2/opencv.hpp> 

std::string mTitle = "title of my window"; 

while (cvGetWindowHandle(mTitle.c_str())) 
{ 
    // ... 
} 
0

Bạn có thể sử dụng phương pháp cv :: getWindowProperty.

Làm như thế:

cv::namedWindow("main", WINDOW_AUTOSIZE); 

while(1) 
{ 
    cv::imshow("main", myImage); 

    // add this IF. 
    if (cv::getWindowProperty("main", WND_PROP_AUTOSIZE) == -1) 
     break; 
} 

Khi cửa sổ được đóng getWindowProperty sẽ trở về -1.

Các vấn đề liên quan