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);
}
效果展示: