日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

转载:【opencv入门教程之六】创建Trackbar图片对比度、亮度值调整

發(fā)布時間:2025/3/13 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转载:【opencv入门教程之六】创建Trackbar图片对比度、亮度值调整 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【OpenCV入門教程之六】 創(chuàng)建Trackbar & 圖像對比度、亮度值調(diào)整

淺墨_毛星云 2014-03-18 21:43:18 103746 收藏 21 最后發(fā)布:2014-03-18 21:43:18首發(fā):2014-03-18 21:43:18 分類專欄: 【OpenCV】 【OpenCV】入門教程 文章標(biāo)簽: opencv vs2010 c++ 圖像處理 版權(quán)聲明:本文為博主原創(chuàng)文章,遵循CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。 本文鏈接:https://blog.csdn.net/zhmxy555/article/details/21479533 展開

本系列文章由@淺墨_毛星云 出品,轉(zhuǎn)載請注明出處。??

文章鏈接:?http://blog.csdn.net/poem_qianmo/article/details/21479533

作者:毛星云(淺墨)????郵箱:?happylifemxy@163.com?

寫作當(dāng)前博文時配套使用的OpenCV版本: 2.4.8


?

?

這篇文章中我們一起學(xué)習(xí)了如何在OpenCV中用createTrackbar函數(shù)創(chuàng)建和使用軌跡條,以及圖像對比度、亮度值的動態(tài)調(diào)整。

文章首先詳細(xì)講解了OpenCV2.0中的新版創(chuàng)建軌跡條的函數(shù)createTrackbar,并給上一個詳細(xì)注釋的示例。

然后講解圖像的對比度、亮度值調(diào)整的細(xì)節(jié),最后放出了一個利用createTrackbar函數(shù)創(chuàng)建軌跡條來輔助進行圖像對比度、亮度值調(diào)整的程序源碼。

依然是先放一張運行截圖:

?


好了,下面正式開始我們的講解。






一、OpenCV中軌跡條(Trackbar)的創(chuàng)建和使用

?




<1>創(chuàng)建軌跡條——createTrackbar函數(shù)詳解



createTrackbar這個函數(shù)我們以后會經(jīng)常用到,它創(chuàng)建一個可以調(diào)整數(shù)值的軌跡條,并將軌跡條附加到指定的窗口上,使用起來很方便。首先大家要記住,它往往會和一個回調(diào)函數(shù)配合起來使用。先看下他的函數(shù)原型:

