OpenCV 마우스 와 키보드 이벤트 처리

앞서 소개 한 직사 도 역방향 투영 알고리즘 은 인 코딩 과정 에서 이미지 조회 에서 관심 영역 을 설정 하여 템 플 릿 이미지 로 하고 직관 적 이 며 실현 방법 이 비교적 좌절 되 었 습 니 다. 그래서 OpenCV 에서 마우스 와 키보드 이 벤트 를 제어 하 는 방법 을 제 공 했 는 지 생각 했 습 니 다. 마우스 이 벤트 를 통 해 관심 영역 을 템 플 릿 이미지 로 임의로 선택 한 결과 인터넷 에서 검색 하 게 되 었 습 니 다.OpenCV 에서 역시 관련 인 터 페 이 스 를 제공 한 것 을 발 견 했 습 니 다. 그러나 인터넷 에서 제공 하 는 루틴 은 대부분이 C 언어 인 터 페 이 스 를 바탕 으로 하 는 것 입 니 다. 사용 하 는 이미지 용 기 는 비교적 빠 른 버 전의 IplImage 입 니 다. Mat 용기 에 대한 것 이 비교적 적 습 니 다. 그래서 코드 를 참고 하여 고 쳤 습 니 다. 마우스 이 벤트 를 통 해 화면 캡 처 기능 을 실 현 했 습 니 다.또한 키보드 이 벤트 를 통 해 관심 영역 을 이동 시 키 고 확대, 축소 작업 을 할 수 있 으 며 캡 처 한 이미 지 를 저장 할 수 있 습 니 다. 구체 적 으로 다음 과 같이 실현 할 수 있 습 니 다. 관심 이 있 는 학생 들 은 참고 하 시기 바 랍 니 다. 그러면 이전 블 로그 에서 제공 한 코드 를 간단하게 수정 하면 앞에서 말 한 기능 을 실현 할 수 있 습 니 다.
링크 는 다음 과 같 습 니 다.
OpenCV 의 그 레이스 케 일 직사 도 역방향 투영 (이미지 유사 성 검사):http://blog.csdn.net/forthcriminson/article/details/8543781
OpenCV 의 컬러 직사 도 역방향 투영 (이미지 유사 성 검사):http://blog.csdn.net/forthcriminson/article/details/8546945
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

#include <iostream>
#include <ctype.h>

using namespace cv;
using namespace std;

CvPoint pt1 = Point(0,0);
CvPoint pt2 = Point(0,0);
bool is_selecting = false;

void cvMouseCallback(int mouseEvent,int x,int y,int flags,void* param)
{
	switch(mouseEvent)
	{
	case CV_EVENT_LBUTTONDOWN:
		pt1 = Point(x,y);
		pt2 = Point(x,y);
		is_selecting = true;
		break;
	case CV_EVENT_MOUSEMOVE:
		if(is_selecting)
			pt2 = Point(x,y);
		break;
	case CV_EVENT_LBUTTONUP:
		pt2 = Point(x,y);
		is_selecting = false;
		break;
	}
	return;
}

int main(int argc,char* argv[])
{
	char* window = "img";
	Mat img = imread("D:\\1.jpg",1);  
	Mat img_show,roi; 
	img.copyTo(img_show);
	namedWindow(window,CV_WINDOW_AUTOSIZE);
	setMouseCallback(window,cvMouseCallback);
	bool shift_on = false;
	while(true)
	{
		img.copyTo(img_show);
		rectangle(img_show,pt1,pt2,Scalar(255,255,255));
		imshow(window,img_show);
		char key = cvWaitKey(10);
		switch(key)
		{
		//ROI    
                case '\t':
			shift_on = !shift_on; break;
		case 'a':
			pt1.x--; pt2.x--; break;
		case 's':
			pt1.y++; pt2.y++; break;
		case 'd':
			pt1.x++; pt2.x++; break;
		case 'w':
			pt1.y--; pt2.y--; break;
		
               //ROI     ,         ROI           
		case '1':
			if(shift_on) pt1.x--; 
			else pt2.x--;
			break;
		case '2':
			if(shift_on) pt2.y++; 
			else pt1.y++;
			break;
		case '3':
			if(shift_on) pt2.x++;
			else pt1.x++;
			break;
		case '4':
			if(shift_on) pt1.y--;
			else pt2.y--;
			break;

		//      ROI     ,       
		case '\r':
			roi=img(Rect(pt1.x,pt1.y,std::abs(pt2.x-pt1.x),std::abs(pt2.y-pt1.y)));
			imwrite("D:\\ROI.jpg",roi);
			break;
		};

		if(key==27) break;
	}
	return 0;
}

좋은 웹페이지 즐겨찾기