cvNamedWindow是OpenCV庫中非常重要的一個函數,它是一個用於創建GUI窗口的函數,用於顯示圖像。本文將從多個方面對cvNamedWindow進行詳細的闡述,介紹cvNamedWindow的相關知識點以及使用方法。
一、cvNamedWindow的基本使用
cvNamedWindow的作用是,創建一個指定名稱的窗口,並在程序運行時顯示該窗口。下面是cvNamedWindow的基本使用方法:
int cvNamedWindow(const char* name, int flags=CV_WINDOW_AUTOSIZE)
其中,「name」表示窗口名稱,可以使用該名稱在程序中打開窗口。「flags」表示窗口屬性,指定窗口大小是否可調整。例如,如果將flags設為CV_WINDOW_AUTOSIZE,則窗口大小將自適應圖片大小(無法手動調整大小)。下面是一個簡單的示例:
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
Mat img = imread("example.jpg", IMREAD_COLOR);
if (img.empty()) {
return -1;
}
namedWindow("image", WINDOW_NORMAL);
imshow("image", img);
waitKey();
destroyWindow("image");
return 0;
}
在這個程序中,「img」是讀取的圖像,如果讀取失敗則返回-1。然後,我們調用cvNamedWindow創建一個名為「image」的窗口,並使用cvShowImage將該圖像顯示在該窗口中。最後,等待用戶按下鍵盤上的任何鍵,然後退出程序並銷毀窗口。
二、cvNamedWindow的屬性設置
除了上面提到的flags,cvNamedWindow還允許用戶設置多個窗口屬性。下面是一些常見屬性的設置方法:
窗口大小調整
上面提到的CV_WINDOW_AUTOSIZE屬性已經解釋過了。如果將flags設為CV_WINDOW_NORMAL,則可以手動調整窗口大小。如果需要在創建程序時設置窗口大小,則可以使用cvResizeWindow函數:
void cvResizeWindow(const char* name, int width, int height)
它會按照指定的寬度和高度調整窗口大小。下面是一個示例程序:
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
Mat img = imread("example.jpg", IMREAD_COLOR);
if (img.empty()) {
return -1;
}
namedWindow("image", WINDOW_NORMAL);
resizeWindow("image", 500, 500);
imshow("image", img);
waitKey();
destroyWindow("image");
return 0;
}
窗口位置調整
窗口位置可以通過cvMoveWindow函數調整:
void cvMoveWindow(const char* name, int x, int y)
它會將窗口移動到指定的x和y坐標。下面是一個示例程序:
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
Mat img = imread("example.jpg", IMREAD_COLOR);
if (img.empty()) {
return -1;
}
namedWindow("image", WINDOW_NORMAL);
moveWindow("image", 500, 100);
imshow("image", img);
waitKey();
destroyWindow("image");
return 0;
}
窗口最大化和最小化
cvNamedWindow還支持窗口最大化和最小化。要最大化窗口,可以調用cvSetWindowProperty函數:
void cvSetWindowProperty(const char* name, int prop_id, double prop_value);
其中,prop_id為CV_WND_PROP_FULLSCREEN,prop_value為CV_WINDOW_FULLSCREEN。要最小化窗口,可以調用cvSetWindowProperty函數:
void cvSetWindowProperty(const char* name, int prop_id, double prop_value);
其中,prop_id為CV_WND_PROP_AUTOSIZE,prop_value為CV_WINDOW_AUTOSIZE。下面是一個示例程序:
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
Mat img = imread("example.jpg", IMREAD_COLOR);
if (img.empty()) {
return -1;
}
namedWindow("image", WINDOW_NORMAL);
imshow("image", img);
waitKey(1000);
setWindowProperty("image", CV_WND_PROP_FULLSCREEN,CV_WINDOW_FULLSCREEN);
waitKey(1000);
setWindowProperty("image", CV_WND_PROP_AUTOSIZE, CV_WINDOW_AUTOSIZE);
waitKey(0);
destroyAllWindows();
return 0;
}
三、cvNamedWindow的注意點
cvNamedWindow有幾個需要注意的問題:
(1) OpenCV窗口不支持像素值小於0的情況
如果要將彩色圖像轉換為灰度圖像,則最好使用CV_WINDOW_NORMAL而不是CV_WINDOW_AUTOSIZE:
namedWindow("image", CV_WINDOW_NORMAL);
imshow("image", gray_img);
(2) 持續更新
在使用OpenCV的GUI時,建議在GUI被顯示在屏幕上時,持續更新圖像。按下鍵盤上的任意按鍵以關閉打開的窗口。
namedWindow("image", CV_WINDOW_NORMAL);
while (1) {
imshow("image", img);
if (waitKey(30) == 27) {
break;
}
}
(3) 僅使用一個窗口
始終嘗試在代碼中只使用一個窗口,以避免窗口疊加,降低代碼的速度和可讀性。
結語
cvNamedWindow是一種重要的GUI函數,常用於OpenCV庫中。它可以創建一個窗口並將圖像顯示在該窗口中。通過使用這些窗口屬性,開發人員可以更好地控制和管理窗口。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/182084.html