天天看點

OpenCV3學習(2.3)——圖像讀取與滑鼠截圖

滑鼠截圖

在圖上做标記時,opencv主要用setMouseCallback()這個函數,下面來講解:

一、setMouseCallback()

 void setMousecallback(const string& winname, MouseCallback onMouse, void* userdata=0)
           

 winname:視窗的名字;userdate:傳給回調函數的參數;

 onMouse:滑鼠響應函數,回調函數。指定視窗裡每次滑鼠事件發生的時候,被調用的函數指針。 這個函數的原型為:

void on_Mouse(int event, int x, int y, int flags, void* param);
           

event是 CV_EVENT_*變量之一

x和y是滑鼠指針在圖像坐标系的坐标(不是視窗坐标系) 

flags是CV_EVENT_FLAG的組合, param是使用者定義的傳遞到setMouseCallback函數調用的參數。

//常用的event:
#define CV_EVENT_MOUSEMOVE//移動
#define CV_EVENT_LBUTTONDOWN //左鍵按下
#define CV_EVENT_RBUTTONDOWN   //右鍵按下
#define CV_EVENT_LBUTTONUP    //左鍵擡起
#define CV_EVENT_RBUTTONUP   //右鍵擡起
           

 例程:

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace std;
using namespace cv; //不需要每次都輸入 cv::

Mat ROI; Point pt;//滑鼠截取圖像的一部分
bool flag = false;
Mat img = imread("121.jpg");
Mat img_copy = img.clone();//clone 是完全的深拷貝,在記憶體中申請新的空間,與A獨立
void onMouse(int event, int x, int y, int flag, void*) {

	switch (event)
	{
	case CV_EVENT_LBUTTONDOWN://左鍵按下
		flag = true;
		pt.x = x;
		pt.y = y;
		break;
	case CV_EVENT_MOUSEMOVE://滑鼠移動
		if (flag) { //隻有在點選滑鼠左鍵的情況下移動滑鼠才執行
		img_copy.copyTo(img);
		//以便永遠隻有一個矩形(否則許多矩形會重疊在一起),清除之前在img圖像上,滑鼠移動産生的矩形框,隻保留最終的一個矩形框
		rectangle(img, pt, Point(x, y), Scalar(255, 0, 0), 2, 8);//定義一個矩形框,pt表示起始點(按下左鍵時的滑鼠左标);Point表示實時變化的坐标點;顔色;線寬;線型
		}
		break;
	case CV_EVENT_LBUTTONUP://左鍵擡起
		flag = false;
		ROI = img_copy(Rect(pt.x, pt.y, x - pt.x, y - pt.y));//x,y,寬,高
		imshow("ROI", ROI);
		//imwrite("filename",ROI);
		break;
		default:
		break;
	}
}
void main(){
	namedWindow("mouse", CV_WINDOW_AUTOSIZE);
	setMouseCallback("mouse", onMouse, 0);  //每次滑鼠放在圖中區域,就會觸發onMouse函數
	while (1) {
		imshow("mouse", img);
		if (27 == waitKey(20))//按ESC鍵退出(esc鍵對應的ascall碼是27)
		break;
	}
}
           

結果: 

OpenCV3學習(2.3)——圖像讀取與滑鼠截圖

 from:https://www.cnblogs.com/little-monkey/p/7197115.html