使用滑動條原因:
滑動條控制引數的改變,呼叫回呼函式修改顯示的影像,更直觀的比對不同引數的變化
問題:
可是當建立多個滑動條的時候發現,修改并不同步,不同的滑動條修改時候并不會在已經修改的基礎上進行改變而是在原圖的基礎上修改,
為了方便理解下面多滑動條操作,以下是一些引數:
函式說明:
createTrackbar()函式的函式原型為:
CV_EXPORTS int createTrackbar(const String& trackbarname, const String& winname,int* value, int count,TrackbarCallback onChange = 0, void* userdata = 0);
第一個引數:滾動條名字;
第二個引數:要添加滑動條的視窗名字
第三個引數:*是滑動條的初始位置,同時也之后調整滑動條時傳入回呼函式的變數
第四個引數:滑動條的最大值;
第五個引數:所寫的回呼函式名字,默認為0
第六個引數:這個變數這個引數是用戶傳給回呼函式的資料,用來處理軌跡條事件,默認值為0,
在多個維度進行同步調整原理說明:
1、多個回呼函式合并在一個回呼函式里面,不同createTrackbar的回呼函式都為同一個回呼函式,這樣保證他們都在呼叫同一個函式,這樣修改就在同一圖片的基礎上修改了,
可以理解為,他們是同一個滑動條只是在不同的區域,
2、注意事項:操作圖片Mat 和不同createTrackbar對應的“value”必須是全域變數,
以上全是我個人通過實驗驗證過的,如果有什么不對的地方,歡迎大家評論區指出,最后附上一個測驗用代碼:
程式功能:
實作對D:/imagic/14.jpg這個圖片的對比度和亮度修改的兩個同步滑動條
#include<iostream>
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;
int lightness = 50;
int contrast_value = 100;
string name = "亮度與對比度調整";
Mat image;
//將輸入引數取消掉,這樣不同的回呼函式就可以合在一起了,調整的時候會自動修改createTrackbar對應的第三個帶&符號的引數
//注:必須兩個引數全部取消,并且定義image,和兩個改變的數為全域變數,
void contrast_lightness_value(int, void*)
{
Mat dst = Mat::zeros(image.size(), image.type());
Mat m = Mat::zeros(image.size(), image.type());//打醬油,湊引數位的
double contrast = contrast_value / 100.0; //除以一百降低,亮度增長幅度
addWeighted(image, contrast, m, 0.0, lightness, dst);
//公式:dst = image * contrast + m * 0.0 + lightness, contrast 是乘數遞增代表調整對比度,lightness單調遞增代表調整亮度,
imshow(name, dst);
}
int main()
{
image = imread("D:/imagic/14.jpg");
if (image.empty())
{
cout << "not load the image" << endl;
return -1;
}
namedWindow(name, WINDOW_FREERATIO);
createTrackbar("Value Bar", name, &lightness, 100, contrast_lightness_value, &image);
createTrackbar("Contrast Bar", name, &contrast_value, 200, contrast_lightness_value, &image);
contrast_lightness_value(0, NULL);
waitKey(0);
destroyAllWindows();
return 0;
}
本人也是學習opencv不久,如有錯誤,請各位前輩指導,大家如果覺得我的博客講解通俗易懂,可以進我博客看看奧,博客地址https://blog.csdn.net/qq_51116518 ,轉載請備注本地址,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294572.html
標籤:其他
上一篇:Opencv視覺處理(C++)語法學習(6)滑鼠操作與相應
下一篇:Opencv4日常學習任務和日歷
