1、創建圖像窗口滑動條
OpenCV 4中通過createTrackbar()函數在顯示圖像的窗口上創建滑動條。
int cv::createTrackbar(const String &trackbarname,const String &winname, int *value, int count, TrackbarCallback onChange = 0, void *userdata = 0
);
trackbarname:滑動條的名稱
winname:創建滑動條窗口的名稱
value:指向整數變量的指針,該指針指向的值反映滑塊的位置,創建后,滑塊位置由此變量定義
count:滑動條的最大取值
onChange:每次滑塊更改位置時要調用的函數的指針。該函數應該原型為void Foo(int,void *);,其中第一個參數是軌跡欄位置,第二個參數是用戶數據。如果回調是NULL指針,則不會調用任何回調,只更新數值
userdata:傳遞給回調函數的可選參數
示例代碼
// myCreateTrackbar在圖像中創建滑條改變圖像亮度
#include <opencv2/opencv.hpp>
#include <iostream>using namespace std;
using namespace cv;// 為了能在被調函數中使用,所以設置成全局的
int value;
void callBack(int, void*); // 滑動條回調函數
Mat img1, img2;int main()
{img1 = imread("lena.png");if (!img1.data){cout << "請確認是否輸入正確的圖像文件" << endl;return -1;}namedWindow("滑動條改變圖像亮度");imshow("滑動條改變圖像亮度", img1);value = 100; // 滑動條創建時的初值// 創建滑動條createTrackbar("亮度值百分比", "滑動條改變圖像亮度", &value, 600, callBack, 0);waitKey();
}static void callBack(int, void*)
{float a = value / 100.0;img2 = img1 * a;imshow("滑動條改變圖像亮度", img2);
}
2、鼠標響應
// setMouseCallback()函數原型
void?cv::setMouseCallback(const?String & winname,MouseCallback onMouse,
void?* userdata = 0);
winname:添加鼠標響應的窗口的名字
onMouse:鼠標響應的回調函數
userdata:傳遞給回調函數的可選參數
// MouseCallback類型的回調函數
typedef void(* cv::MouseCallback)(int event, int x, int y, int flags, void *userdata
);
event:鼠標響應事件標志,參數為EVENT_*形式,具體可選參數及含義在表1給出
x:鼠標指針在圖像坐標系中的x坐標
y:鼠標指針在圖像坐標系中的y坐標
flags:鼠標響應標志,參數為EVENT_FLAG_*形式,具體可選參數及含義在表2給出
userdata:傳遞給回調函數的可選參數
標志參數 | 簡記 | 含義 |
EVENT_MOUSEMOVE | 0 | 表示鼠標指針在窗口上移動 |
EVENT_LBUTTONDOWN | 1 | 表示按下鼠標左鍵 |
EVENT_RBUTTONDOWN | 2 | 表示按下鼠標右鍵 |
EVENT_MBUTTONDOWN | 3 | 表示按下鼠標中鍵 |
EVENT_LBUTTONUP | 4 | 表示釋放鼠標左鍵 |
EVENT_RBUTTONUP | 5 | 表示釋放鼠標右鍵 |
EVENT_MBUTTONUP | 6 | 表示釋放鼠標中鍵 |
EVENT_LBUTTONDBLCLK | 7 | 表示雙擊鼠標左鍵 |
EVENT_RBUTTONDBLCLK | 8 | 表示雙擊鼠標右鍵 |
EVENT_MBUTTONDBLCLK | 9 | 表示雙擊鼠標中間 |
EVENT_MOUSEWHEEL | 10 | 正值表示向前滾動,負值表示向后滾動 |
EVENT_MOUSEHWHEEL | 11 | 正值表示向左滾動,負值表示向右滾動 |
標志參數 | 簡記 | 含義 |
EVENT_FLAG_LBUTTON | 1 | 按住左鍵拖拽 |
VENT_FLAG_RBUTTON | 2 | 按住右鍵拖拽 |
EVENT_FLAG_MBUTTON | 4 | 按住中鍵拖拽 |
EVENT_FLAG_CTRLKEY | 8 | 按下CTRL鍵 |
EVENT_FLAG_SHIFTKEY | 16 | 按下SHIFT鍵 |
EVENT_FLAG_ALTKEY | 32 | 按下ALT鍵 |
示例代碼
// 繪制鼠標的移動軌跡
#include <opencv2/opencv.hpp>
#include <iostream>using namespace std;
using namespace cv;Mat img, imgPoint; // 全局的圖像
Point prePoint; // 前一時刻鼠標的坐標,用于繪制直線
void mouse(int event, int x, int y, int flags, void*);int main()
{img = imread("lena.png");if (!img.data){cout << "請確認輸入圖像名稱是否正確!" << endl;return -1;}img.copyTo(imgPoint);imshow("圖像窗口1", img);imshow("圖像窗口2", imgPoint);setMouseCallback("圖像窗口1", mouse, 0); // 鼠標影響waitKey(0);return 0;
}void mouse(int event, int x, int y, int flags, void*)
{if (event == EVENT_RBUTTONDOWN) // 單擊右鍵{cout << "點擊鼠標左鍵才可以繪制軌跡" << endl;}if (event == EVENT_LBUTTONDOWN) // 單擊左鍵,輸出坐標{prePoint = Point(x, y);cout << "軌跡起使坐標" << prePoint << endl;}if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON)) // 鼠標按住左鍵移動{// 通過改變圖像像素顯示鼠標移動軌跡imgPoint.at<Vec3b>(y, x) = Vec3b(0, 0, 255);imgPoint.at<Vec3b>(y, x-1) = Vec3b(0, 0, 255);imgPoint.at<Vec3b>(y, x+1) = Vec3b(0, 0, 255);imgPoint.at<Vec3b>(y+1, x) = Vec3b(0, 0, 255);imgPoint.at<Vec3b>(y+1, x) = Vec3b(0, 0, 255);imshow("圖像窗口2", imgPoint);// 通過繪制直線顯示鼠標移動軌跡Point pt(x, y);line(img, prePoint, pt, Scalar(0, 0, 255), 2, 5, 0);prePoint = pt;imshow("圖像窗口1",