OpenCV滑鼠框選區域 --源程式
阿新 • • 發佈:2018-11-11
OpenCV滑鼠框選區域 --源程式
滑鼠框選區域 模板1:
#include <imgproc/imgproc.hpp> #include <highgui/highgui.hpp> #include <core/core.hpp> #include <photo/photo.hpp> using namespace cv; Point ptL, ptR; //滑鼠畫出矩形框的起點和終點 Mat imageSource, imageSourceCopy; Mat ROI; //原圖需要修復區域的ROI void OnMouse(int event, int x, int y, int flag, void *ustg); //滑鼠回撥函式 int main() { imageSource = imread("Lena.jpg"); if (!imageSource.data) { return -1; } imshow("原圖", imageSource); setMouseCallback("原圖", OnMouse); waitKey(); } void OnMouse(int event, int x, int y, int flag, void *ustg) { if (event == CV_EVENT_LBUTTONDOWN) //可以根據滑鼠的起點 和 終點來確定矩形 { ptL = Point(x, y); //起點 ptR = Point(x, y); //終點 } if (flag == CV_EVENT_FLAG_LBUTTON) //畫矩形 { ptR = Point(x, y); //終點 imageSourceCopy = imageSource.clone(); rectangle(imageSourceCopy, ptL, ptR, Scalar(255, 0, 0)); imshow("原圖", imageSourceCopy); } if (event == CV_EVENT_LBUTTONUP) //畫矩形後,所做的事件 { if (ptL != ptR) { ROI = imageSource(Rect(ptL, ptR)); //使用者選擇後的圖片 imshow("ROI", ROI); //顯示 使用者選擇後的圖片 //提示 Rect(ptL, ptR) 為使用者選擇後,選區的大小 waitKey(); } } //單擊滑鼠右鍵 ,觸發的事件 if (event == CV_EVENT_RBUTTONDOWN) { //自定義事件 } }
舉個例子: 滑鼠圈定區域閾值處理+Mask膨脹處理
#include <imgproc/imgproc.hpp> #include <highgui/highgui.hpp> #include <core/core.hpp> #include <photo/photo.hpp> using namespace cv; Point ptL, ptR; //滑鼠畫出矩形框的起點和終點 Mat imageSource, imageSourceCopy; Mat ROI; //原圖需要修復區域的ROI //滑鼠回撥函式 void OnMouse(int event, int x, int y, int flag, void *ustg); //滑鼠圈定區域閾值處理+Mask膨脹處理 int main() { imageSource = imread("Test.jpg"); if (!imageSource.data) { return -1; } imshow("原圖", imageSource); setMouseCallback("原圖", OnMouse); waitKey(); } void OnMouse(int event, int x, int y, int flag, void *ustg) { if (event == CV_EVENT_LBUTTONDOWN) { ptL = Point(x, y); ptR = Point(x, y); } if (flag == CV_EVENT_FLAG_LBUTTON) { ptR = Point(x, y); imageSourceCopy = imageSource.clone(); rectangle(imageSourceCopy, ptL, ptR, Scalar(255, 0, 0)); imshow("原圖", imageSourceCopy); } if (event == CV_EVENT_LBUTTONUP) { if (ptL != ptR) { ROI = imageSource(Rect(ptL, ptR)); imshow("ROI", ROI); waitKey(); } } //單擊滑鼠右鍵開始影象修復 if (event == CV_EVENT_RBUTTONDOWN) { imageSourceCopy = ROI.clone(); Mat imageGray; cvtColor(ROI, imageGray, CV_RGB2GRAY); //轉換為灰度圖 Mat imageMask = Mat(ROI.size(), CV_8UC1, Scalar::all(0)); //通過閾值處理生成Mask threshold(imageGray, imageMask, 235, 255, CV_THRESH_BINARY); Mat Kernel = getStructuringElement(MORPH_RECT, Size(3, 3)); dilate(imageMask, imageMask, Kernel); //對Mask膨脹處理 inpaint(ROI, imageMask, ROI, 9, INPAINT_TELEA); //影象修復 imshow("Mask", imageMask); imshow("修復後", imageSource); } }
希望對你有幫助。