OpenCV2:幼兒園篇 第七章 界面事件

一.簡介

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

)

  • event

    #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--中鍵雙擊

  • flags

    #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鍵不放事件

(1)圖片信息

//鼠標點擊事件
 
#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;
}
  •  (2)滑動條

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;
 
}
  •  (3)固定區域提取

從整個圖像中提取出興趣區域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;
}

 

(4)鼠標提取區域

#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;
}

 

三.鍵盤事件

相關文章
相關標籤/搜索