六、創(chuàng)建trackbar圖像對比度、亮度值調(diào)整_第1頁
六、創(chuàng)建trackbar圖像對比度、亮度值調(diào)整_第2頁
六、創(chuàng)建trackbar圖像對比度、亮度值調(diào)整_第3頁
六、創(chuàng)建trackbar圖像對比度、亮度值調(diào)整_第4頁
六、創(chuàng)建trackbar圖像對比度、亮度值調(diào)整_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、 【OpenCV入門六】創(chuàng)建Trackbar &圖像對比度亮度值調(diào)整 這篇文章中我們一起學習了如何在OpenCV中用createTrackbar函數(shù)創(chuàng)建和使用軌跡條,以及圖像對比度、亮度值的動態(tài)調(diào)整。文章首先詳細講解了OpenCV2.0中的新版創(chuàng)建軌跡條的函數(shù)createTrackbar,并給上一個詳細注釋的示例。然后講解圖像的對比度、亮度值調(diào)整的細節(jié),最后放出了一個利用createTrackbar函數(shù)創(chuàng)建軌跡條來輔助進行圖像對比度、亮度值調(diào)整的程序源碼。好了,下面正式開始我們的講解。1、 OpenCV中軌跡條(Trackbar)的創(chuàng)建和使用 <1&

2、gt;創(chuàng)建軌跡條createTrackbar函數(shù)詳解createTrackbar這個函數(shù)我們以后會經(jīng)常用到,它創(chuàng)建一個可以調(diào)整數(shù)值的軌跡條,并將軌跡條附加到指定的窗口上,使用起來很方便。首先大家要記住,它往往會和一個回調(diào)函數(shù)配合起來使用。先看下他的函數(shù)原型:cpp view plain copy print?C+: int createTrackbar(conststring& trackbarname, conststring& winname,    int*

3、60;value, int count, TrackbarCallback onChange=0,void* userdata=0);  第一個參數(shù),const string&類型的trackbarname,表示軌跡條的名字,用來代表我們創(chuàng)建的軌跡條。第二個參數(shù),const string&類型的winname,填窗口的名字,表示這個軌跡條會依附到哪個窗口上,即對應namedWindow()創(chuàng)建窗口時填的某一個窗口名。第三個參數(shù),int* 類型的value,一個指向整型的指針,表示滑塊的位置。并且在創(chuàng)建時,滑塊

4、的初始位置就是該變量當前的值。第四個參數(shù),int類型的count,表示滑塊可以達到的最大位置的值。PS:滑塊最小的位置的值始終為0。第五個參數(shù),TrackbarCallback類型的onChange,首先注意他有默認值0。這是一個指向回調(diào)函數(shù)的指針,每次滑塊位置改變時,這個函數(shù)都會進行回調(diào)。并且這個函數(shù)的原型必須為void XXXX(int,void*);其中第一個參數(shù)是軌跡條的位置,第二個參數(shù)是用戶數(shù)據(jù)(看下面的第六個參數(shù))。如果回調(diào)是NULL指針,表示沒有回調(diào)函數(shù)的調(diào)用,僅第三個參數(shù)value有變化。第六個參數(shù),void*類型的userdata,他也有默認值0。這個參數(shù)是用戶傳給回調(diào)函數(shù)的

5、數(shù)據(jù),用來處理軌跡條事件。如果使用的第三個參數(shù)value實參是全局變量的話,完全可以不去管這個userdata參數(shù)。 這個createTrackbar函數(shù),為我們創(chuàng)建一個具有特定名稱和范圍的軌跡條(Trackbar,或者說是滑塊范圍控制工具),指定一個和軌跡條位置同步的變量。而且要指定回調(diào)函數(shù)onChange(第五個參數(shù)),在軌跡條位置改變的時候來調(diào)用這個回調(diào)函數(shù)。并且我們知道,創(chuàng)建的軌跡條顯示在指定的winname(第二個參數(shù))所代表的窗口上。 看完函數(shù)講解,先給大家一個函數(shù)使用小示例:  cpp view plain copy p

6、rint? /創(chuàng)建軌跡條    createTrackbar("對比度:", "【效果圖窗口】",&g_nContrastValue,  300,ContrastAndBright );/ g_nContrastValue為全局的整型變量,ContrastAndBright為回調(diào)函數(shù)的函數(shù)名(即指向函數(shù)地址的指針)   然給大家一個完整的使用示例。這是OpenCV官方的sample示例程序,一個演示了用軌跡條來控制輪廓檢測,輪廓

7、填充的程序。淺墨將其修改、代碼簡潔化和詳細注釋,放出來供大家消化研習。稍后更新的博文會有關于輪廓檢測更詳細的講解。 cpp view plain copy print?/-【頭文件包含部分】-  /  描述:包含程序所依賴的頭文件  /-   #include "opencv2/imgproc/imgproc.hpp"  #include "opencv2/highgui/highgui.hpp&

8、quot;  #include <iostream>    /-【命名空間聲明部分】-  /  描述:包含程序所使用的命名空間  /-     using namespace cv;  using namespace std;    /-【全局函數(shù)聲明部分】-  /  

