1. 程式人生 > >OpenCV滑鼠框選區域 --源程式

OpenCV滑鼠框選區域 --源程式

                          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);

	}

}

 

希望對你有幫助。