?

  • C++: int createTrackbar(conststring& trackbarname, conststring& winname,
  • int* value, int count, TrackbarCallback onChange=0,void* userdata=0);
    • 第一個參數(shù),const string&類型的trackbarname,表示軌跡條的名字,用來代表我們創(chuàng)建的軌跡條。
    • 第二個參數(shù),const string&類型的winname,填窗口的名字,表示這個軌跡條會依附到哪個窗口上,即對應(yīng)namedWindow()創(chuàng)建窗口時填的某一個窗口名。
    • 第三個參數(shù),int* 類型的value,一個指向整型的指針,表示滑塊的位置。并且在創(chuàng)建時,滑塊的初始位置就是該變量當(dāng)前的值。
    • 第四個參數(shù),int類型的count,表示滑塊可以達(dá)到的最大位置的值。PS:滑塊最小的位置的值始終為0。
    • 第五個參數(shù),TrackbarCallback類型的onChange,首先注意他有默認(rèn)值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,他也有默認(rèn)值0。這個參數(shù)是用戶傳給回調(diào)函數(shù)的數(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ù)使用小示例:

    ?

    ? ? ?

  • //創(chuàng)建軌跡條
  • createTrackbar("對比度:", "【效果圖窗口】",&g_nContrastValue,
  • 300,ContrastAndBright );// g_nContrastValue為全局的整型變量,ContrastAndBright為回調(diào)函數(shù)的函數(shù)名(即指向函數(shù)地址的指針)


  • ?

    然給大家一個完整的使用示例。這是OpenCV官方的sample示例程序,一個演示了用軌跡條來控制輪廓檢測,輪廓填充的程序。淺墨將其修改、代碼簡潔化和詳細(xì)注釋,放出來供大家消化研習(xí)。稍后更新的博文會有關(guān)于輪廓檢測更詳細(xì)的講解。

    ?

  • //-----------------------------------【頭文件包含部分】---------------------------------------
  • // 描述:包含程序所依賴的頭文件
  • //----------------------------------------------------------------------------------------------
  • #include "opencv2/imgproc/imgproc.hpp"
  • #include "opencv2/highgui/highgui.hpp"
  • #include <iostream>
  • //-----------------------------------【命名空間聲明部分】---------------------------------------
  • // 描述:包含程序所使用的命名空間
  • //-----------------------------------------------------------------------------------------------
  • using namespace cv;
  • using namespace std;
  • //-----------------------------------【全局函數(shù)聲明部分】--------------------------------------
  • // 描述:全局函數(shù)聲明
  • //-----------------------------------------------------------------------------------------------
  • Mat img;
  • int threshval = 160; //軌跡條滑塊對應(yīng)的值,給初值160
  • //-----------------------------【on_trackbar( )函數(shù)】------------------------------------
  • // 描述:軌跡條的回調(diào)函數(shù)
  • //-----------------------------------------------------------------------------------------------
  • static void on_trackbar(int, void*)
  • {
  • Mat bw = threshval < 128 ? (img < threshval) : (img > threshval);
  • //定義點和向量
  • vector<vector<Point> > contours;
  • vector<Vec4i> hierarchy;
  • //查找輪廓
  • findContours( bw, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
  • //初始化dst
  • Mat dst = Mat::zeros(img.size(), CV_8UC3);
  • //開始處理
  • if( !contours.empty() && !hierarchy.empty() )
  • {
  • //遍歷所有頂層輪廓,隨機生成顏色值繪制給各連接組成部分
  • int idx = 0;
  • for( ; idx >= 0; idx = hierarchy[idx][0] )
  • {
  • Scalar color( (rand()&255), (rand()&255), (rand()&255) );
  • //繪制填充輪廓
  • drawContours( dst, contours, idx, color, CV_FILLED, 8, hierarchy );
  • }
  • }
  • //顯示窗口
  • imshow( "Connected Components", dst );
  • }
  • //-----------------------------------【main( )函數(shù)】--------------------------------------------
  • // 描述:控制臺應(yīng)用程序的入口函數(shù),我們的程序從這里開始
  • //-----------------------------------------------------------------------------------------------
  • int main( )
  • {
  • system("color 5F");
  • //載入圖片
  • img = imread("1.jpg", 0);
  • if( !img.data ) { printf("Oh,no,讀取img圖片文件錯誤~! \n"); return -1; }
  • //顯示原圖
  • namedWindow( "Image", 1 );
  • imshow( "Image", img );
  • //創(chuàng)建處理窗口
  • namedWindow( "Connected Components", 1 );
  • //創(chuàng)建軌跡條
  • createTrackbar( "Threshold", "Connected Components", &threshval, 255, on_trackbar );
  • on_trackbar(threshval, 0);//軌跡條回調(diào)函數(shù)
  • waitKey(0);
  • return 0;
  • }

  • 原圖:


    運行效果圖:



    拖動滾動條,改變threshval(閾值)的值,得到效果迥異的圖片:





    想要下載這個程序源工程的童鞋請點擊這里:

    ?

    createTrackbarDemo【 淺墨優(yōu)化&詳細(xì)注釋版】下載

    ?


    另外,在OpenCV路徑opencv_source_code/samples/cpp/connected_components.cpp下,可以找到原版的官方代碼。

    ?

    接著順便講一個配合createTrackbar使用的函數(shù),用于獲取當(dāng)前軌跡條的位置的getTrackbarPos函數(shù)吧。

    ?




    <2>獲取當(dāng)前軌跡條的位置——getTrackbarPos函數(shù)



    這個函數(shù)用于獲取當(dāng)前軌跡條的位置并返回。

    ?

    C++: int getTrackbarPos(conststring& trackbarname, conststring& winname);

    • 第一個參數(shù),const string&類型的trackbarname,表示軌跡條的名字。
    • 第二個參數(shù),const string&類型的winname,表示軌跡條的父窗口的名稱。

    ?這部分大概就是這些了。馬不停蹄地向下一部分進發(fā)吧:)

    ?

    ?

    ?



    二、亮度和對比度調(diào)整的理論依據(jù)

    ?



    首先我們給出算子的概念。一般的圖像處理算子都是一個函數(shù),它接受一個或多個輸入圖像,并產(chǎn)生輸出圖像。下式給出了算子的一般形式:


    或者

    ?

    今天我們所講解的圖像亮度和對比度的調(diào)整操作,其實屬于圖像處理變換中比較簡單的一種——點操作(pointoperators)。點操作有一個特點,僅僅根據(jù)輸入像素值(有時可加上某些全局信息或參數(shù)),來計算相應(yīng)的輸出像素值。這類算子包括亮度(brightness)和對比度(contrast)調(diào)整,以及顏色校正(colorcorrection)和變換(transformations)。

    ?

    最兩種常用的點操作(或者說點算子),很顯然,是乘上一個常數(shù)(對應(yīng)對比度的調(diào)節(jié))以及加上一個常數(shù)(對應(yīng)亮度值的調(diào)節(jié))。用公式表示出來就是這樣:


    ?

    ?

    看到這個式子,我們關(guān)于圖像亮度和對比度調(diào)整的策略就呼之欲出了。


    其中:

    • 參數(shù)f(x)表示源圖像像素。
    • 參數(shù)g(x) 表示輸出圖像像素。
    • 參數(shù)a(需要滿足a>0)被稱為增益(gain),常常被用來控制圖像的對比度。
    • 參數(shù)b通常被稱為偏置(bias),常常被用來控制圖像的亮度。

    ?

    而更近一步,我們這樣改寫這個式子:


    其中,i 和 j 表示像素位于第i行 和 第j列 。

    那么,這個式子就可以用來作為我們在OpenCV中控制圖像的亮度和對比度的理論公式了。

    ?





    三、關(guān)于訪問圖片中的像素

    ?


    訪問圖片中的像素有很多種方式,以后有機會淺墨會用個專題來講解。目前我們可以先了解下面的這一種。

    ?

    而為了執(zhí)行 ?這個運算??,我們需要訪問圖像的每一個像素。因為是對GBR圖像進行運算,每個像素有三個值(G、B、R),所以我們必須分別訪問它們(PS:OpenCV中的圖像存儲模式為GBR)。以下是訪問像素的代碼片段,三個for循環(huán)解決問題:

    ?

  • //三個for循環(huán),執(zhí)行運算 new_image(i,j) =a*image(i,j) + b
  • for(int y = 0; y < image.rows; y++ )
  • {
  • for(int x = 0; x < image.cols; x++ )
  • {
  • for(int c = 0; c < 3; c++ )
  • {
  • new_image.at<Vec3b>(y,x)[c]= saturate_cast<uchar>( (g_nContrastValue*0.01)*(image.at<Vec3b>(y,x)[c] ) + g_nBrightValue );
  • }
  • }
  • }


  • 讓我們分三個方面進行講解:

    • 為了訪問圖像的每一個像素,我們使用這樣的語法: image.at<Vec3b>(y,x)[c]
      • 其中,y是像素所在的行, x是像素所在的列, c是R、G、B(對應(yīng)0、1、2)其中之一。
    • 因為我們的運算結(jié)果可能超出像素取值范圍(溢出),還可能是非整數(shù)(如果是浮點數(shù)的話),所以我們要用saturate_cast對結(jié)果進行轉(zhuǎn)換,以確保它為有效值。
    • 這里的a也就是對比度,一般為了觀察的效果,取值為0.0到3.0的浮點值,但是我們的軌跡條一般取值都會整數(shù),所以在這里我們可以,將其代表對比度值的nContrastValue參數(shù)設(shè)為0到300之間的整型,在最后的式子中乘以一個0.01,這樣就可以完成軌跡條中300個不同取值的變化。所以在式子中,我們會看到saturate_cast<uchar>( (g_nContrastValue*0.01)*(image.at<Vec3b>(y,x)[c] ) + g_nBrightValue )中的g_nContrastValue*0.01。





    四、圖像對比度、亮度值調(diào)整示例程序





    依然是每篇文章都會配給大家的一個詳細(xì)注釋的博文配套示例程序,把這篇文章中介紹的知識點以代碼為載體,展現(xiàn)給大家。

    這個示例程序用兩個軌跡條分別控制對比度和亮度值,有一定的可玩性。廢話不多說,上代碼吧:

    ?

  • //-----------------------------------【程序說明】----------------------------------------------
  • // 程序名稱::【OpenCV入門教程之四】 創(chuàng)建Trackbar&圖像對比度、亮度值調(diào)整 配套博文源碼
  • // VS2010版 OpenCV版本:2.4.8
  • // 2014年3月18 日 Create by 淺墨
  • //------------------------------------------------------------------------------------------------
  • //-----------------------------------【頭文件包含部分】---------------------------------------
  • // 描述:包含程序所依賴的頭文件
  • //----------------------------------------------------------------------------------------------
  • #include <opencv2/core/core.hpp>
  • #include<opencv2/highgui/highgui.hpp>
  • #include"opencv2/imgproc/imgproc.hpp"
  • #include <iostream>
  • //-----------------------------------【命名空間聲明部分】---------------------------------------
  • // 描述:包含程序所使用的命名空間
  • //-----------------------------------------------------------------------------------------------
  • using namespace std;
  • using namespace cv;
  • //-----------------------------------【全局函數(shù)聲明部分】--------------------------------------
  • // 描述:全局函數(shù)聲明
  • //-----------------------------------------------------------------------------------------------
  • static void ContrastAndBright(int, void *);
  • //-----------------------------------【全局變量聲明部分】--------------------------------------
  • // 描述:全局變量聲明
  • //-----------------------------------------------------------------------------------------------
  • int g_nContrastValue; //對比度值
  • int g_nBrightValue; //亮度值
  • Mat g_srcImage,g_dstImage;
  • //-----------------------------------【main( )函數(shù)】--------------------------------------------
  • // 描述:控制臺應(yīng)用程序的入口函數(shù),我們的程序從這里開始
  • //-----------------------------------------------------------------------------------------------
  • int main( )
  • {
  • //改變控制臺前景色和背景色
  • system("color5F");
  • //讀入用戶提供的圖像
  • g_srcImage= imread( "pic1.jpg");
  • if(!g_srcImage.data ) { printf("Oh,no,讀取g_srcImage圖片錯誤~!\n"); return false; }
  • g_dstImage= Mat::zeros( g_srcImage.size(), g_srcImage.type() );
  • //設(shè)定對比度和亮度的初值
  • g_nContrastValue=80;
  • g_nBrightValue=80;
  • //創(chuàng)建窗口
  • namedWindow("【效果圖窗口】", 1);
  • //創(chuàng)建軌跡條
  • createTrackbar("對比度:", "【效果圖窗口】",&g_nContrastValue,300,ContrastAndBright );
  • createTrackbar("亮 度:","【效果圖窗口】",&g_nBrightValue,200,ContrastAndBright );
  • //調(diào)用回調(diào)函數(shù)
  • ContrastAndBright(g_nContrastValue,0);
  • ContrastAndBright(g_nBrightValue,0);
  • //輸出一些幫助信息
  • cout<<endl<<"\t嗯。好了,請調(diào)整滾動條觀察圖像效果~\n\n"
  • <<"\t按下“q”鍵時,程序退出~!\n"
  • <<"\n\n\t\t\t\tby淺墨";
  • //按下“q”鍵時,程序退出
  • while(char(waitKey(1)) != 'q') {}
  • return0;
  • }
  • //-----------------------------【ContrastAndBright( )函數(shù)】------------------------------------
  • // 描述:改變圖像對比度和亮度值的回調(diào)函數(shù)
  • //-----------------------------------------------------------------------------------------------
  • static void ContrastAndBright(int, void *)
  • {
  • //創(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++ )
  • {
  • for(int x = 0; x < g_srcImage.cols; x++ )
  • {
  • for(int c = 0; c < 3; c++ )
  • {
  • g_dstImage.at<Vec3b>(y,x)[c]= saturate_cast<uchar>( (g_nContrastValue*0.01)*(g_srcImage.at<Vec3b>(y,x)[c] ) + g_nBrightValue );
  • }
  • }
  • }
  • //顯示圖像
  • imshow("【原始圖窗口】", g_srcImage);
  • imshow("【效果圖窗口】", g_dstImage);
  • }


  • 最后看一下運行截圖,運行這個程序會得到兩個圖片顯示窗口。第一個為原圖窗口,第二個為效果圖窗口。在效果圖窗口中可以調(diào)節(jié)兩個軌跡條,來改變當(dāng)前圖片的對比度和亮度。

    原圖:



    可調(diào)節(jié)的效果圖:







    本篇文章到這里就基本結(jié)束了,最后放出本篇文章配套示例程序的下載地址。



    本篇文章的配套源代碼請點擊這里下載:



    【淺墨OpenCV入門教程之六】配套源代碼下載



    OK,本節(jié)的內(nèi)容大概就是這些,我們下篇文章見:)


    總結(jié)

    以上是生活随笔為你收集整理的转载:【opencv入门教程之六】创建Trackbar图片对比度、亮度值调整的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 97超碰人人澡人人爱学生 | 欧美日韩激情网 | 亚洲欧美色图片 | 成年人午夜视频 | 一级片少妇 | 中文字幕第11页 | 国产成人无码精品久久 | 亚洲av无码一区二区二三区 | 91精品黄色| 精品久久BBBBB精品人妻 | 亚洲视频国产精品 | 亚洲免费看av | 日韩欧av | 久久久久亚洲av成人无码电影 | 性高潮久久久久久 | 人妻一区二区在线 | 三级黄色视屏 | 天天撸天天操 | 日本不卡高字幕在线2019 | 丰满岳妇伦在线播放 | 51国产在线 | 一区二区片 | 一级片毛片 | 国产精品成人一区二区网站软件 | 精品欧美一区二区久久久久 | 美女脱衣服一干二净 | 欧美日韩免费观看一区=区三区 | 日本www在线播放 | 精品一区日韩 | av中文在线观看 | 国产又粗又黄又爽视频 | 国产污视频在线观看 | 国产农村妇女精品久久久 | 最近免费中文字幕中文高清百度 | 亚洲欧美日韩一区二区三区在线观看 | 好吊妞视频在线观看 | 中文字幕一区二区久久人妻网站 | 国产日韩欧美视频在线 | 国产三级国产精品 | 成人片在线视频 | 麻豆网站在线播放 | 精品无码久久久久久国产 | 久久久久久国产精品视频 | 中国女人真人一级毛片 | 蜜桃av成人 | 91丝袜在线观看 | 老牛影视av牛牛影视av | 亚洲一区二区在线免费 | 懂色a v | 中文字幕永久免费 | 国产制服91一区二区三区制服 | 久色网 | 丰满岳跪趴高撅肥臀尤物在线观看 | 韩国精品视频在线观看 | 粉嫩av一区二区白浆 | 黑人巨大精品欧美一区二区蜜桃 | 老妇荒淫牲艳史 | 好吊一区二区三区视频 | 人人妻人人澡人人爽国产一区 | 一级做a爱片性色毛片 | 天天干天天插 | 亚洲第一色网站 | 免费黄色小视频在线观看 | 一本大道伊人av久久综合 | 亚洲第一成年人网站 | 伊人影院网 | 天堂а√在线中文在线新版 | 国产人久久人人人人爽 | 国产成人精品一区二区三区网站观看 | 国产精品免费精品一区 | 欧美日韩一区二区三区 | 欧美一级免费看 | 91porny丨首页入口在线 | 91av欧美 | 91视频社区 | 久久久国产亚洲 | 牛牛精品一区 | 97久久人澡人人添人人爽 | 国产原创在线 | 超91在线| 久久久噜噜噜 | 极品白嫩丰满少妇无套 | av福利站| 黄色一级片. | 午夜剧场免费在线观看 | 欧美激情视频一区二区三区不卡 | 色老板精品凹凸在线视频观看 | 婷婷五月精品中文字幕 | 国产色黄 | 午夜视频 | 亚洲免费观看高清完整 | 亚洲爱 | 女同av在线播放 | 中文字幕一二三四区 | 国产a线| 国产模特av私拍大尺度 | 欧美黑人又粗又大又爽免费 | 国产在线免费观看 | 国产精品av久久久久久无 |