2016年12月13日 星期二

Opencv c++ GUI 開啟圖片

在這裡,要放的焦點就是"highgui.h"這個函式庫啦,"highgui.h"提供了許多基本的功能,實際上用起來也不麻煩,主要是簡單好用吧,但功能性沒有很強大,不比Visual C++的mfc及C++ Builder的vcl好用的多,如果真的需要強大的GUI功能,則就把OpenCV引入Visual C++及C++ Builder的函式庫吧.這邊所提供,OpenCV的GUI介面功能分為圖片(Image),視訊(Capture),視窗(Form),拉軸(TrackBar),滑鼠,鍵盤,AVI檔案的播放,有點少,不過夠用。


#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;

void * WindowHandle1;
char FileName[]="rain.jpg";
IplImage *Image1;

int main()
{
Image1 = cvLoadImage(FileName,CV_LOAD_IMAGE_UNCHANGED);
cvNamedWindow("Show Image",CV_WINDOW_AUTOSIZE);//set (windows name , parameter)
cvMoveWindow("Show Image",0,0);//windows display position (x,y)
WindowHandle1=cvGetWindowHandle("Show Image");
cout<<("The Window Handle is : %d\n",WindowHandle1)<<endl;
cout<<("The Window Name is : %s\n",cvGetWindowName(WindowHandle1))<<endl;
cvShowImage("Show Image",Image1);
cvWaitKey(0);
cvDestroyWindow("Show Image");
cvReleaseImage(&Image1);
}


這裡用了許多"highgui.h"現有的程式庫,如
cvLoadImage()
cvNamedWindow()
cvMoveWindow()
cvResizeWindow()
cvGetWindowHandle()
cvGetWindowName()
cvShowImage()
cvWaitKey()
cvDestroyWindow()
cvReleaseImage()
也可以說,除了IplImage及printf()其他都是"highgui.h"內建的函式庫,程式碼的一開始,就用(void *)型別建立了一個Window Handle的視窗ID變數,接著就對視窗作位移及縮放,再來拿到widow handle ID,再用handle ID去搜尋視窗字串名稱,顯視圖片,執行鍵盤事件,清空記憶體,這邊搜尋Window Handle的好處是,可以對視窗做一些基本的溝通。

cvLoadImage()
顧名思義,就是載入圖片的意思,它的使用方法為
IplImage* cvLoadImage("檔案名稱",參數);
參數的部份可以參考命名規則的說明,回傳的訊息是IplImage資料結構,它的參數分類有

#define CV_LOAD_IMAGE_UNCHANGED -1        原圖影像
#define CV_LOAD_IMAGE_GRAYSCALE 0             灰階
#define CV_LOAD_IMAGE_COLOR 1                    彩色
#define CV_LOAD_IMAGE_ANYDEPTH 2           任何彩度
#define CV_LOAD_IMAGE_ANYCOLOR 4           任何彩色

原始影像如果是灰階圖的話會因為檔案格式的關係而不可能變成彩色,但彩色圖片卻可以任意變成灰階,參數的部份可以用大寫英文或數字來替代.

cvNamedWindow()
這個副程式,是給視窗化介面命名的副程式,用法如下
cvNamedWindow("視窗名稱",參數);
而它的參數實質上只有一個

#define CV_WINDOW_AUTOSIZE 1            自動調整圖形大小

AUTOSIZE可以讓圖片便成原圖大小,也就是圖形維度不做調整,但是圖片太大很容易造成困擾,就如RainMan,維度為1200*1600,會造成圖片佔據了整個螢幕的版面.如果要微調就要用到cvResizeWindow()這個函式,但是,cvNamedWindow()不能設成1(CV_WINDOW_AUTOSIZE),務必將參數設為0或其他非1的數字.

cvMoveWindow()
移動GUI視窗到"螢幕座標"上的位置.當我們移動滑鼠時,實際上是在Windows作業系統底下的座標軸在變換,這個函式可以將做出來的GUI視窗以右上角為準移動到指定螢幕座標的地方.使用方法:
cvMoveWindow("視窗名稱",螢幕X軸數字,螢幕Y軸數字);

cvResizeWindow()
將視窗作縮放的動作,圖片將會等比例的變換,但cvNamedWindow()參數必須設為非1.
cvResizeWindow("視窗名稱",縮放寬度,縮放高度);

cvGetWindowHandle()
一個視窗所產生的ID,當我們創立一個視窗的時候,作業系統個隨機給予一個視窗ID,每次重新打開這個ID都會不一樣,可以把它視為純數字,不過,通常都是用(void *)資料型態來設立,這邊就是用視窗名稱來找視窗ID
cvGetWindowHandle("視窗名稱");

cvGetWindowName()
用ID來反查視窗名稱.
cvGetWindowName(視窗ID);

cvShowImage()
顯視圖片.
cvShowImage("視窗名稱",IplImage資料結構或CvArr資料結構);

cvWaitKey()
鍵盤事件,秀出圖形必備,這邊如果有開啟cvShowImage()的話,就必須要用到cvWaitKey(),而不能用"stdlib.h"裡的system("pause")取代,cvWaitKey()是專門在在OpenCV專用的GUI介面底下等待鍵盤命令的,而不是在黑白環境下的命令提示字元,鍵盤事件有兩種,阻斷式(block)的跟非阻斷式(unblock)的可以在作業系統原理的相關書籍讀到,阻斷式的就是cvWaitKey(0),它會一直等待到鍵盤事件發生為止,另一種就是在裡面輸入大於零的數字cvWaitKey(10),它將會等到10毫秒後自動輸出-1,代表10毫秒內沒接收到鍵盤敲擊事件,因此,典型的副程式表示法為
cvWaitKey(數字);

cvDestroyWindow()
清除視窗記憶體
cvDestroyWindow("視窗名稱')

cvReleaseImage()
清除IplImage圖形資料結構記憶體
cvReleaseImage(IplImage資料結構名稱)

Reference:

沒有留言:

張貼留言