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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV鼠标事件和滑动条事件

發布時間:2024/7/23 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV鼠标事件和滑动条事件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鼠標事件

① 鼠標事件是通過傳統的回調函數機制來完成。

void your_mouse_callback(int event, int x, int y, int flags, void* param)

其中,第一個參數要指明事件,第二個和第三個參數是鼠標事件的位置,第四個參數是標志位,第五個參數是一個void類型的指針,可用于傳遞額外的信息。

鼠標事件類型事件數值含義
cv::EVENT_MOUSEMOVE0鼠標移動事件
cv::EVENT_LBUTTONDOWN1鼠標左鍵按下事件
cv::EVENT_RBUTTONDOWN2鼠標右鍵按下事件
cv::EVENT_MBUTTONDOWN3鼠標中鍵按下事件
cv::EVENT_LBUTTONUP4鼠標左鍵釋放事件
cv::EVENT_RBUTTONUP5鼠標右鍵釋放事件
cv::EVENT_MBUTTONUP6鼠標中鍵釋放事件
cv::EVENT_LBUTTONBLCLK7鼠標左鍵雙擊事件
cv::EVENT_RBUTTONBLCLK8鼠標右鍵雙擊事件
cv::EVENT_MBUTTONBLCLK9鼠標中鍵雙擊事件
cv::EVENT_MOUSEWHEEL10滑動滾輪上下滾動
cv::EVENT_MOUSEHWHEEL11滑動滾輪左右滾動

?

鼠標事件標志標志數值含義
cv::EVENT_FlAG_LBUTTON1指示鼠標左鍵已關閉。
cv::EVENT_FlAG_RBUTTON2指示鼠標右鍵已關閉。
cv::EVENT_FlAG_MBUTTON4指示鼠標中鍵已關閉。
cv::EVENT_FlAG_CTRLKEY8指示CTRL鍵被按下。
cv::EVENT_FlAG_SHIFTKEY16指示SHIFT鍵被按下。
cv::EVENT_FlAG_ALTKEY32指示ALT鍵被按下。

② 在定義完回調函數后需要注冊該回調函數。

void cv::setMouseCallback(const string& windowName, cv::MouseCallback on_mouse, void* param=NULL)

其中,第一個參數是回調函數作用的窗口名稱,第二個參數是要注冊的回調函數,第三個是要給回調函數傳遞的特定信息。

#include "stdafx.h" #include <opencv2/opencv.hpp>// 定義回調函數 void my_mouse_callback(int event, int x, int y, int flags, void* param);cv::Rect box; bool drawing_box = false;// 在圖像上畫一個方框的子程序 void draw_box(cv::Mat& img, cv::Rect box) {cv::rectangle(img, box.tl(), box.br(), cv::Scalar(0x00, 0x00, 0xff)); }void help() {std::cout << "Call: ./ch4_ex4_1\n" << "show how to use a mouse to draw regions in an image." << std::endl; }int main() {help();box = cv::Rect(-1, -1, 0, 0);cv::Mat image(200, 200, CV_8UC3);cv::Mat temp;image.copyTo(temp);box = cv::Rect(-1, -1, 0, 0);image = cv::Scalar::all(0);cv::namedWindow("Box Example");// 注冊回調函數cv::setMouseCallback("Box Example", my_mouse_callback, (void*)&image);for (;;){image.copyTo(temp);if (drawing_box){draw_box(temp, box);}cv::imshow("Box Example", temp);if (cv::waitKey(15) == 27){break;}}cv::destroyWindow("Box Example");return 0; }void my_mouse_callback(int event, int x, int y, int flags, void* param) {cv::Mat& image = *(cv::Mat*) param;switch (event) {// 鼠標移動時間,實現左鍵按下時隨鼠標位置改變實時繪圖case cv::EVENT_MOUSEMOVE: {if (drawing_box){ box.width = x - box.x;box.height = y - box.y;}}break;// 鼠標左鍵按下時間,定起點case cv::EVENT_LBUTTONDOWN: {drawing_box = true;box = cv::Rect(x, y, 0, 0);}break;// 鼠標左鍵釋放事件,繪制圖像case cv::EVENT_LBUTTONUP: {drawing_box = false;if (box.width < 0){box.x += box.width;box.width *= -1;}if (box.height < 0){box.y += box.height;box.height *= -1;}draw_box(image, box);}break;} }

?運行結果:

滑動條、滾動條和開關

① 創建一個滑動條

int cv::createTrackbar(const string& trackbarName, const string& windowName, int* value, int count, cv::TrackbarCallback onChange, void* param)

其中:第一個參數是滑動條名稱,第二個參函數是將要添加到的父窗口的名稱,第三個參數是指向整數的指針,這個整數值會隨著滑動鈕的移動自動變化,第四個參數是滑動條可以滑動的最大值,第五個參數是回調函數,最后一個參數是傳給回調函數的參數。

② 可獲取或設置滑動條的位置值

int cv::getTrackbarPos(const string& trackbarName, const string& windowName)

void cv::setTrackbarPos(const string& trackbarName, const string& windowName, int pos)

③ 開關功能

開關是只有兩個位置的滾動條,當它處于“開”狀態的時候為1, 處于“關”狀態的時候為0。

#include "stdafx.h" #include <opencv2/opencv.hpp> #include <iostream>using namespace std;int g_switch_value = 1; void switch_off_function() {cout << "Pause\n"; }void switch_on_function(){cout << "run\n"; }void switch_callback(int position, void*) {if (position == 0){switch_off_function();}else{switch_on_function();} }void help() {cout << "Call: my.avi" << endl;cout << "Shows putting a pause button in a video." << endl; } // 使用滾動條來創建一個“開關”,用來控制視頻的播放功能 int main() {cv::Mat frame;cv::VideoCapture g_capture;g_capture.open("D:\\mgtv\\123.mp4");help();cv::namedWindow("example", 1);cv::createTrackbar("switch", "example", &g_switch_value, 1, switch_callback);for (;;){if (g_switch_value){g_capture >> frame;if (frame.empty()){break;}cv::imshow("example", frame);}if (cv::waitKey(10) == 27){break;}}cv::destroyWindow("example");return 0; }

?

總結

以上是生活随笔為你收集整理的OpenCV鼠标事件和滑动条事件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。