Opencv2.4学习::ROI区域

 rect方法:

#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace std;
using namespace cv;
//全局下的原图像
Mat srcImage;
//rect方法
void regionExtraction(int xRoi, int yRoi,
	int widthRoi, int heightRoi)
{
	//创建ROI 
	Mat roiImage;
	//提取感兴趣区域
	srcImage(Rect(xRoi, yRoi, widthRoi, heightRoi)).copyTo(roiImage);
	imshow("set-roi", roiImage);
	waitKey(0);
}
int main()
{
	//加载原图像
	srcImage = imread("F:\\opencv_re_learn\\2.jpg");
	if (!srcImage.data){
		cout << "failed to read pic" << endl;
		system("pause");
		return -1;
	}
	//显示原图像
	imshow("ORI", srcImage);
	//取ROI 参数为:起点x,起点y,区域宽度,区域高度
	regionExtraction(0, 0, 200, 200);
}

鼠标选取方法:

#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace std;
using namespace cv;

Mat srcImage;//全局下的原图像
Rect roiRect;//选取矩形区
Point startPoint;//起点
Point endPoint;//终点
bool downFlag = false;//按下标志位
bool upFlag = false;//弹起标志位

//rect方法
void regionExtraction(int xRoi, int yRoi,
	int widthRoi, int heightRoi)
{
	//创建与原图像同大小的Mat
	Mat roiImage;// (srcImage.rows, srcImage.cols, CV_8UC3);
	//提取感兴趣区域
	srcImage(Rect(xRoi, yRoi, widthRoi, heightRoi)).copyTo(roiImage);
	imshow("set-roi", roiImage);
}
//鼠标事件回调方法
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 (endPoint.x > srcImage.cols)endPoint.x = srcImage.cols;
		if (endPoint.y > srcImage.cols)endPoint.y = srcImage.rows;
	}
	//显示区域?
	if (downFlag == true && upFlag == false){
		Point tempPoint;
		tempPoint.x = x;
		tempPoint.y = y;
		Mat tempImage = srcImage.clone();//取原图像复制
		//用矩形标记
		rectangle(tempImage, startPoint, tempPoint, Scalar(0, 0, 255), 2, 3, 0);
		imshow((char*)data, tempImage);
	}
	//按下选取完并弹起后
	if (downFlag == true && upFlag == true){
		//起点和终点不相同时,才提取区域
		if (startPoint.x != endPoint.x&&startPoint.y != endPoint.y){
			startPoint.x = min(startPoint.x, endPoint.x);
			startPoint.y = min(startPoint.y, endPoint.y);
			regionExtraction(startPoint.x, startPoint.y,
				abs(startPoint.x - endPoint.x),
				abs(startPoint.y - endPoint.y));
		}
		downFlag = false;
		upFlag = false;
	}
}
int main()
{
	//加载原图像
	srcImage = imread("F:\\opencv_re_learn\\2.jpg");
	if (!srcImage.data){
		cout << "failed to read pic" << endl;
		system("pause");
		return -1;
	}
	namedWindow("Mouse_select");//创建窗口
	imshow("Mouse_select", srcImage);
	//绑定回调函数到窗口
	setMouseCallback("Mouse_select", MouseEvent, "Mouse_select");
	waitKey(0);
}

效果展示:

 

猜你喜欢

转载自blog.csdn.net/dieju8330/article/details/82427823