[opencv]鼠标和键盘的回调方法

在做行人检测时,我利用帧差法和hog+svm方法扣出了行人的大致图像,但其中有部分图像扣得不太好,或者人重叠在一块。下面实现了一个代码,通过逐一读取文件夹中的图像,利用鼠标进行截图,并保存到指定的文件夹内。下面是我实现的代码,主要是利用了鼠标和键盘的回调方法。

#include"head.h"
#include<string.h>
/*
	该程序是读取需要修改(截取)图像的文件夹,逐一读取图像,并利用鼠标进行截图
*/

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

void _screenshoot(char* strData, char *destData) {
	vector<string> files;	//存储的是当前文件夹下所有的文件名
	_getFiles(strData, files);
	Mat strcImg, destImg;
	string strPath, destPath;
	int num = 0;
	char* windowName = "img";
	bool exitFlag = false;//控制程序离开的标志位
	namedWindow(windowName, CV_WINDOW_AUTOSIZE);
	Mat imgShoot;
	bool shift_on = false;
	Mat roi;
	while ((num< files.size()) && !exitFlag) {
		strPath.assign(strData).append("\\").append(files[num]);
		strcImg = imread(strPath);		//读取的每幅图像
		Mat imgShoot;	//裁剪的图像
		strcImg.copyTo(imgShoot);
		setMouseCallback(windowName, cvMouseCallback);
		strcImg.copyTo(imgShoot);
		rectangle(imgShoot, pt1, pt2, Scalar(255, 255, 255));
		imshow(windowName, imgShoot);
		char key = cvWaitKey(10);
		switch (key) {
		case'\t':
			shift_on = !shift_on; break;
		//W、A、S、D是控制向上下左右移动的
		case'A':case 'a':			
			pt1.x--; pt2.x--; break;
		case'S':case 's':
			pt1.y++; pt2.y++; break;
		case'D':case 'd':
			pt1.x++; pt2.x++; break;
		case'W':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 = strcImg(Rect(pt1.x, pt1.y, std::abs(pt2.x - pt1.x), std::abs(pt2.y - pt1.y)));
			//确定输出的路径
			destPath.assign(destData).append("\\").append("In_").append(files[num]);
			imwrite(destPath, roi);
			cout << "已保存图像: " << destPath << endl;
			++num;
			cvDestroyWindow(windowName);
			pt1 = Point(0, 0);
			pt2 = Point(0, 0);
			break;
		case'N':case 'n':	//下一幅图像
			++num;
			pt1 = Point(0, 0);
			pt2 = Point(0, 0);
			cvDestroyWindow(windowName);
			break;
		case'E':case'e':	//离开程序
			cvDestroyWindow(windowName);
			exitFlag = true;
			break;

		}//switch
	}//while
	
	//*/
	cout << "There is no images" << endl;
}

注意:上面是核心代码,并不完全,主函数的话就是单纯地写入原来图像的路径和打算放入图像的路径。_getFiles函数实现的是读取指定路径下的所有文件

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值