9、;描述:全局函數(shù)聲明  /-  Mat img;  int threshval = 160;            /軌跡條滑塊對應的值,給初值160    /-【on_trackbar( )函數(shù)】-  /  描述:軌跡條的回調(diào)函數(shù)  /-  sta

10、tic void on_trackbar(int, void*)        Mat bw = threshval < 128 ? (img < threshval) : (img > threshval);        /定義點和向量  

11、;    vector<vector<Point> > contours;      vector<Vec4i> hierarchy;        /查找輪廓      findContours( bw, contours, hierarchy, CV

12、_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );      /初始化dst      Mat dst = Mat:zeros(img.size(), CV_8UC3);      /開始處理      if( !contours.empty() &am

13、p;& !hierarchy.empty() )                /遍歷所有頂層輪廓,隨機生成顏色值繪制給各連接組成部分          int idx = 0;        

14、0; for(  idx >= 0; idx = hierarchyidx0 )                        Scalar color( (rand()&255), (rand()&255),

15、0;(rand()&255) );              /繪制填充輪廓              drawContours( dst, contours, idx, color, CV_FILLED, 8, hierarchy

16、 );                      /顯示窗口      imshow( "Connected Components", dst );      /-【main( )

17、函數(shù)】-  /  描述:控制臺應用程序的入口函數(shù),我們的程序從這里開始  /-  int main(  )        system("color 5F");        /載入圖片      img = imrea

18、d("1.jpg", 0);      if( !img.data )  printf("Oh,no,讀取img圖片文件錯誤! n"); return -1;         /顯示原圖      namedWindow( "Image",

19、 1 );      imshow( "Image", img );        /創(chuàng)建處理窗口      namedWindow( "Connected Components", 1 );      /創(chuàng)建

20、軌跡條      createTrackbar( "Threshold", "Connected Components", &threshval, 255, on_trackbar );      on_trackbar(threshval, 0);/軌跡條回調(diào)函數(shù)       &

21、#160;waitKey(0);      return 0;    原圖:運行效果圖:拖動滾動條,改變threshval(閾值)的值,得到效果迥異的圖片:想要下載這個程序源工程的童鞋請點擊這里: createTrackbarDemo【 淺墨優(yōu)化&詳細注釋版】下載 另外,在OpenCV路徑opencv_source_code/samples/cpp/connected_components.cpp下,可以找到原版的官方代碼。接著順便講一個配合createTr

22、ackbar使用的函數(shù),用于獲取當前軌跡條的位置的getTrackbarPos函數(shù)吧。<2>獲取當前軌跡條的位置getTrackbarPos函數(shù)這個函數(shù)用于獲取當前軌跡條的位置并返回。cpp view plain copy print?C+: int getTrackbarPos(conststring& trackbarname, conststring& winname);  第一個參數(shù),const string&類型的trackbarname,表示軌跡條

23、的名字。第二個參數(shù),const string&類型的winname,表示軌跡條的父窗口的名稱。二、亮度和對比度調(diào)整的理論依據(jù)首先我們給出算子的概念。一般的圖像處理算子都是一個函數(shù),它接受一個或多個輸入圖像,并產(chǎn)生輸出圖像。下式給出了算子的一般形式:或者 今天我們所講解的圖像亮度和對比度的調(diào)整操作,其實屬于圖像處理變換中比較簡單的一種點操作(pointoperators)。點操作有一個特點,僅僅根據(jù)輸入像素值(有時可加上某些全局信息或參數(shù)),來計算相應的輸出像素值。這類算子包括亮度(brightness)和對比度(contrast)調(diào)整,以及顏色校正(colorcorrecti

24、on)和變換(transformations)。最兩種常用的點操作(或者說點算子),很顯然,是乘上一個常數(shù)(對應對比度的調(diào)節(jié))以及加上一個常數(shù)(對應亮度值的調(diào)節(jié))。用公式表示出來就是這樣: 看到這個式子,我們關于圖像亮度和對比度調(diào)整的策略就呼之欲出了。其中:參數(shù)f(x)表示源圖像像素。參數(shù)g(x) 表示輸出圖像像素。參數(shù)a(需要滿足a>0)被稱為增益(gain),常常被用來控制圖像的對比度。參數(shù)b通常被稱為偏置(bias),常常被用來控制圖像的亮度。而更近一步,我們這樣改寫這個式子:其中,i和j表示像素位于第i行和第j列 。那么,這個式子就可以用來作為我們在OpenCV中控制圖

25、像的亮度和對比度的理論公式了。 三、關于訪問圖片中的像素訪問圖片中的像素有很多種方式,以后有機會淺墨會用個專題來講解。目前我們可以先了解下面的這一種。而為了執(zhí)行  這個運算,我們需要訪問圖像的每一個像素。因為是對GBR圖像進行運算,每個像素有三個值(G、B、R),所以我們必須分別訪問它們(PS:OpenCV中的圖像存儲模式為GBR)。以下是訪問像素的代碼片段,三個for循環(huán)解決問題: cpp view plain copy print?/三個for循環(huán),執(zhí)行運算 new_image(i,j) =a*image(i,

26、j) + b  for(int y = 0; y < image.rows; y+ )           for(int x = 0; x < image.cols; x+ )        &#

