2016年12月13日 星期二

Opencv c++ GUI Trackbar

Trackbar來做影像黑白圖(二值圖)的實作,在這裡,全彩圖要轉成黑白圖就必須要先轉成灰階圖,變成灰階圖之後就必須要設定一個門檻值才能轉成黑白圖,這邊則是用Trackbar來做動態門檻值的校調.


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

void * WindowHandle1;

char FileName[]="rain.jpg";
char TrackbarName[]="Threshold";

int TrackbarInitValue=180;
int TrackbarStopValue=255;

IplImage *Image1;
IplImage *Image2;
CvSize Image2Size;

int main()
{
char FileName[]="rain.jpg";
IplImage *Image;
Image = cvLoadImage(FileName,CV_LOAD_IMAGE_GRAYSCALE); // 讀取影像,轉換為灰階
cvThreshold(Image,Image,128,255,CV_THRESH_BINARY); // 將灰階值在128以上設為255,以下則設為0
cvShowImage("Image",Image);
cvWaitKey(0);
cvDestroyWindow("Image");
cvReleaseImage(&Image);
return 0;

}


跟前一篇程式碼比起來,這邊多創造了IplImage資料結構的Image2及一個CvSize資料結構的Image2Size,然後初始化Image2Size的大小為Image1的寬跟高,再用cvCreateImage()初始化Image2的圖形空間,這邊給Image2,8位元1個通道非負整數空間,也就是開了一個非負整數0~255的二維陣列,設立一個新的視窗,加上了cvCreateTrackbar()的函式,而使用cvCreateTrackbar()必須要給予Trackbar一個事件,事件的命名可以自由的取名字,這裡給它的事件名稱是void onTrackbar(int postion),預設Trackbar的位置在180,最大拉軸長度是255,用cvGetTrackbarPos()查看拉軸位置,再用cvSetTrackbarPos()重新定位拉軸位置為177,接著,在onTrackbar()中放入了cvThreshold()演算法函式,再用cvSohwImage()顯示二值化的結果.要注意的是,設定事件名稱的時候最好也符合命名規則,增加可讀性,在這邊OpenCV可寫的事件比一般GUI介面還少很多,如果有瞭解過GUI的事件(Event),大概就曉得為啥要這樣設計.
接著逐一介紹各副程式的功能,從"highgui.h"的開始:

cvCreateTrackbar()
創立一個Trackbar在目標視窗上,起始值從0開始,而Trackbar指標開始的位置跟Trackbar最大值要自己設定,再給他一個可控制的事件名稱,此Trackbar事件可自由命名,但是務必要讓他輸入一個int型別的變數如:void xxx(int position).
cvCreateTrackbar("Trackbar名稱","目標視窗名稱",指標開始數值,Trackbar最大值,Trackbar事件副程式名稱);

cvGetTrackbarPos()
檢視Trackbar的位置,需要給它Trackbar的名稱,目標視窗名稱.
int cvGetTrackbarPos("Trackbar名稱","目標視窗名稱");

cvSetTrackbarPos()
重新設定Trackbar的位置,需要給它Trackbar的名稱,目標視窗名稱.
cvGetTrackbarPos("Trackbar名稱","目標視窗名稱",新的拉軸位置數據);

接下來都非highgui.h的函式

cvSize()
初始化CvSize資料結構,放置長跟寬的整數值
CvSize cvSize(寬的數值,高的數值);

cvCreateImage()
初始化IplImage資料結構,創造一個空白的圖片基本的格式,格式內容可參考命名規則,再給他通道數(二維陣列的數目).
cvCreateImage(CvSize資料結構,IPL_DEPTH_系列參數,通道數);

onTrackbar()
自行定義名稱,主要是接收拉軸移動後的數值,此數值做為二值化的門檻值,通常拉軸移動的數值都是做為各個演算法的門檻值之用.
void onTrackbar(拉軸移動整數值);

cvThreshold()
此為演算法功能之ㄧ,跟門檻值相關的演算法蒐集的副程式,第一個引數為輸入圖,第二個引數為計算結果的圖,再來是門檻最大值,二值化門檻值參數.
cvThreshold(原始圖形IplImage資料結構,計算後結果IplImage資料結構,門檻值,最大門檻值數值,CV_THRESH_BINARY);

 Reference:


沒有留言:

張貼留言