OpenCV中提供了程序界面中的鼠標和鍵盤事件ios
// 設置鼠標回調函數函數
void setMouseCallbackui
(spa
const string& winname,指針
MouseCallback onMouse,blog
void* userdata = 0事件
)圖片
// 被調用的函數指針回調函數
void Funstring
(
int event,
int x,
int y,
int flags,
void* param)
#define CV_EVENT_MOUSEMOVE 0--滑動
#define CV_EVENT_LBUTTONDOWN 1--左鍵點擊
#define CV_EVENT_RBUTTONDOWN 2--右鍵點擊
#define CV_EVENT_MBUTTONDOWN 3--中鍵點擊
#define CV_EVENT_LBUTTONUP 4--左鍵放開
#define CV_EVENT_RBUTTONUP 5--右鍵放開
#define CV_EVENT_MBUTTONUP 6--中鍵放開
#define CV_EVENT_LBUTTONDBLCLK 7--左鍵雙擊
#define CV_EVENT_RBUTTONDBLCLK 8--右鍵雙擊
#define CV_EVENT_MBUTTONDBLCLK 9--中鍵雙擊
#define CV_EVENT_FLAG_LBUTTON 1--左鍵拖曳
#define CV_EVENT_FLAG_RBUTTON 2--右鍵拖曳
#define CV_EVENT_FLAG_MBUTTON 4-中鍵拖曳
#define CV_EVENT_FLAG_CTRLKEY 8~15--按Ctrl鍵不放事件
#define CV_EVENT_FLAG_SHIFTKEY 16~31--按Shift鍵不放事件
#define CV_EVENT_FLAG_ALTKEY 32~39--按Alt鍵不放事件
//鼠標點擊事件 #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> #include <stdio.h> //全局變量 cv::Mat srcImage; void MouseEvent(int event, int x, int y, int flags, void* data) { char charText[30]; cv::Mat tempImage, hsvImage; tempImage = srcImage.clone(); // // 左鍵按下移動顯示RGB信息 // if (event == CV_EVENT_LBUTTONDOWN) { cv::Vec3b p = tempImage.at<cv::Vec3b>(y,x); sprintf(charText, "R = %d, G = %d, B = %d", p[2], p[1], p[0]); // 寫RGB信息文本到圖像 cv::putText(tempImage, charText, cv::Point(8,20), cv::FONT_HERSHEY_COMPLEX, 2, CV_RGB(0,0,255)); imwrite("c.jpg",tempImage); } // // 右鍵按下移動顯示HSV信息 // else if (event == CV_EVENT_RBUTTONDOWN) { // 轉換成HSV圖像 cv::cvtColor(tempImage, hsvImage, CV_BGR2HSV); cv::Vec3b p = hsvImage.at<cv::Vec3b>(y,x); // 獲取相應的通道值 sprintf(charText, "H = %d, S = %d, V = %d", p[0], p[1], p[2]); // 寫HSV文本信息到圖像 cv::putText(tempImage, charText, cv::Point(8,20), cv::FONT_HERSHEY_PLAIN, 2, CV_RGB(0,255,0)); imwrite("d.jpg",tempImage); } // // 沒有按下鍵顯示對應座標 // else { // 移動鼠標顯示座標 sprintf(charText, "x = %d, y = %d", x, y); // 寫X Y座標文本信息到圖像 cv::putText(tempImage, charText, cv::Point(8,20), cv::FONT_HERSHEY_PLAIN, 2, CV_RGB(255,0,0)); imwrite("e.jpg",tempImage); } } int main(int argc, char** argv) { // 讀取圖像及判斷是否正確讀入 srcImage = cv::imread("a.jpg"); if (srcImage.empty()) return -1; // 回調事件響應 cv::namedWindow("srcImage"); cv::setMouseCallback("srcImage", MouseEvent, 0); cv::imshow("srcImage", srcImage); cv::waitKey(0); return 0; }
OpenCV提供滑動條函數createTrackbar(),當拖動滑塊移動鼠標時觸發滑動事件
// 滑動條二值化 #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <iostream> //createTrackbar的回調響應函數 void onChangeTrackBar(int pos, void* data) { // 強制類型轉換 cv::Mat srcImage = *(cv::Mat*)(data); cv::Mat dstImage; // 根據滑動條的值進行二值化 cv::threshold(srcImage, dstImage, pos, 255, 0); cv::imshow("dyn_threshold", dstImage); } int main() { // 源圖像載入及判斷 cv::Mat srcImage = cv::imread("a.jpg"); if (!srcImage.data) return -1; //轉換爲灰度圖像 cv::Mat srcGray; cv::cvtColor(srcImage, srcGray, CV_RGB2GRAY); cv::namedWindow("dyn_threshold"); cv::imshow("dyn_threshold", srcGray); //建立滑動條createTrackbar,調用回調函數 createTrackbar("pos", "dyn_threshold", 0, 255, onChangeTrackBar, &srcGray); cv::waitKey(0); return 0; }
從整個圖像中提取出興趣區域ROI,經過Rect設置相應的感興趣矩形區域,再用copyTo進行圖像賦值
#include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> // 全局變量源圖像 cv::Mat srcImage; // 方法1:利用Rect選擇區域(100, 180, 150, 50) void regionExtraction(int xRoi, int yRoi, int widthRoi, int heightRoi) { // 提取指定座標區域 cv::Mat roiImage(srcImage.rows, srcImage.cols, CV_8UC3); std::cout << srcImage.rows << " " << srcImage.cols << std::endl; // 將興趣區域複製到目標圖像 srcImage(cv::Rect(xRoi, yRoi, widthRoi, heightRoi)).copyTo(roiImage); cv::imshow("roiImage", roiImage); cv::waitKey(0); } int main() { // 源圖像載入及判斷 srcImage = cv::imread("a.jpg"); if (!srcImage.data) return -1; cv::imshow("ROIing", srcImage); // 方法1:利用Rect選擇區域(100,180,150,50) int xRoi = 100; int yRoi = 180; int widthRoi = 150; int heightRoi = 50; regionExtraction(xRoi, yRoi, widthRoi, heightRoi); cv::waitKey(0); return 0; }
#include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> #include <stdio.h> using namespace cv; using namespace std; //全局變量 cv::Mat srcImage; //所選矩形區域 cv::Rect roiRect; //起始點 cv::Point startPoint; //終止點 cv::Point endPoint; //完成所選區域標誌位 bool downFlag = false; bool upFlag = false; void MouseEvent(int event, int x, int y, int flags, void* data) { // 鼠標左鍵按下 獲取起始點 if (event == EVENT_LBUTTONDOWN) { downFlag = true; startPoint.x = x; startPoint.y = y; } // 鼠標拖到鬆開 獲取終止點 if (event == EVENT_LBUTTONUP) { upFlag = true; endPoint.x = x; endPoint.y = y; } // 顯示拖到圖像區域 if (downFlag == true && upFlag == false) { Point tempPoint; tempPoint.x = x; tempPoint.y = y; // 用於顯示圖像生成 cv::Mat tempImage = srcImage.clone(); cv::rectangle(tempImage, startPoint, tempPoint, Scalar(255,0,0), 2, 3, 0); cv::imshow("ROIing", tempImage); } // 選擇區域生成 if (downFlag == true && upFlag == true) { // 獲取選擇區域的ROI roiRect.width = abs(startPoint.x - endPoint.x); roiRect.height = abs(startPoint.y - endPoint.y); roiRect.x = min(startPoint.x, endPoint.x); roiRect.y = min(startPoint.y, endPoint.y); cv::Mat roiMat(srcImage, roiRect); imshow("ROI", roiMat); downFlag = false; upFlag = false; } cv::waitKey(0); } int main(int argc, char** argv) { // 讀取圖像及判斷是否正確讀入 srcImage = cv::imread("a.jpg"); if (srcImage.empty()) return -1; // 回調事件響應 cv::namedWindow("ROIing"); cv::imshow("ROIing", srcImage); cv::setMouseCallback("ROIing", MouseEvent, 0); cv::waitKey(0); return 0; }