27、160;                for(int c = 0; c < 3; c+ )                      

28、;                 new_image.at<Vec3b>(y,x)c= saturate_cast<uchar>( (g_nContrastValue*0.01)*(image.at<Vec3b>(y,x)c ) + g_nBrightValue );     &#

29、160;                       讓我們分三個方面進行講解:為了訪問圖像的每一個像素,我們使用這樣的語法: image.at<Vec3b>(y,x)c 其中,y是像素所在的行, x是像素所在的列, c是R、G、B(對應0、1、2)其中之一。因為我們的運算結果可能超出像素取值范圍(溢出),還可能是非整數(shù)(如果

30、是浮點數(shù)的話),所以我們要用saturate_cast對結果進行轉換,以確保它為有效值。這里的a也就是對比度,一般為了觀察的效果,取值為0.0到3.0的浮點值,但是我們的軌跡條一般取值都會整數(shù),所以在這里我們可以,將其代表對比度值的nContrastValue參數(shù)設為0到300之間的整型,在最后的式子中乘以一個0.01,這樣就可以完成軌跡條中300個不同取值的變化。所以在式子中,我們會看到saturate_cast<uchar>( (g_nContrastValue*0.01)*(image.at<Vec3b>(y,x)c ) + g_nBrightValue )中的g

31、_nContrastValue*0.01。四、圖像對比度、亮度值調(diào)整示例程序依然是每篇文章都會配給大家的一個詳細注釋的博文配套示例程序,把這篇文章中介紹的知識點以代碼為載體,展現(xiàn)給大家。這個示例程序用兩個軌跡條分別控制對比度和亮度值,有一定的可玩性。廢話不多說,上代碼吧:cpp view plain copy print?/-【程序說明】-  /  程序名稱::【OpenCV入門教程之四】 創(chuàng)建Trackbar&圖像對比度、亮度值調(diào)整 配套博文源碼  / VS2010

32、版  OpenCV版本:2.4.8  /  2014年3月18 日 Create by 淺墨  /-  /-【頭文件包含部分】-  /     描述:包含程序所依賴的頭文件  /-  #include <opencv2/core/core.hpp>  #include<opencv2/highgui/

33、highgui.hpp>  #include"opencv2/imgproc/imgproc.hpp"  #include <iostream>  /-【命名空間聲明部分】-  /     描述:包含程序所使用的命名空間  /-    using namespace std;  using namespace&

34、#160;cv;   /-【全局函數(shù)聲明部分】-  /     描述:全局函數(shù)聲明  /-  static void ContrastAndBright(int, void *);   /-【全局變量聲明部分】-  /     描述:全局變量聲明  /-  int g_

35、nContrastValue; /對比度值  int g_nBrightValue;  /亮度值  Mat g_srcImage,g_dstImage;  /-【main( )函數(shù)】-  /     描述:控制臺應用程序的入口函數(shù),我們的程序從這里開始  /-  int main(  )    &#

36、160;      /改變控制臺前景色和背景色         system("color5F");          /讀入用戶提供的圖像         g_srcImage= imread( "pic1.

37、jpg");                if(!g_srcImage.data )  printf("Oh,no,讀取g_srcImage圖片錯誤!n"); return false;          g_dstImage= Mat:zeros

38、( g_srcImage.size(), g_srcImage.type() );         /設定對比度和亮度的初值         g_nContrastValue=80;         g_nBrightValue=80;     &#

39、160;   /創(chuàng)建窗口         namedWindow("【效果圖窗口】", 1);         /創(chuàng)建軌跡條         createTrackbar("對比度:", "【效果圖窗口】",&g

40、_nContrastValue,300,ContrastAndBright );         createTrackbar("亮   度:","【效果圖窗口】",&g_nBrightValue,200,ContrastAndBright );              

41、;   /調(diào)用回調(diào)函數(shù)         ContrastAndBright(g_nContrastValue,0);         ContrastAndBright(g_nBrightValue,0);         /輸出一些幫助信息     

42、;    cout<<endl<<"t嗯。好了,請調(diào)整滾動條觀察圖像效果nn"                       <<"t按下“q”鍵時,程序退出!n"       

43、0;               <<"nnttttby淺墨"         /按下“q”鍵時,程序退出     while(char(waitKey(1) != 'q')     

44、0;    return0;     /-【ContrastAndBright( )函數(shù)】-  /     描述:改變圖像對比度和亮度值的回調(diào)函數(shù)  /-  static void ContrastAndBright(int, void *)         

45、  /創(chuàng)建窗口         namedWindow("【原始圖窗口】", 1);           /三個for循環(huán),執(zhí)行運算 g_dstImage(i,j) =a*g_srcImage(i,j) + b         for(int y = 0; y < g_srcImage.rows; y+ )                         

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論