【opencv学习笔记八】创建TrackBar轨迹条
生活随笔
收集整理的這篇文章主要介紹了
【opencv学习笔记八】创建TrackBar轨迹条
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
createTrackbar這個函數我們以后會經常用到,它創建一個可以調整數值的軌跡條,并將軌跡條附加到指定的窗口上,使用起來很方便。首先大家要記住,它往往會和一個回調函數配合起來使用。先看下他的函數原型:
int createTrackbar(const String& trackbarname, const String& winname,int* value, int count,TrackbarCallback onChange = 0,void* userdata = 0);- 第一個參數,const string&類型的trackbarname,表示軌跡條的名字,用來代表我們創建的軌跡條。
- 第二個參數,const string&類型的winname,填窗口的名字,表示這個軌跡條會依附到哪個窗口上,即對應namedWindow()創建窗口時填的某一個窗口名。
- 第三個參數,int* 類型的value,一個指向整型的指針,表示滑塊的位置。并且在創建時,滑塊的初始位置就是該變量當前的值。
- 第四個參數,int類型的count,表示滑塊可以達到的最大位置的值。PS:滑塊最小的位置的值始終為0。
- 第五個參數,TrackbarCallback類型的onChange,首先注意他有默認值0。這是一個指向回調函數的指針,每次滑塊位置改變時,這個函數都會進行回調。并且這個函數的原型必須為void XXXX(int,void*);其中第一個參數是軌跡條的位置,第二個參數是用戶數據(看下面的第六個參數)。如果回調是NULL指針,表示沒有回調函數的調用,僅第三個參數value有變化。
- 第六個參數,void*類型的userdata,他也有默認值0。這個參數是用戶傳給回調函數的數據,用來處理軌跡條事件。如果使用的第三個參數value實參是全局變量的話,完全可以不去管這個userdata參數。
?
這個createTrackbar函數,為我們創建一個具有特定名稱和范圍的軌跡條(Trackbar,或者說是滑塊范圍控制工具),指定一個和軌跡條位置同步的變量。而且要指定回調函數onChange(第五個參數),在軌跡條位置改變的時候來調用這個回調函數。并且我們知道,創建的軌跡條顯示在指定的winname(第二個參數)所代表的窗口上。
?
實例
?
下面給一個使用軌跡條改變圖像亮度的例子:
1 // opencv_bright.cpp: 定義控制臺應用程序的入口點。 2 // 3 4 //************頭文件包含************* 5 #include "stdafx.h" 6 #include<iostream> 7 #include<opencv.hpp>//包含opencv的頭文件 8 //*********************************** 9 10 11 //************命名空間*************** 12 using namespace cv;//使用opencv命名空間 13 using namespace std; 14 //*********************************** 15 16 17 //************全局變量*************** 18 Mat img_src;//定義一個輸入圖像變量 19 20 //*********************************** 21 22 23 //************全局函數*************** 24 static void image_brighttrackbar(int,void*);//trackbar回調函數用于改變圖像亮度 25 26 27 //*********************************** 28 29 30 //************主函數***************** 31 int main() 32 { 33 int key_number; 34 int bar_pos=100;//軌跡條位置值,也可以定義為全局變量 35 36 namedWindow("原圖", 0);//創建窗口 37 namedWindow("處理圖", 0);//創建窗口 38 39 img_src = imread("1.jpg");//讀取輸入圖像 40 if (!img_src.data) { printf("讀取圖片\"1.jpg\"錯誤!"); return -1; }//判斷是否讀取圖像成功 41 42 43 createTrackbar("亮度","處理圖" ,&bar_pos, 200, image_brighttrackbar);//創建軌跡條 44 image_brighttrackbar(bar_pos, 0);//調用軌跡條回調函數,函數功能是改變圖像亮度, 45 //這個函數當軌跡條事件觸發時會自動調用,不需要放到循環里,這里調用一次為了第一次顯示處理圖片,需不需要調用具體情況具體對待 46 47 48 while (1) 49 { 50 imshow("原圖", img_src);//顯示圖像 51 52 key_number = waitKey(0); 53 if (key_number == 27 || char(key_number) == 'q' || char(key_number) == 'Q')//按下Q鍵或者ESC鍵退出程序 54 break; 55 } 56 57 return 0; 58 } 59 60 61 //回調函數,使用指針訪問像素改變圖像亮度 62 void image_brighttrackbar(int bar_pos,void*) 63 { 64 65 Mat dst; 66 int channels = img_src.channels(); 67 dst = img_src.clone(); 68 69 for (int i = 0; i < dst.rows; i++) 70 { 71 uchar* p_data1 = img_src.ptr(i); 72 uchar* p_data2 = dst.ptr(i); 73 74 for (int k = 0; k < dst.cols*channels; k++) 75 { 76 p_data2[k] = saturate_cast<uchar>(p_data1[k] + bar_pos);//輸出圖像像素=原圖像像素+軌跡條當前位置 77 } 78 } 79 imshow("處理圖", dst);//顯示圖像 80 }?
運行結果:
?
下載
?
功能很簡單,代碼很少,建議自己寫一下或者在博文中復制一下,當然實在是懶的不要不要的土豪可以去下面的連接直接下載。附件的代碼文件關于image_brighttrackbar(bar_pos, 0);調用略有差異,博文中是優化過的。
?
【opencv學習筆記八】創建Trackbar軌跡條
?
?
?
?
?
?
轉載于:https://www.cnblogs.com/nicewe/p/8462023.html
總結
以上是生活随笔為你收集整理的【opencv学习笔记八】创建TrackBar轨迹条的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10 vs2010安装教程(超详细
- 下一篇: Java jdk7升级到jdk8